随笔 - 60  文章 - 5  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(2)

随笔分类(42)

随笔档案(60)

文章档案(2)

我收藏的博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。 本文将详细讲解WSDL文档的结构,并分析每个元素的作用。
一:WSDL定义

    WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL XML模式的XML文档。WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。

   一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。文章的下一部分将会详细介绍WSDL 的基本结构。

二:WSDL的基本结构--概述

如第一部分最后描述的那样,一个基本的WSDL文档包含7个重要的元素。下面将分别介绍这几个元素以及他们的作用。

WSDL 文档在Web服务的定义中使用下列元素:

Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
Binding - 特定端口类型的具体协议和数据格式规范的绑定。
Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
Service- 相关服务访问点的集合。
  可以参考下图来理解一下WSDL的文档结构图:

WSDL的xml schema可以参照如下网址:http://schemas.xmlsoap.org/wsdl/

三:WSDL的基本结构--详述

本节将通过一个例子详细描述WSDL文档每个元素的作用。下面一个例子是一个简单的WSDL文档的内容,该文档的产生可以参见我的另外一篇文章:xfire开发实例--HelloWorld篇 。

一个简单的Web Service的WSDL文档,该服务支持名为sayHello的唯一操作,该操作通过在http上运行SOAP协议来实现的。该请求接受一个字符串name,经过处理后返回一个简单的字符串。文档如下:

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions
    targetNamespace="http://com.liuxiang.xfireDemo/HelloService"
    xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            attributeFormDefault="qualified" elementFormDefault="qualified"
            targetNamespace="http://com.liuxiang.xfireDemo/HelloService">
            <xsd:element name="sayHello">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="1" minOccurs="1"
                            name="name" nillable="true" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="sayHelloResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="1" minOccurs="1"
                            name="out" nillable="true" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="sayHelloResponse">
        <wsdl:part name="parameters" element="tns:sayHelloResponse" />
    </wsdl:message>
    <wsdl:message name="sayHelloRequest">
        <wsdl:part name="parameters" element="tns:sayHello" />
    </wsdl:message>
    <wsdl:portType name="HelloServicePortType">
        <wsdl:operation name="sayHello">
            <wsdl:input name="sayHelloRequest"
                message="tns:sayHelloRequest" />
            <wsdl:output name="sayHelloResponse"
                message="tns:sayHelloResponse" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="HelloServiceHttpBinding"
        type="tns:HelloServicePortType">
        <wsdlsoap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="sayHello">
            <wsdlsoap:operation soapAction="" />
            <wsdl:input name="sayHelloRequest">
                <wsdlsoap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="sayHelloResponse">
                <wsdlsoap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="HelloService">
        <wsdl:port name="HelloServiceHttpPort"
            binding="tns:HelloServiceHttpBinding">
            <wsdlsoap:address
                location="http://localhost:8080/xfire/services/HelloService" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
♦ types元素使用XML模式语言声明在WSDL文档中的其他位置使用的复杂数据类型与元素;

♦ import元素类似于XML模式文档中的import元素,用于从其他WSDL文档中导入WSDL定义;

♦ message元素使用在WSDL文档的type元素中定义或在import元素引用的外部WSDL文档中定义的XML模式的内置类型、复杂类型或元素描述了消息的有效负载;

♦ portType元素和operation元素描述了Web服务的接口并定义了他的方法。portType元素和operation元素类似于 java接口和接口中定义的方法声明。operation元素使用一个或者多个message类型来定义他的输入和输出的有效负载;

♦ Binding元素将portType元素和operation元素赋给一个特殊的协议和编码样式;

♦ service元素负责将Internet地址赋给一个具体的绑定;

1、definitions元素

所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档,同时通过其name提供了一个WSDL文档。除了提供一个命名空间外,该元素没有其他作用,故不作详细描述。

下面的代码是一个definitions元素的结构:

<wsdl:definitions
    targetNamespace="http://com.liuxiang.xfireDemo/HelloService"
    xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
</wsdl:definitions>
2、types元素

 WSDL采用了W3C XML模式内置类型作为其基本类型系统。types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。当声明消息部分的有效负载时,消息定义使用了在types元素中定义的数据类型和元素。在本文的WSDL文档中的types定义:

 

<wsdl:types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            attributeFormDefault="qualified" elementFormDefault="qualified"
            targetNamespace="http://com.liuxiang.xfireDemo/HelloService">
            <xsd:element name="sayHello">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="1" minOccurs="1"
                            name="name" nillable="true" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="sayHelloResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="1" minOccurs="1"
                            name="out" nillable="true" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </wsdl:types>
上面是数据定义部分,该部分定义了两个元素,一个是sayHello,一个是sayHelloResponse:

sayHello:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的参入传入部分;

sayHelloResponse:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的返回值;

3、import元素

import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。

import的格式如下:

<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" location="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
必须有namespace属性和location属性:

namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;

location属性:必须指向一个实际的WSDL文档,并且该文档不能为空。

4、message元素

message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载;还可以描述SOAP文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。在本文中的message元素的定义,本文档使用了采用文档样式的消息传递:

<wsdl:message name="sayHelloResponse">
        <wsdl:part name="parameters" element="tns:sayHelloResponse" />
    </wsdl:message>
    <wsdl:message name="sayHelloRequest">
        <wsdl:part name="parameters" element="tns:sayHello" />
    </wsdl:message>
该部分是消息格式的抽象定义:定义了两个消息sayHelloResponse和sayHelloRequest:

sayHelloRequest:sayHello操作的请求消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

sayHelloResponse:sayHello操作的响应消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

 如果采用RPC样式的消息传递,只需要将文档中的element元素应以修改为type即可。

5、portType元素

portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中, portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案以及 Internet地址。

一个portType中可以定义多个operation,一个operation可以看作是一个方法,本文中WSDL文档的定义:

    <wsdl:portType name="HelloServicePortType">
        <wsdl:operation name="sayHello">
            <wsdl:input name="sayHelloRequest"
                message="tns:sayHelloRequest" />
            <wsdl:output name="sayHelloResponse"
                message="tns:sayHelloResponse" />
        </wsdl:operation>
    </wsdl:portType>
portType定义了服务的调用模式的类型,这里包含一个操作sayHello方法,同时包含input和output表明该操作是一个请求/响应模式,请求消息是前面定义的sayHelloRequest,响应消息是前面定义的sayHelloResponse。input表示传递到Web服务的有效负载,output消息表示传递给客户的有效负载。

6、binding

binding元素将一个抽象portType映射到一组具体协议(SOAO和HTTP)、消息传递样式、编码样式。通常binding元素与协议专有的元素和在一起使用,本文中的例子:

    <wsdl:binding name="HelloServiceHttpBinding"
        type="tns:HelloServicePortType">
        <wsdlsoap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="sayHello">
            <wsdlsoap:operation soapAction="" />
            <wsdl:input name="sayHelloRequest">
                <wsdlsoap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="sayHelloResponse">
                <wsdlsoap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
这部分将服务访问点的抽象定义与SOAP HTTP绑定,描述如何通过SOAP/HTTP来访问按照前面描述的访问入口点类型部署的访问入口。其中规定了在具体SOAP调用时,应当使用的soapAction是""。

具体的使用需要参考特定协议定义的元素。

7、service元素和port元素

service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding,甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。文档中的例子:

    <wsdl:service name="HelloService">
        <wsdl:port name="HelloServiceHttpPort"
            binding="tns:HelloServiceHttpBinding">
            <wsdlsoap:address
                location="http://localhost:8080/xfire/services/HelloService" />
        </wsdl:port>
    </wsdl:service>
这部分是具体的Web服务的定义,在这个名为HelloService的Web服务中,提供了一个服务访问入口,访问地址是http://localhost:8080/xfire/services/HelloService,使用的消息模式是由前面的binding所定义的。

  本文简单介绍了WSDL规范的用途,基本结构和使用方法,希望对大家学习WSDL有帮助。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunchaohuang/archive/2008/10/14/3076375.aspx

posted @ 2009-11-05 12:24 黄剑父 阅读(371) | 评论 (0)编辑 收藏
如题
posted @ 2009-11-04 14:20 黄剑父 阅读(364) | 评论 (0)编辑 收藏

We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

 Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan

That is, while there is value in the items on the right, we value the items on the left more.

我们通过身体力行和帮助他人来揭示更好的软件开发方式。经由这项工作,我们形成了如下价值观:

 个体与交互 重于 过程和工具
可用的软件 重于 完备的文档
客户协作   重于 合同谈判
响应变化   重于 遵循计划

在每对比对中,后者并非全无价值,但我们更看重前者。

Kent Beck James Grenning Robert C. Martin
Mike Beedle Jim Highsmith Steve Mellor
Arie van Bennekum Andrew Hunt Ken Schwaber
Alistair Cockburn Ron Jeffries Jeff Sutherland
Ward Cunningham Jon Kern Dave Thomas
Martin Fowler Brian Marick
posted @ 2009-10-16 01:11 黄剑父 阅读(298) | 评论 (0)编辑 收藏

Principles behind the Agile Manifesto

We follow these principles:

我们遵循以下准则:

Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.

我们的最高目标是,通过尽早和持续地交付有价值的软件来满足客户。

Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.

欢迎对需求提出变更——即使是在项目开发后期。要善于利用需求变更,帮助客户获得竞争优势。

Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.

要不断交付可用的软件,周期从几周到几个月不等,且越短越好。

Business people and developers must work together daily throughout the project.

项目过程中,业务人员与开发人员必须在一起工作。

Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.

要善于激励项目人员,给他们以所需要的环境和支持,并相信他们能够完成任务。

The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.

无论是团队内还是团队间,最有效的沟通方法是面对面的交谈。

Working software is the primary measure of progress.

可用的软件是衡量进度的主要指标。

Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.

敏捷过程提倡可持续的开发。项目方、开发人员和用户应该能够保持恒久稳定的进展速度。

Continuous attention to technical excellence and good design enhances agility.

对技术的精益求精以及对设计的不断完善将提升敏捷性。

Simplicity--the art of maximizing the amount of work not done--is essential.

要做到简洁,即尽最大可能减少不必要的工作。这是一门艺术。

The best architectures, requirements, and designs emerge from self-organizing teams.

最佳的架构、需求和设计出自于自组织的团队。

At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.

团队要定期反省如何能够做到更有效,并相应地调整团队的行为。

posted @ 2009-10-16 01:10 黄剑父 阅读(198) | 评论 (0)编辑 收藏
今天偶然在公司看到一本书《精通windows sockets网络编程--基于Visual C++实现》。本人对于此类标着精通两个字的书名比较反感,但还是看了一下目录,看了一下目录觉得在编排上还比较是在,再翻了一章讲完成端口的看了下,觉得还比较实在,然后看了一下讲基础知识部分,虽然很多东西都是一笔带过,但在实践中遇到过的一些问题,确实还是讲到了。
比如说从容关闭,今天在做一个文件下载的服务器时就遇到此问题,不知道为什么最后的一些字节客户端接收不到,其实就是从容关闭的问题。
还有讲sockets套接字,到底是个什么东西时,也有讲到,但还是讲得简单了些,只是描述了一下,套接字,在tcp/ip中就是属于应用层与传输层的一个接口,概念上虽然说明了是个什么东西,但原理和如何做的又一点都未介绍,这个又让我有点失望。
今天也就看了下,没仔细看,今晚又把此书的代码从网站上down下来了,编译了一下完成端口那个程序,还行,能一次编译通过,说明作者不是在忽悠。
以后有时间还是有温习,系统的看看网络编程,此书不失为一本比较好的参考。
这也算是今天的收获吧。
posted @ 2009-10-13 22:14 黄剑父 阅读(1661) | 评论 (2)编辑 收藏
要减少软件中的错误数目,方法之一就是拥有一个专业的测试组,其工作就是尽一切可能使软件崩溃。不幸的是,如果拥有测试组,那么即使是经验丰富的开发人员,也会倾向于花费较少的时间来保证代码的可靠性。

    软件界有一句俗语:“开发人员不应该测试他们自己的代码”。这是因为开发人员对自己的代码了如指掌,他们很清楚如何采用适当的方法对代码进行测试。尽管这 句俗语很有道理,但却忽略了非常重要的一点 - 如果开发人员不对自己的代码进行测试,又如何知道代码能否按照预期的方式运行?

    简单说来,他们根本无从得知。开发人员编写那种运行不正常或只在某些情况下运行正常的代码是一个严重的问题。他们通常只测试代码能否在很少的情况下正常运行,而不是验证代码能够在所有情况下均正常运行。

    发现软件错误的情况有很多:

    1.由首次编写代码的开发人员发现。
    2.由尝试运行代码的开发人员发现。
    3.由组中的其他开发人员或测试人员发现。
    4.作为产品大规模测试的一部分。
    5.由最终用户发现。

    如果在第一种情况下发现软件错误,则修复错误比较容易,成本也很低。情况越靠后,修复软件错误的成本就越高;修复一个由最终用户发现的软件错误可能要耗费 100 或 1000 倍的成本。更不用说用户通常因为软件错误导致工作无法继续,而一直等到下一个版本才能解决问题。
    如果开发人员能够在编写代码期间发现所有的软件错误,那就再好不过了。为此,您必须编写能在编写代码时运行的测试。

    测试是软件开发的重要环节之一。按照软件开发的过程测试可分为:单元测试、功能测试、性能测试、性能测试、集成测试、系统测试、域测试(Field test)等。我们这里将主要研究的是面向程序员的单元测试。

    什么是单元测试 

    单元测试是开发者编写的一小段代码,用于检验被测代码中的一个很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特 定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。

    单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

    为什么要使用单元测试

    我们编写代码时,一定会反复调试保证它能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的客户。但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。

    幸运,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。

    单元测试有下面的这些优点:

    1、它是一种验证行为。

    程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。

    2、它是一种设计行为。

    编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。

    3、它是一种编写文档的行为。

    单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。

    4、它具有回归性。

    自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

    单元测试的范畴 

    如果要给单元测试定义一个明确的范畴,指出哪些功能是属于单元测试,这似乎很难。但下面讨论的四个问题,基本上可以说明单元测试的范畴,单元测试所要做的工作。

    1、 它的行为和我期望的一致吗?

    这是单元测试最根本的目的,我们就是用单元测试的代码来证明它所做的就是我们所期望的。
 
    2、 它的行为一直和我期望的一致吗?

    编写单元测试,如果只测试代码的一条正确路径,让它正确走一遍,并不算是真正的完成。软件开发是一个项复杂的工程,在测试某段代码的行为是否和你的期望一 致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如参数很可疑、硬盘没有剩余空间、缓冲区溢出、网络掉线的时候。

    3、 我可以依赖单元测试吗?

    不能依赖的代码是没有多大用处的。既然单元测试是用来保证代码的正确性,那么单元测试也一定要值得依赖。

    4、 单元测试说明我的意图了吗?

    单元测试能够帮我们充分了解代码的用法,从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能。

    不写测试的借口

    到这里,我们已经知道了使用单元测试的种种理由。但目前的实际情况是大多数程序员不进行单元测试,或只进行简单的单元测试。下面是一些他们常用的接口:

    1、 编写单元测试太花时间了。

    我们知道,在开发时越早发现BUG,就能节省更多的时间,降低更多的风险。如果你仍然认为在编写产品代码的时候,还是没有时间编写测试代码,那么请先考虑下面这些问题:

    1)、对于所编写的代码,你在调试上面花了多少时间。
    2)、对于以前你自认为正确的代码,而实际上这些代码却存在重大的bug,你花了多少时间在重新确认这些代码上面。
    3)、对于一个别人报告的bug,你花了多少时间才找出导致这个bug 的源码位置。
    回答完这些问题,你一定不再以“太花时间”作为拒绝单元测试的借口。

    2、 运行测试的时间太长了。

    合适的测试是不会让这种情况发生的。实际上,大多数测试的执行都是非常快的,因此你在几秒之内就可以运行成千上万个测试。但是有时某些测试会花费很长的时间。这时,需要把这些耗时的测试和其他测试分开。通常可以每天运行这种测试一次,或者几天一次。

    3、 测试代码并不是我的工作。

    你的工作就是保证代码能够正确的完成你的行为,恰恰相反,测试代码正是你不可缺少的工作。

    4、 我并不清楚代码的行为,所以也就无从测试。

    如果你实在不清楚代码的行为,那么估计现在并不是编码的时候。如果你并不知道代码的行为,那么你又如何知道你编写的代码是正确的呢?

    5、 但是这些代码都能够编译通过。

    我们前面已经说过,代码通过编译只是验证它的语法通过。但并不能保证它的行为就一定正确。

    6、 公司请我来是为了写代码,而不是写测试。

    公司付给你薪水是为了让你编写产品代码,而单元测试大体上是一个工具,是一个和编辑器、开发环境、编译器等处于同一位置的工具。

    7、 如果我让测试员或者QA(Quality Assurance)人员没有工作,那么我会觉得很内疚。

    你并不需要担心这些。请记住,我们在此只是谈论单元测试,而它只是一种针对源码的、低层次的,为程序员而设计的测试。在整个项目中,还有其他的很多测试需要这些人来完成,如:功能测试、验收测试、性能测试、环境测试、有效性测试、正确性测试、正规分析等等。

    8、 我的公司并不会让我在真实系统中运行单元测试。

    我们所讨论的只是针对开发者的单元测试。也就是说,如果你可以在其他的环境下(例如在正式的产品系统中)运行这些测试的话,那么它们就不再是单元测试,而是其他类型的测试了。实际上,你可以在你的本机运行单元测试,使用你自己的数据库。

    总而言之,单元测试会让我们的开发工作变得更加轻松,让我们对自己的代码更加自信。无论是大型项目还是小型项目,无论是时间紧迫的项目还是时间宽裕的项目,只要代码不是一次写完永不改动,编写单元测试就一定超值,它已成为我们编码不可缺少的一部分。




posted @ 2009-07-15 21:19 黄剑父 阅读(155) | 评论 (0)编辑 收藏
因公司的需要和安排,我由开发转为测试。
理由有:
1、公司需要加强测试的力量。目前测试从人数和资源,以及经验需要加强。
2、公司的产品质量的提升需要测试加强,加重测试在整个产品开发过程中的比重。
3、公司说与其从外面招人,不如从内部选拔一些人出来,而我又有开发经验,又有逆向思维能力,又喜欢挑战别人,思维周密,反正能说的好话都说了。
4、我个人认为,我自己喜欢挑战,喜欢批评其他人和事物(其实是讲真话,只是这年代讲真话的人不太受别人喜欢,就说这个人只知道挑别人的错,等等)。
5、希望能干下去,老老实实的干下去,只要不是因为我个人确实不能干测试,而只能做开发,那么就转回来做开发,否则,就走下去。我个人为测试的前途这几年要超过搞开发的前途。测试工作对目前待中国的软件人员来讲确实是不熟悉,好似门槛不高,实则想做得好,确实难。连一个测试用例在本科阶段,看都未看过,更不要说怎么去培养测试方面的素质。
目前我给自己定的目标是,以一个完全新人的角度,大学应届毕业生的姿态去向别人学习测试。抛开以前开发那种高高在上的心态,认认真真做好测试工作。我相信我会在半年内熟悉这项工作。

目前正在看《软件测试的艺术》,个人认为还是一本不错的书,是进入测试这行一个比较好的入门书,能产生非常大影响的一本书。因为此书,主要是让人明白测试的本质问题是什么,以及一些测试方面要注意的原则问题,测试技术也讲了一些,对我熟悉测试还是非常具有启发性。


posted @ 2009-06-14 22:01 黄剑父 阅读(187) | 评论 (0)编辑 收藏
intel处理器实现了4个权限级别ring0-ring3。
windows使用了两个ring0和ring3。
posted @ 2009-06-11 09:43 黄剑父 阅读(527) | 评论 (0)编辑 收藏
信息安全涉及到信息的保密性(Confidentiality)、完整性(Integrity)、可用性(Availability)、可控性(Controllability)和不可否认性(Non-Repudiation)。综合起来说,就是要保障电子信息的有效性。保密性就是对抗对手的被动攻击,保证信息不泄漏给未经授权的人。完整性就是对抗对手主动攻击,防止信息被未经授权的人篡改。可用性就是保证信息及信息系统确实为授权使用者所用。可控性就是对信息及信息系统实施安全监控。
posted @ 2009-06-10 16:11 黄剑父 阅读(151) | 评论 (0)编辑 收藏
资料来源:http://www.cnpaf.net/Class/Ethernet/200408/402.html,中国协议分析网

正如其名字所暗示的,Hub就是活动的中心。用网络术语来说,Hub或 Concentrator,是基于星形拓扑的接线点。Arcnet、10Base-T、10Base-F及许多其它专用网络都依靠集线器来连接各段电缆及把数据分发到各个网段。集线器的基本功能是信息分发,它把一个端口接收的所有信号向所有端口分发出去。一些集线器在分发之前将弱信号重新生成,一些集线器整理信号的时序以提供所有端口间的同步数据通信。具有多个10Base-F接口的集线器就象是使用镜子来把光线分到各个端口。

图1是基本的10Base-2网络,注意机器间连接的方式和数据在源设备和目的设备间的各个设备的处理及传递。




图2是与图1相同的网络,不过是10Base-T,可以看到拓扑的不同和集线器是如何嵌到此网中。




在 10Base-T网络中,所有设备需要用非屏蔽双绞线连接到一个或多个集线器,集线器应该有多个端口甚至多种类型的端口。有时需要把多个集线器连接起来,这时,你可能想用高速端口来建立网络的主干,各集线器与服务器应直接连到高速主干上。因为多数LAN的主要通信是在工作站和主服务器之间的,主干对网络的整体性能意义重大。

图3是个较复杂的10Base-T网络示意图,注意主干是怎样连接多个集线器和服务器的。主干应该是高速连接,如快速以太网或FDDI等。



令牌环网中也有可以称作集线器的设备,MSAU(Multi-StationAccessUnit)就可以看作一种集线器,因为它的功能与以太网的集线器很类似,但是MSAU把包串行地路由到各个设备,不象以太网集线器是并行的。为了不发生混淆,令牌环网MSAU不作为集线器讨论。
 

二、谁需要集线器?


判断你的局域网是否需要集线器的方法很简单:如果你想建立星形网络且有不少于两台主机,那么就需要集线器。这个规则只有一个例外,那就是只有两台主机的 10Base-T网络,可以直接将之相连,但是需要一条特殊发送端与接收端交叉连接的线缆,这种线缆很普通,如果你实在找不到,也可以自己做一个,很容易也很便宜,所需物品为一小段双绞线、两个RJ-45接头和工具,按照下表连接就是了。

 

RJ-45接头1 RJ-45接头2
针号功能 针号功能
1发送+<-->3接收+
2发送-<-->6接收-
3接收+<-->1发送+
6接收-<-->2发送-


三、集线器的类型


我们知道,集线器在星形拓扑的网络中起着重要作用。集线器有多种,各个种类具有特定的功能、提供不同等级的服务。下面讲讲多数集线器的一些标准特性和被动、主动、智能集线器的区别以及一些高性能集线器的附加特性。

1、基本规范


所有的集线器根据可连接的线缆类型都有一些基本特性。集线器可以给网络提供除接口之外的附加服务,但也必须遵从IEEE对介质的规定。

多数集线器主要的连接是RJ-45插座,这是基于双绞线的多种以太网的标准接头类型,从10Base-T到100Base-T,局域网中的工作站、打印机等设备通常是以某种双绞线连接到集线器的,其两端为RJ-45连接头。

注:RJ-45头看起来有点象电话线的接头,不过稍微宽点。它主要用于以太网,但也可用于令牌环网。

每种线缆到集线器的长度由使用的介质决定(见下表)。

 

以太网类型距离
10Base-2185米
10Base-5500米
10Base-T100米
10Base-F2公里
10broad-363,600米

上述是以太网规范的最大长度,其中多数可以用中继器(repeater)来延长。当然还有其他的要求。

集线器是电子设备,因此需要电源,多数集线器还有指示多种状态的LED指示灯,常见的两种指示灯是电源和端口状态指示灯,有的集线器还有监视端口通信状态和冲突的指示灯。

2、被动集线器

顾名思义,被动集线器是相对静止的。它们没有专门的动作来提高网络性能,也不能帮你检测硬件错误或性能瓶颈,它们只是简单地从一个端口接收数据并通过所有端口分发,这是集线器可以做的最简单的事情。被动集线器是星形拓扑以太网的入门级设备。

被动集线器通常有一个10Base-2端口和一些RJ-45接头。我们知道,10Base-5是使用粗缆的以太网,这个10Base-2接头可以用于连接主干。有些集线器还有可连到收发器的AUI端口以建立主干。

3、主动集线器

主动集线器拥有被动集线器的所有性能,此外还能监视数据。它们是在以太网实现存贮转发技术的重要角色,它们在转发之前检查数据,它们并不区分优先次序,而是纠正损坏的分组并调整时序。

如果信号比较弱但仍然可读,主动集线器在转发前将其恢复到较强的状态。这使得一些性能不是特别理想的设备也可正常使用。如果某设备发出的信号不够强,使得被动集线器无法识别,那么主动集线器的信号放大器可以使该设备继续正常使用。此外,主动集线器还可以报知那些设备失效,从而提供了一定的诊断能力。

有些线缆可能有电磁干扰使分组不能按正常时序到达集线器,主动集线器可以将转发的分组重新同步。有时数据根本就到不了目的地,主动集线器通过在单个端口重发分组来弥补数据的丢失。主动集线器可以调整时序以适应较慢的、错误率较高的连接。当然,这样做会降低连接到该集线器上设备的整体网络速度,但是,有时这比丢失数据要好。此外时序调整实际上可以减少局域网中的冲突次数,数据不需要重复广播,局域网就可以传输新的数据。

主动集线器提供一定的优化性能和一些诊断能力,它们比简单的被动集线器贵,可以配以多个、多种端口。

4、智能集线器

智能集线器比前两种提供更多的好处,可以使用户更有效地共享资源。其技术近些年才出现,很多地方还没有机会享受到它的好处。除了主动集线器的特性外,智能集线器提供了集中管理功能。如果连接到智能集线器上的设备出了问题,你可以很容易的识别、诊断和修补。这是极大的提高,在一个大型网络里,如果没有集中的管理工具,那么你常常需要一个一个线盒地跑,寻找出问题的设备。

智能集线器的另一个出色的特性是可以为不同设备提供灵活的传输速率。除了上连到高速主干的端口外,智能集线器还支持到桌面的10、16和100Mbps的速率,即以太网、令牌环和FDDI。

5、高级特性

高端集线器还提供其它一些特性,如冗余交流电源、内置直流电源、冗余风扇,还有线缆连接的自动中断、模块的热插拔、自动调整10Base-T接头的极性,再如冗余配置存贮、冗余时钟,有些集线器还集成了路由和桥接功能。
posted @ 2009-06-10 15:46 黄剑父 阅读(353) | 评论 (0)编辑 收藏
仅列出标题
共6页: 1 2 3 4 5 6