每天进步一点点

发布新日志

  • TCP/IP 协议简介

    2010-09-01 22:09:20

    什么是TCP/IP?51Testing软件测试网4Ul@ tF)X
    TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互连网协议。这两个协议属于众多的TCP/IP 协议组中的一部分。
    cP$Z.IG44722TCP/IP协议组中的协议保证Internet上数据的传输,提供了几乎现在上网所用到的所有服务。这些服务包括:电子邮件的传输  文件传输  新闻组的发布  访问万维网
    H$c#_}-D8@6s44722在TCP/IP协议组分两种协议:网络层的协议  应用层的协议51Testing软件测试网.C0_9r:Z uN#p
    网络层协议  
    D O;J'\%Im,k-Y44722网络层协议管理离散的计算机间的数据传输。这些协议用户注意不到,是在系统表层以下
    工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法。它是在许多信息的基础上工作的,比如说是机器的IP地址。在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。通过这一过程,IP和其它网络层的协议共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的IP。
    JIb5{ G'DD9y44722应用层协议51Testing软件测试网,NQms!q q7B
    相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。用户为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。
    AsJCt]44722请记住这句总结性的话:TCP/IP协议是指一组使得Internet上的机器相互通信比较方便的协议。
    wl Mjh }W.A44722TCP/IP是如何工作的?51Testing软件测试网 qQDy+O
    TCP/IP通过使用协议栈工作。这个栈是所有用来在两台机器间完成一个传输的所有协议的几个集合。(这也就是一个通路,数据通过它从一台机器到另一台机器。)栈分成层,与这里有关的是五个层。学习下面的图可以对层有个概念。51Testing软件测试网ev5e4u!{$r\8_y-Wx
    在数据通过图示的步骤后,它就从网络中的一台机器传到另一台机器了。在这个过程中,一个复杂的查错系统会在起始机器和目的机器中执行。51Testing软件测试网9@Hu6it+K
    栈的每一层都能从相邻的层中接收或发送数据。每一层都与许多协议相联系。在栈的每一层,这些协议都在起作用。本章的下一部分将分析这些服务,以及它们在栈中是如何联系的。同时也分析一下它们的功能,它们提供的服务和与安全性的关系。51Testing软件测试网c#[/`J%y
    协议简介51Testing软件测试网 B H,Il)Z-pt{\ X
    已经知道数据是怎样使用TCP/IP协议栈来传输的了。现在仔细分析在栈中所用到的关键的协议。先从网络层的协议开始。51Testing软件测试网)W5{)O%W;j9Z Vmr]
    网络层协议
    e-Z,ybNv Gf44722网络层协议是那些使传输透明化的协议。除了使用一些监视系统进程的工具外,用户是看不见这些协议的。51Testing软件测试网 n wW GS'~j*I
    Sniffers是能看到这些步骤的装置。这个装置可以是软件,也可以是硬件,她能读取通过网络发送的每一个包。Sniffers广泛地用于隔离用户看不到的、网络性能下降的问题。sniffers能读取发生在网络层协议的任何活动。而且,正如你已经猜到的,sniffers会对安全问题造成威胁。参见Sniffers一章。
    U`H9rQ-L ]44722重要的网络层协议包括:51Testing软件测试网*i~*pp#zoh
     地址解析协议(ARP)51Testing软件测试网(C$X$A5l&t0M(|
     Internet控制消息协议(ICMP)51Testing软件测试网#~(Z7yo Q_
     Internet协议(IP)
    6J4YC Qh/O5f1h]|44722 传输控制协议(TCP)51Testing软件测试网pjNVPPy`t1s
    下面仅仅简单介绍一下。
    y@Q%[#ma44722地址解析协议ARP51Testing软件测试网8O$[6i qgR%E.@1R
    地址解析协议的目的是将IP地址映射成物理地址。这在使信息通过网络时特别重要。在一个消息(或
    其他数据)发送之前,被打包到IP包里,或适合于Internet传输的信息块。这包括两台计算机的IP地址。在这个包离开发送计算机之前,必须要找到目标的硬件地址。这就是ARP最初用到的地方。51Testing软件测试网eA/d0CG7nV8R4i
    一个ARP请求消息在网上广播。请求由一个进程接收,它回复物理地址。这个回复消息由原先的那台发送广播消息计算机接收,从而传输过程就开始了。
    +X7Qd0^_B7m44722ARP的设计包括一个缓存。为了理解缓存的概念,考虑一下:许多现代的HTML浏览器(比如Netscape或Microsoft的Internet
    xZnFIn q44722Explorer)使用了一个缓存。缓存是磁盘的一部分,从Web网上经常访问的东西就存在里面(比如按钮,或通用的图形)。这是符合逻辑的,因为当你返回这些主页的时候,这些东西不必再从远程计算机上装载了。从缓存中装载的速度要比较快。51Testing软件测试网"j W6pXe^f
    相似的,ARP的实现包括一个缓存。以这种方式,网络或远程计算机的硬件地址就存着了,并为接着的ARP请求作准备。这样节省了时间和网络资源。51Testing软件测试网#I*t A9q `ng
    但是,正是由于缓存,就引起了安全性。
    ;l Z!u-z"z3@.Qi44722对于网络安全来将,这并不是最重要的安全性问题。然而,地址缓存(不仅仅是在ARP而且在其他例子中)确实会引起安全性问题。一旦这些地址保存,都会是让黑客伪造一个远程连接,它们对缓存的地址很欢迎。 Internet控制消息协议ICMP
    d/jQyO7Au44722Internet控制消息协议是用来在两台计算机间传输时处理错误和控制消息的。它允许这些主机共享信息。在这一方面,ICMP是用来诊断网络问题的重要工具。通过ICMP收集诊断信息的例子如下:
    ;~:h3K!L;Xd44722一台主机关机
    X]%N-F1EG5|44722一个网关堵塞和工作不正常
    "Xf k)Ri"h2i y44722网络中其他的失败51Testing软件测试网!ThPE[6l+E(@
    可能最著名的ICMP实现的网络工具是ping。ping通常用来判断是否一台远程机器正开着,数据包从用户的计算机发到远程计算机。这些包通常返回用户的计算机。如果没有返回数据包到用户计算机,ping程序就产生一个表示远程计算机关机的错误消息。51Testing软件测试网8E$F$J4W)V)l&tuEL
    应用层协议51Testing软件测试网)e7l O|:I"E']
    应用层协议是专门为用户提供应用服务的。它是建立在网络层协议之上的。
    {+E2{o:pih#l6|&]44722Telnet51Testing软件测试网]E+@9Nq$x
    Telnet在RFC
    tZZC'@&[,RK44722854中有详细地描述,Telnet协议中说明:Telnet协议的目的就是提供一个相当通用的,双向的,面向八位字节的通信机制。它的最初目的是允许终端和面向终端的进程之间的交互。51Testing软件测试网 PA1t,MP
    Telnet不仅允许用户登录到一个远程主机,它允许用户在那台计算机上执行命令。这样,Los Angeles的一个人可以Telnet到New51Testing软件测试网*T-A#Wia9m
    York的一台机器,并在这台机器上运行程序,就跟在New York的用户一样。51Testing软件测试网 O^ibKa
    对于熟悉Telnet的用户来讲,他的操作与BBS的界面一样。Telnet是一个能提供建立在终端字体的访问
    数据库的一个应用程序。比如,多于80%的大学的图书馆的目录可以通过Telnet访问到。
    G'@0[yj44722即使GUI应用程序被大大采用,Telnet这个建立在字符基础上的应用程序,仍相当的流行。这有许多原因。第一,Telnet允许你以很小的网络资源花费实现各种功能(如收发邮件)。实现安全的Telnet是件十分简单的事。有许多这样的程序,通用的是Secure
    ,P2c8n9z:u5Q5G,s5fd brj44722Shell。51Testing软件测试网k,b ^5SBa
    要使用Telnet,用户要指定启动Telnet客户的命令,并在后面指定目标主机的名字。在
    Linux中,可以这样:
    K C ?'T-~w3OgV44722$telnet internic.net
    O!|G%Wm5a/dpS44722这个命令启动Telnet过程,连接到internic.net。这个连接可能被接受,或被拒绝,这与目标主机的配置有关。在UNIX,Telnet命令很久以前就是内置的。也就是说,Telnet已经包含在UNIX的发行版本中有十年了。但并不是所有操作系统都将Telnet作为内置的Telnet客户。
    )dnj2PL*o Q(q44722文件传输协议FTP51Testing软件测试网7lg_8@Kl4?
    文件传输协议是从一个系统向另一个系统传递文件的标准方法。它的目标在RFC 0765中写得很清楚。
    :}K,rc3g cJ^44722FTP的目标是1)促进文件和程序的共享,2)鼓励间接和含蓄的使用远程计算机,3)使用户不必面对主机间使用的不同的文件存储系统,4)有效和可靠地传输文件。FTP,尽管用户可以直接通过终端来使用,是设计成让别的程序使用的。51Testing软件测试网%E ^p1?b&oM
    约有二十年,研究者调查了相当广泛的文件传输方法。FTP经历了多次改变。1971年作了第一次定义,整个的说名参见RFC 114。
    4Tsz l#zv44722FTP是怎样工作的?
    'quT O `` A44722FTP文件传输应用在客户/服务环境。请求机器启动一个FTP客户端软件。这就给目标文件服务器发出了一个请求。典型地,这个要求被送到端口21。一个连接建立起来后,目标文件服务器必须运行一个FTP服务软件。51Testing软件测试网 e&~Y_z^y?
    FTPD是标准的FTP服务daemon。它的功能很简单:回复inetd收到的连接请求,并满足这些要传输文件的请求。这个daemon在许多发行版的UNIX中是个标准。51Testing软件测试网z$bT8tnJa4]
    FTPD等待一个连接请求。当这样的一个请求到达时,FTPD请求用户登录。用户提供它的合法的登录名和口令或匿名登录。
    x^ cN:P*l;p v ]44722一旦登录成功,用户可以下载文件了。在某些情况下,如果服务器的安全允许,用户可以上载文件。
    { T;U(s(M3m2k'h44722简单邮件传输协议SMTP
    8@@`zV'~/G44722简单邮件传输协议的目的是使得邮件传输可靠和高效。51Testing软件测试网4c W)QG(r2DI
    SMTP是一个相当小和有效的协议。用户给SMTP服务器发个请求。一个双向的连接随后就建立了。客户发一个MAIL指令,指示它想给Internet上的某处的一个收件人发个信。如果SMTP允许这个操作,一个肯定的确认发回客户机。随后,会话开始。客户可能告知收件人的名称和IP地址,以及要发送的消息。
    /MEUy%if3Cy44722尽管SMTP相当简单,邮件服务是无穷的安全漏洞的源泉。51Testing软件测试网%x;Bfo(d S
    SMTP服务在Linux内部是内置的。其它网络操作系统也提供某些形式的SMTP。
    bf s$UY:Wm B44722Gopher
    fP3|TE2nH44722Gopher是一个分布式的文件获取系统。它最初是作为Campus Wide Information
    ,N-yS|G r?7e44722System在Minnesota大学实现的。它的定义如下:
    )jN/^ Q;p:n44722Internet
    qa g(t u;u/|44722Gopher协议最初是设计用来最为一个分布式文件发送系统的。文档放在许多服务器上,Gopher客户软件给客户提供一个层次项和目录,看上去象一个文件系统。事实上,Gopher的界面设计成类似一个文件系统,因为文件系统是查找文件和服务的最好模型。
    GH Q%CjKJB44722Gopher服务功能相当强大。能提供文本,声音,和其他媒体。主要用在文本模式,比通过用浏览器使用HTTP要来得快。毫无疑问,最流行的Gopher客户软件是为UNIX编写的。其他操作系统也有Gopher客户端软件。51Testing软件测试网y W q#yW|&oP#UVA
    典型地,用户启动一个Gopher客户端软件,和一个Gopher服务器。随后,Gopher返回一个可以选择的菜单。可能包括查找菜单,预先设置的目标,或文件目录。
    3uP(@Rc"\;D5g44722注意,Gopher模式完全是一个客户服务器模式。用户每次登录,客户给Gopher服务器发送一个请求,要求所有能得到的文档。Gopher服务器对这个信息做出反应知道用户请求一个对象。
    N;vm H*d44722超联结传输协议HTTP51Testing软件测试网f8M+H,n"mCkM
    由于它能让用户在网上冲浪,超联结传输协议可能是最有名的协议。HTTP是一个应用层协议,它很小也很有效,符合发布、合成和超媒体文本系统的的需要。是一个通用的,面向对象的协议,通过扩展请求命令,可以用来实现许多任务。HTTP的一个特点是数据表现的类型允许系统相对独立于数据的传输。
    t4x7J!V2u#r3Hj44722HTTP的出现永久地改变了Internet的特点,主要是使Internet大众化。在某些程度上,他它的操作与Gopher相类似。比如,它的工作是请求/响应式的。这是相当重要的一点。其他应用程序,比如Telnet仍需要用户登录(当他们登录时,便消耗系统资源)。但Gopher和HTTP协议,消除了这一现象。用户(客户)仅仅在他们请求或接受数据时消耗资源。51Testing软件测试网%g.q;ugp
    使用通用浏览器,象Netscape Navigator或Microsoft Internet51Testing软件测试网0MPoR3cuH {s
    Explore,可以监视这一过程的发生。在WWW上的数据,你的浏览器会和服务器及时联系。这样,它首先获取文本,然后是图形,再后是声音,等等。在你的浏览器的状态栏的左下角。当它装载页面时,看着它几分钟。你会看到请求和服务活动的发生,通常速度很快。
    5[$d5M wpO,Q*g44722HTTP并不特别关注所需的是什么类型的数据。各种形式的媒体都能插进,以及远程的HTML主页。
    Y?h | L44722网络新闻传输协议NNTP51Testing软件测试网/CH#bd;m2Q+?j#e5n
    网络新闻传输协议是一个广泛使用的协议。它提供通常作为USENET新闻组的新闻服务。51Testing软件测试网(e(a)Q3]N/oXLr
    NNTP定义了一个协议,使用一个可靠的建立在流的基础上的在Internet上传输新闻的分发,询问,获取和发布的一个协议。NNTP被设计成新闻被存储在一个中心的数据库,允许订阅者选择他们希望读的主题。目录,交叉引用和过期的新闻都能找到。51Testing软件测试网2n)C} jSJaL l
    NNTP有许多特性和简单邮件传输协议以及TCP相似。与SMTP相似,它接受一般的
    英语命令。和TCP相似,它是建立在流的传输和分发的基础上的。NNTP通常在端口119运行。51Testing软件测试网6_ S { F+[KV3T _/U
    下面详细地讲解一下以太网,IP协议和TCP协议。51Testing软件测试网c6d:M"P6C4rA
    第二节 Etherner51Testing软件测试网/v9z,i9]x
    以太网的基本工作原理51Testing软件测试网1j&U I|9u6Z%\ hF
    以太网上的所有设备都连在以太总线上,它们共享同一个通信通道。以太网采用的是广播方式的通信,即所有的设备都接收每一个信息包。网络上的设备通常将接收到的所有包都传给主机界面,在这儿选择计算机要接收的信息,并将其他的过滤掉。以太网是最有效传递的意思是,硬件并不给发送者提供有关信息已收到的信息。比如,即使目标计算机碰巧关机了,送给它的包自然就丢失,但发送者并不会知道这一点。
    $IN!yG,TT44722以太网的控制是分布式的。以太网的存取方式叫做带有Collision的Carrier Sense Multipe
    R/ypMO44722Access。因为多台计算机可以同时使用以太网,每台机器看看是否有载波信号出现判定总线是否空闲。如果主机接口有数据要传输,它就侦听,看看是否有信号正在传输。如果没有探测到,它就开始传输。每次传输都在一定的时间间隔内,即传输的包有固定的大小。而且,硬件还必须在两次传输之间,观察一个最小的空闲时间,也就是说,没有一对机器可以不给其他计算机通信的机会而使用总线。51Testing软件测试网:eP&Oa n ?7N @Q
    冲突侦测和恢复51Testing软件测试网F&d5Y:n1ig
    当开始一个传输时,信号并不能同时到达网络的所有地方。传输速度实际上是光速的80%。这就有可能两个设备同时探测到网络是空闲的,并都开始传输。但当这两个电信号在网络上相遇时,它们都不再可用了。这种情况叫做冲突。
    4qiQ|8{GW44722以太网在处理这种情况时,很有技巧性。每台设备在它传输信号的时候都监视总线,看看它在传输的时候是否有别的信号的干扰。这种监视叫做冲突侦听。在探测到冲突后,设备就停止传输。有可能网络会因为所有的设备都忙于尝试传输数据而每次都产生冲突。
    +I:F5Li%mb}44722为了避免这种情况,以太网使用一个2进制指数后退策略。发送者在第一次冲突后等待一个随机时间,如果第二次还是冲突,等待时间延长一倍。第三次则再延长一倍。通过这种策略,即使两台设备第二的等待时间会很接近,但由于后面的等待时间成指数倍增长,不就,他们就不会相互冲突了。
    /yR GkTrqP44722以太网的硬件地址51Testing软件测试网~b-MV"Vjp.zQ
    每台连接到以太网上的计算机都有一个唯一的48位以太网地址。以太网卡厂商都从一个机构购得一段地址,在生产时,给每个卡一个唯一的地址。通常,这个地址是固化在卡上的。这个地址又叫做物理地址。51Testing软件测试网"jh&TI3_y9Tn
    当一个数据帧到达时,硬件会对这些数据进行过滤,根据帧结构中的目的地址,将属于发送到本设备的数据传输给操作系统,忽略其他任何数据。51Testing软件测试网zC U x v&?8ecI(q4M W
    一个是地址位全为1的时表示这个数据是给所有总线上的设备的。
    7M0v*X1d*Ou{(T0P bW ^44722以太网的帧结构
    ^ ["\V%md44722以太网的帧的长度是可变的,但都大于64字节,小于1518字节。在一个包交换网络中,每个以太网的帧包含一个指明目标地址的域。上图是以太网帧的格式,包含了目标和源的物理地址。为了识别目标和源,以太网帧的前面是一些前导字节,类型和数据域以及冗余校验。前导由64个0和1交替的位组成,用于接收同步。32位的CRC校验用来检测传输错误。在发送前,将数据用CRC进行运算,将结果放在CRC域。接收到数据后,将数据做CRC运算后,将结果和CRC域中的数据相比较。如果不一致,那么传输过程中有错误。
    xW7A%a\44722帧类型域是一个16位的整数,用来指示传输的数据的类型。当一个帧到达台设备后,操作系统通过帧类型来决定使用哪个软件模块。从而允许在同一台计算机上同时运行多个协议。51Testing软件测试网\9UiB v@:H:t:MW
    第三节 Internet地址51Testing软件测试网+d vt,V)O\H,g
    网络上的每一台计算机都有一个表明自己唯一身份的地址。TCP/IP协议对这个地址做了规定。一个IP地址由一个32位的整数表示。它的一个较为聪明的地方是很好的规定了地址的范围和格式,从而使地址寻址和路由选择都很方便。一个IP地址是对一个网络和它上面的主机的地址一块编码而形成的一个唯一的地址。51Testing软件测试网/Zmn jrNH1W
    在同一个物理网络上的主机的地址都有一个相同前缀,即IP地址分成两个部分:(netid,hostid)。其中netid代表网络地址,hostid代表这个网络上的主机地址,根据他们选择的位数的不同,可以分成以下五类基本IP地址。
    &I7{!L_2Xj44722通过地址的前3位,就能区分出地址是属于A,B或C类。其中A类地址的主机容量有16777216台主机,B类地址可以有65536台主机,C类地址可以有256台主机。51Testing软件测试网}.G^-L+uq^^)B
    将地址分成网络和主机部分,在路由寻址时非常有用,大大提高了网络的速度。路由器就是通过IP地址的netid部分来决定是否发送和将一个数据包发送到什么地方。51Testing软件测试网7x&w1c9e5Hr zqG-t'q
    一个设备并不只能有一个地址。比如一个连到两个物理网络上的路由器,它就有两个IP地址。所以可以将IP地址看成是一个网络连接。
    0Z`F'Ub7d6L(Cm44722为了便于记忆和使用32位的IP地址,可以将地址使用用小数点分开的四位整数来表示。下面举个例子:51Testing软件测试网 V^mq B2Pt1oiF
    IP地址: 10000000 00001010 00000010 00011110
    \2w*[M,M,].~w44722记为: 128.10.2.3051Testing软件测试网S0Q6s~8g0d
    第四节 IP协议和路由51Testing软件测试网.p'L:HN5b `4`
    IP协议
    'P2ZgU-U:@.rY0w44722IP协议定义了一种高效、不可靠和无连接的传输方式。由于传输没有得到确认,所以是不可靠的。一个包可能丢失了,或看不见了,或是延时了,或是传输顺序错了。但是传输设备并不检测这些情况,也不通知通信双方。无连接
    Y XP^^2?-FTxkO44722因为每个包的传递与别的包是相互独立的。同一个机器上的包可能通过不同的路径到达另一台机器,或在别的机器上时已经丢失。由于传输设备都试图以最快的速度传输,所以是最高效的。51Testing软件测试网4n1_ w@ k+P
    IP协议定义了通过TCP/IP网络传输的数据的格式,定义了数据进行传递的路由功能。51Testing软件测试网j&e6c Be7KTl7cu
    IP数据包的格式如下:51Testing软件测试网4QF(h-S)U
    由一个头和数据部分组成。数据包的头部分包含诸如目的地址和源地址,数据的类型等信息。
    l1L4`t R5o+D44722数据包头格式:
    ]C[N#Gp44722数据包是由软件处理的,它的内容和格式并不是由硬件所限定。
    +Tni/D UT&|:v1G44722比如,头4位是一个VERS,表示的是使用的IP协议的版本号。它表示发送者、接收者和路由器对该数据的处理都要按所示的版本进行处理。现在的版本号是4。软件通过版本来决定怎样进行处理。51Testing软件测试网2a.FNLA1l~4}r
    头长度(HLEN)也是用4位来表示以32位为计量单位的头的长度。51Testing软件测试网%atbb9\4A \F7h
    TOTAL LENGTH表示这个数据包的长度(字节数)。从而包中的数据的长度就可以通过上面两个数据而计算出来了。
    8R~*E(Zm|N44722一般来说,数据部分就是一个物理的帧。对于以太网来讲,就是将整个的一个以太网的帧数据作为一个IP数据包的数据来传输的。
    _x0c;T Y]0Z44722数据包的头里面还包含了一些其他的信息,请参见有关资料的具体介绍。 IP路由
    K/O+h(pp V44722在一个网络上,连接两种基本设备,主机和路由器。路由器通常连接几个物理网络。对一台主机来讲,要将一个数据包发往别的网络,就需要知道这个数据包应该走什么路径,才能到达目的地。对于一台路由器来讲,将收到的数据包发往哪个物理网络。因此,无论主机还是路由器,在发送数据包是都要做路由选择。
    F-QEF r/G:m2B44722数据发送有两种方式:直接数据发送和间接数据发送。
    v^0Q5IG S-@N44722直接数据发送通常是在同一个物理网络里进行的。当一个主机或路由器要将数据包发送到同一物理网络上的主机上时,是采用这种方式的。首先判断IP数据包中的目的地址中的网络地址部分,如果是在同一个物理网络上,则通过地址分析,将该IP目的地址转换成物理地址,并将数据解开,和该地址合成一个物理传输帧,通过局域网将数据发出。
    Hc`(cPvMG44722间接数据发送是在不同物理网络里进行的。当一个主机或路由器发现要发送的数据包不在同一个物理网络上时,这台设备就先在路由表中查找路由,将数据发往路由中指定的下一个路由器。这样一直向外传送数据,到最后,肯定有一个路由器发现数据要发往同一个物理网络,于是,再用直接数据发送方式,将数据发到目的主机上。
    {5Uf0ICzVI I u44722主机和路由器在决定数据怎样发送的时候,都要去查找路由。一般,都将路由组成一个路由表存在机器中。路由表一般采用Next-Hop格式,即(N,R)对。N是目标地址的网络地址,R是传输路径中的下一个路由。通常这个路由和这台机器在同一物理网络里。
    S6Jh;mYW/vb+f44722第五节 TCP协议51Testing软件测试网Rz8C)J? \5Kb1`
    TCP传输原理
    8H{5YR8N(j%q6g44722TCP协议在IP协议之上。与IP协议提供不可靠传输服务不同的是,TCP协议为其上的应用层提供了一种可靠传输服务。这种服务的特点是:可靠、全双工、流式和无结构传输。51Testing软件测试网Vf(u#o3O6L*b6n
    它是怎样实现可靠传输的呢?51Testing软件测试网8{W5t_@ Q#`;p,y
    TCP协议使用了一个叫积极确认和重发送(positive acknowledgement with retransmission)的技术来实现这一点的。51Testing软件测试网1ti2Ay+^c$P|
    接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示它已经收到了数据。
    1WYY%[1|&V^%Y44722发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。在它发送这个数据的同时,还启动了一个记时器。如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据。
    /ce ? p4J#BN44722这种方法还产生了一个问题,就是包的重复。如果网络传输速度比较低,等到等待时间结束后,确认消息才返回到发送者,那么,由于发送者采用的发送方法,就会出现重复的数据了。解决的一个办法是给每个数据一个序列号,并需要发送者记住哪个序列号的数据已经确认了。为了防止由于延时或重复确认,规定确认消息里也要包含确认序列号。从而发送者就能知道哪个包已经确认了。 TCP协议中还有一个重要的概念:滑动窗口。这一方法的使用,使得传输更加高效。51Testing软件测试网S`-WS HLo
    有前面的描述可见,发送者在发送完一个数据包之后,要等待确认。在它收到确认消息之前的这段时间是空闲的。如果网络延时比较长,这个问题会相当明显。51Testing软件测试网7Lt S2y9nr
    滑动窗口方法是在它收到确认消息以前,发送多个数据包。可以想象成有一个窗口在一个序列上移动。
    Y{$X(G-t+AP.AZ44722如果一个包发送出去之后还没有确认,叫做未确认包。通常未确认的包的个数就是窗口的大小。51Testing软件测试网3g4~"qKH#j1H\ p
    此窗口的大小为8。发送者允许在接收到一个确认消息以前发送8个数据包。当发送者接到窗口中第一个包的确认消息时,它就将窗口下滑一个。
    :Wa]V#r}6l44722在接收端,也有一个滑动窗口接收和确认一个包。51Testing软件测试网 T\_B[5U A
    端口51Testing软件测试网,X1?j z|q4_u;k
    使用TCP传输就是建立一个连接。在TCP传输中一个连接有两个端点组成。其实,一个连接代表的是发送和接收两端应用程序的之间的一个通信。可以把他们想象成建立了一个电路。通常一个连接用下面的公式表示:51Testing软件测试网VV*o^o
    (host,port)
    '|(]y,M"[Qsz.?"OTN44722host是主机,port是端口。TCP端口能被几个应用程序共享。对于程序员来讲,可以这样理解:一个应用程序可以为不同的连接提供服务。
    I[9k.J7js)|5a44722TCP格式51Testing软件测试网P/L:BU$L:gV9O9[,b o7H
    TCP传输的单位是段,在建立连接,传送数据,确认消息和告之窗口大小时均要进行段的交换。
    a`m/q[6_O!t44722段的格式如下图:
    li7zw8J H0G:vcp44722段的格式也分成两部分,头和数据。51Testing软件测试网bB3^YEJru5\
    上面格式中的名称已经足够说明了他们的作用了。具体的含义请参见有关资料。51Testing软件测试网P m{'d9K3iX
    建立一个TCP连接51Testing软件测试网m-O9I0g.~
    TCP协议使用一个三次握手来建立一个TCP连接的。51Testing软件测试网{,E"F!R7Mt2QK6w
    握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。接收方收到这个段后,向发送者回发一个段。代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
    dET4Mr44722在完成握手之后,就开始正式的数据传输了。51Testing软件测试网\L,I v t&Y m
    上面握手段中的序列号都是随机产生的。
    5YEVAIZ8U44722TCP/IP51Testing软件测试网Yl ~3UC"w W
    每种网络协议都有自己的优点,但是只有TCP/IP允许与Internet完全的连接。TCP/IP是在60年代由麻省理工学院和一些商业组织为美国国防部开发的,即便遭到核攻击而破坏了大部分网络,TCP/IP仍然能够维持有效的通信。ARPANET就是由基于协议开发的,并发展成为作为科学家和工程师交流媒体的Internet。
    C`w-gJ.p&|'[AZ%[44722TCP/IP同时具备了可扩展性和可靠性的需求。不幸的是牺牲了速度和效率(可是:TCP/IP的开发受到了政府的资助)。51Testing软件测试网%p]wU~_Nxj
    Internet公用化以后,人们开始发现全球网的强大功能。Internet的普遍性是TCP/IP至今仍然使用的原因。常常在没有意识到的情况下,用户就在自己的PC上安装了TCP/IP栈,从而使该网络协议在全球应用最广。
    3e&XLot^@a2I44722TCP/IP的32位寻址功能方案不足以支持即将加入Internet的主机和网络数。因而可能代替当前实现的标准是IPv6

  • 软件测试过程模型

    2010-08-02 15:55:45

    目前主流的开发模型主要有:瀑布模型、原型模型、螺旋模型、增量模型、渐进模型、快速软件开发(RAD)以及Rational统一过程(RUP)等,这些模型对于软件开发过程具有很好的指导作用,但是,非常遗憾的是,在这些过程方法中,并没有充分强调测试的价值,也没有给测试以足够的重视,利用这些模型无法更好地指导测试实践。软件测试是与软件开发紧密相关的一系列有计划的系统性的活动,显然软件测试也需要测试模型去指导实践。下面对主要的模型做一些简单的介绍。

      V模型

      V模型是最具有代表意义的测试模型。在传统的开发模型中,比如瀑布模型,人们通常把测试过程作为在需求分析、概要设计、详细设计和编码全部完成后的一个阶段,尽管有时测试工作会占用整个项目周期的一半的时间,但是有人仍然认为测试只是一个收尾工作,而不是主要过程。V模型的推出就是对此种认识的改进。V模型是软件开发瀑布模型的变种,它反映了测试活动与分析与分析和设计的关系,从左到右,描述了基本的开发过程和测试行为,非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系,如模型图中所示,图中的箭头代表了时间方向,左边下降的是开发过程各阶段,与此相对应的是右边上升的部分,即各测试过程的各个阶段。



      V模型的软件测试策略既包括低层测试又包括了高层测试,低层测试是为了源代码的正确性,高层测试是为了使整个系统满足用户的需求。

      V模型指出,单元和集成测试是验证程序设计,开发人员和测试组应检测程序的执行是否满足软件设计的要求;系统测试应当验证系统设计,检测系统功能、性能的质量特性是否达到系统设计的指标;由测试人员和用户进行软件的确认测试和验收测试,追溯软件需求说明书进行测试,以确定软件的实现是否满足用户需求或合同的要求。

      V模型存在一定的局限性,它仅仅把测试过程作为在需求分析、概要设计、详细设计及编码之后的一个阶段。容易使人理解为测试是软件开发的最后的一个阶段,主要是针对程序进行测试寻找错误,而需求分析阶段隐藏的问题一直到后期的验收测试才被发现。

      W模型

      1、W模型建立

      V模型的局限性在于没有明确地说明早期的测试,不能体现“尽早地和不断地进行软件测试”的原则。在V模型中增加软件各开发阶段应同步进行的测试,被演化为一种W模型,因为实际上开发是“V”,测试也是与此相并行的“V”。基于“尽早地和不断地进行软件测试”的原则,在软件的需求和设计阶段的测试活动应遵循IEEEstd1012-1998《软件验证和确认(V&V)》的原则。

      一个基于V&V原理的W模型示意图如下所示:

     
    2、W模型应用

      相对于V模型,W模型更科学。W模型可以说是V模型自然而言的发展。它强调:测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序,需求、功能和设计同样要测试。这样,只要相应的开发活动完成,我们就可以开始执行测试,可以说,测试与开发是同步进行的,从而有利于尽早地发现问题。以需求为例,需求分析一完成,我们就可以对需求进行测试,而不是等到最后才进行针对需求的验收测试。

      如果测试文档能尽早提交,那么就有了更多的检查和检阅的时间,这些文档还可用于评估开发文档。另外还有一个很大的益处是,测试者可以在项目中尽可能早地面的规格说明书中的挑战。这意味着测试不仅仅是评定软件的质量,测试还可以尽可能早地找出缺陷所在,从而帮助改进项目内部的质量。参与前期工作的测试者可以预先估计问题和难度,这将可以显著地减少总体测试时间,加快项目进度。

      根据W模型的要求,一旦有文档提供,就要及时确定测试条件,以及编写测试用例,这些工作对测试的各级别都有意义。当需求被提交后,就需要确定高级别的测试用例来测试这些需求。当概要设计编写完成后,就需要确定测试条件来查找该阶段的设计缺陷。

      W模型也是有局限性的。W模型和V模型都把软件的开发视为需求、设计、编码等一系列串行的活动。同样的,软件开发和测试保持一种线性的前后关系,需要有严格的指令表示上一阶段完全结束,才可以正式开始下一个阶段。这样就无法支持迭代、自发性以及变更调整。对于当前很多文档需要事后补充,或者根本没有文档的做法下(这已成为一种开发的文化),开发人员和测试人员都面临同样的困惑。

      H模型

      1、H模型建立

      V模型和W模型均存在一些不妥之处。首先,如前所述,它们都把软件的开发视为需求、设计、编码等一系列串行的活动,而事实上,虽然这些活动之间存在相互牵制的关系,但在大部分时间内,它们是可以交叉进行的。虽然软件开发期望有清晰的需求、设计和编码阶段,但实践告诉我们,严格的阶段划分只是一种理想状况。试问,有几个软件项目是在有了明确的需求之后才开始设计的呢?所以,相应的测试之间也不存在严格的次序关系。同时,各层次之间的测试也存在反复触发、迭代和增量关系。其次,V模型和W模型都没有很好地体现测试流程的完整性。

      为了解决以上问题,提出了H模型。它将测试活动完全独立出来,形成一个完全独立的流程,将测试准备活动和测试执行活动清晰地体现出来。

      2、H模型应用

      H模型的简单示意图如下所示:



      这个示意图仅仅演示了在整个生产周期中某个层次上的一次测试“微循环”。图中的其他流程可以是任意开发流程。例如,设计流程和编码流程。也可以是其他非开发流程,例如,SQA流程,甚至是测试流程自身。也就是说,只要测试条件成熟了,测试准备活动完成了,测试执行活动就可以(或者说需要)进行了。

      概括地说,H模型揭示了:

      ●软件测试不仅仅指测试的执行,还包括很多其他的活动。
    ●软件测试是一个独立的过程,贯穿产品整个生命周期,与其他流程并发地进行。
      ●软假测试要尽早准备,尽早执行。
      ●软件测试是根据被测物的不同而分层次进行的。不同层次的测试活动可以是按照某个次序先后进行的,但也可能是反复的。

      在H模型中,软件测试模型是一个独立的流程,贯穿于整个产品周期,与其他流程并发地进行。当某个测试时间点就绪时,软件测试即从测试准备阶段进入测试执行阶段。
    其他模型

      1、X模型

      介绍另外一种测试模型,即X模型,其目标是弥补V模型的一些缺陷。

      软件测试X模型如下图所示:



      X模型的基本思想是由Marick提出的,Marick对V模型最主要的批评是V模型无法引导项目的全部过程。他认为一个模型必须能处理开发的所有方面,包括交接、频繁重复的集成以及需求文档的缺乏等。Maricke认为一个模型不应该规定那些和当前所公认的实践不一致的行为。

      X模型左边描述的是针对单独程序片段所进行的相互分离的编码和测试,此后,将进行频繁的交接,通过集成最终合成为可执行的程序。这一点在图的右上方得以体现,而且这些可执行程序还需要进行测试,已通过集成测试的成品可以进行封版并提交给用户,也可以作为更大规模和范围内集成的一部分。

      同时,X模型还定位了探索性测试,即如图中右下方所示。这是不进行事先计划的特殊类型的测试,诸如“我这么测一下,结果会怎么样”,这一方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。

      Marick对V模型提出质疑,也是因为V模型是基于一套必须按照一定顺序严格排列的开发步骤,而这很可能并没有反映实际的实践过程。因为在实践过程中,很多项目是缺乏足够的需求的,而V模型还是从需求处理开始。

      Marick也质疑了单元测试和集成测试的区别,因为在某些场合人们可能会跳过单元测试而热衷于直接进行集成测试。Marick担心人们盲目地跟随“学院派的V模型”,按照模型所指导的步骤进行工作,而实际上某些做法并不切合实用。

      2、前置测试模型

      前置测试模型,它是将测试和开发紧密结合的模型,该模型提供了轻松的方式,可以使你的项目加快速度。

      前置测试模型如下图所示:


    前置测试模型体现了以下的要点:

      ●开发和测试相结合:前置测试模型将开发和测试生命周期整合在一起,标识了项目生命周期从开始到结束之间的关键行为。并且标识了这些行为在项目周期中的价值所在。如果其中有些行为没有得到很好的执行,那么项目成功的可能性就会因此而有所降低。如果有业务需求,则系统开发过程将更有效率。我们认为在没有业务需求的情况下进行开发和测试是不可能的。而且,业务需求最好在设计和开发之前就被正确定义。

      ●对每一个交付内容进行测试:每一个交付的开发结果都必须通过一定的方式进行测试。源程序代码并不是唯一需要测试的内容。图中的椭圆框表示了其他一些要测试的对象,包括可行性报告、业务需求说明,以及系统设计文档等。这同V模型中开发和测试的对应关系是一致的,并且在其基础上有所扩展,变得更为明确。

      ●在设计阶段进行测试计划和测试设计:设计阶段是作测试计划和测试设计的最好时机。很多组织要么根本不作测试计划和测试设计,要么在即将开始执行测试之前才飞快地完成测试计划和测试设计。在这种情况下,测试只是验证了程序的正确性,而不是验证整个系统本该实现的东西。

      ●测试和开发结合在一起:前置测试将测试执行和开发结合在一起,并在开发阶段以编码---测试---编码---测试的方式来体现。也就是说,程序片段一旦编写完成,就会立即进行测试。一般情况下,先进性的测试是单元测试,因为开发人员认为通过测试来发现错误是最经济的方式。但也可参考X模型,即一个程序片段也需要相关的集成测试,甚至有时还需要一些特殊测试。对于一个特定的程序片段,其测试的顺序可以按照V模型的规定,但其中还会交织一些程序片段的开发,而不是按阶段完全地隔离。

      ●让验收测试和技术测试保持相对独立:验收测试应该独立于技术测试,这样可以提供双重的保险,以保证设计及程序编码能够符合最终用户的要求。验收测试既可以在实施的第一步来执行,也可以在开发阶段的最后一步执行。前置测试模型提倡验收测试和技术测试沿循两条不同的路线来进行,每条路线分别地验证系统是否能够入预期设想的那样进行正常工作。这样,当单独设计好的验收测试完成了系统的验证时,我们即可确信这是一个正确的系统。

      测试模型的使用

      前面我们介绍了几种典型的测试模型,应该说这些模型对指导测试工作的进行具有重要的意义,但任何模型都不是完美的。我们应该尽可能地去应用模型中对项目有实用价值的方面,但不强行地为使用模型而使用模型,否则也没有实际意义。

      在这些模型中,V模型强调了在整个软件项目开发中需要经历的若干个测试级别,而且每一个级别都与一个开发级别相对应,但它忽略了测试的对象不应该仅仅包括程序,或者说它没有明确地之处应该对软件的需求、设计进行测试,而这一点在W模型中得到了补充。W模型强调了测试计划等工作的先行核对系统需求和系统设计的测试,但W模型和V模型一样也没有专门对软件测试流程予以说明,因为事实上,随着软件质量要求越来越为大家所重视,软件测试也逐步发展成为一个独立于软件开发部的组织,就每一个软件测试的细节而言,它都有一个独立的操作流程。比如,现在的第三方测试,就包含了从测试计划和测试案例编写,到测试实施以及测试报告编写的全过程,这个过程在H模型中得到了相应的体现,表现为测试是独立的。也就是说,只要测试前提具备了,就可以开始进行测试了。当然,X模型和前置测试模型又在此基础上增加了许多不确定因素的处理情况,因为在真实项目中,经常会有变更的发生,例如需要重新访问前一阶段的内容,或者跟踪并纠正以前提交的内容,修复错误,排除多余的成分,以及增加新发现的功能等。

      因此,在实际的工作中,我们要灵活地运用各种模型的优点,在W模型的框架下,运用H模型的思想进行独立地测试,并同时将测试与开发紧密结合,寻找恰当的就绪点开始测试并反复迭代测试,最终保证按期完成预定目标。
    44/4<1234
  • 如何有效测试手机通话测试

    2009-01-12 17:49:49

    大家知道,软件测试对软件的测试是有限的,而在项目进度比较紧,测试人员、时间有限的情况下,要进行充分的测试更是不可能!所以,如何在资源、时间有限的情况下测试的更有效,成了我们要思考的一个重要问题。以下以实例进行有关说明,大家对都用过手机,对手机的功能都不陌生,所以本文将全部用手机来做实例阐述!51Testing软件测试网1V XiO q/AN
    51Testing软件测试网-E$i9lzH
      例1.电话接打功能测试51Testing软件测试网Y\0F6DI _0j1d
    51Testing软件测试网2a,o;}I_-td9H
      对于电话接打这项手机最基本的功能,在实际测试中测试人员可能要进行上千次的测试,确保手机接打电话功能稳定可靠。
    UtX m ?H5jS44722
    uE^g V44722  对于这种功能的验证测试,有的测试人员可能每次测试的方法都相同,如同样的电话呼入后立刻接听,如此反复,测试几百次,检测软件的可靠性!电话呼出时,也是不变的方式,不断地重拨,重复几百次!51Testing软件测试网(H)t6L BE

    9F!P8gCr8b44722  分析:上述测试方法,当然可以,但是效率高吗?能够发现更多的问题吗?答案是否定的!
    4S9xGWd5\&B"w4472251Testing软件测试网s)^)` s"B6Z+m
      测试思路:
    HEi:g/Z0h.S'`|44722
    %b$e&]5pHl)O44722  对于这种问题,一定要注意拓展自己的思路,灵活进行,争取测试的效率和广度!51Testing软件测试网-d|;O6k:JX?
    51Testing软件测试网t^ {qh$m\ I&X#c1T
      对于来电,可以从以下角度进行测试:51Testing软件测试网I,j?9o K+A9E

    ?Ox2H?&u-p44722  第一,在接听电话时,可以注意在不同时间点接听,如刚刚响铃时接听,响铃一段时间后接听,响即将结束时接听!这样可能会发现更多的问题!51Testing软件测试网&Yz\B1JH{Y$g
    51Testing软件测试网}|+q BF o)L;N
      第二,来电时,可以在手机不同状态下来电,如手机进行菜单浏览、短消息查看等,不同状态下来电;
    R(s h}'d ~-I#P8r44722
    |:yaj-C{4e,t)an0U44722  第三,注意来电的时间间隔,如间隔时间很短的情况下来电和间隔一段时间的情况下来电;51Testing软件测试网j-FmQ0A v9niQo*A

    cM)Y].mD(W%x44722  第四,注意来电情况,如电话本中联系人来电和非电话本联系人来电;座机来电、移动电话来电和小灵通来电等;51Testing软件测试网;O;u3b7MZyw0`
    51Testing软件测试网R{n C6x(h0O&e1h|
      第五,在不同情景模式下,如静音模式、会议模式、标准模式等模式下来电。51Testing软件测试网7?#d }y(i4u

    Cy3e8V |g]NAp44722  第六,不同的接听方式,如设置成按任意键接听、应答键接听等不同接听方式.51Testing软件测试网b!T Y d3U G`d*t

    2AL\0M9~yA&jt44722  对于呼叫,在拨打电话时,可以从以下角度考虑:
    !R mp-f7H)A+G44722
    (Yc#v3F7w)s\44722  第一,直接输入数字进行拨打电话;
    l]U/JvT']s@#V%Q44722
    /Gs)~g/F*DX-n GIS44722  第二,从电话本中选择联系人呼叫;
    Pt:IC!`Mh44722
    OJ$\!~j:|0uj K-v44722  第三,从通话记录中选择联系人进行呼叫;51Testing软件测试网*_F_+RGQ*KcT
    51Testing软件测试网^h2ZRqAhor
      第四,从短消息中提取号码进行呼叫。
    *u4?Wk{44722
    GvJ(^s,V"^44722  另外,在进行这种电话接打测试的时候,可以考虑使用测试机对测试机器来进行,这样下来,一组电话接打功能的测试,测试覆盖率提高了很多!51Testing软件测试网 ^NtV xV]

    +[7M!Vb A\Ca44722  例2.短信查看+来电51Testing软件测试网4w[(@7@:Kr

    4c'`|R:mQ;z@44722  这也是最基本的一种测试,多任务测试。51Testing软件测试网6~2}/Ss.Ro hq
    51Testing软件测试网'khG1X%t)P
      分析:
    }7e:Ek ?y!q4472251Testing软件测试网&}q4y\vmM
      这里的来电,可以是固定电话,也可以是小灵通,也可以是手机;来电可以是电话本中的联系人,也可以是陌生电话来电。对此,如果能够把每种情况都测试一下当然最好不过了,但如果时间紧迫,无法一一测试,我们该如何测呢?51Testing软件测试网B"q1x5E.D
    51Testing软件测试网:\ c D)E B0{*Kj?'v
      测试思路:51Testing软件测试网 K0B;G(pJBI N
    51Testing软件测试网N,h-t7C4P
      本项主要是短消息模块和电话模块之间的干扰问题,我们在测试时,可以选择电话本中联系人来电,进行测试,这是因为在来电时,来电有多出了一个对电话本模块的查询、调用功能,如果这种情况下没有问题,那么非电话本中号码来电时,一般不会有问题,相应地我们就可以少进行一项测试。
    Uv;a$om4472251Testing软件测试网O,Oi_1J3H9K I*t*V
    例3.录像+来电51Testing软件测试网"q*Oz8\8]t IuY H

    .F~mCd8sT44722  现在手机功能越来越强大,具有录像功能的手机不在少数,所以录像时来电测试也是少不了的一项,进行这项测试时,我们可以从以下角度考虑。51Testing软件测试网-ofl5sN4t

    u0gG1s8r[b9le44722  测试思路:
    ;AS@Uy/pY44722
    n#s*Z6{Am^44722  录像时,电话本中联系人来电→接听来电→结束通话→查看、播放录像→录像播放时来电→接听、通话→结束通话51Testing软件测试网;d,karKua ["X7QL {
    51Testing软件测试网h%p(d9Z r"v
      这项我们在测试时进行了拓展,蓝色部分为拓展的测试项。这样做可以省去在录像播放时来电再进行录像这个环节,提高了效率,同时也检测了录像时来电对录像的干扰情况。51Testing软件测试网U[4[mx:m:l6n
    51Testing软件测试网D@G9c(A\8t9x
      例4.短信编辑+来电
    a[9I:d"hwK$b4472251Testing软件测试网 E e#@9z XCuye7h
      分析:进入短信编辑的方式很多,有直接进入短信菜单进行编辑,有回复短消息时进入短信编辑状态,有从电话本联系人中选择相应菜单进入短消息编辑。51Testing软件测试网@~"k?9L/J4\g
    51Testing软件测试网;h1hg.I8oZ)XQ
      测试思路:
    &q3{Y.Jw|X4472251Testing软件测试网#Y5f0UY/r'O"b$|.P
      我们测试时,此项测试主要是测试来电对短信编辑模块的影响。在测试时,可以直接选择回复短信的方式进入短信编辑模块,来电则为电话本中联系人来电。51Testing软件测试网(zb!w!lC#KD ~

    P/^Jl:gID;Z44722  例5.屏保与锁键盘测试51Testing软件测试网MRz Eu
    51Testing软件测试网)^jR,jDKR
      基本都有屏保功能吧,也都有锁键盘功能吧。既然有这些功能,那么就需要对这些功能进行测试。那我们该如何对他们进行测试呢?51Testing软件测试网+]cdP0{8bU@&[x
    51Testing软件测试网hm |;S i
      分开测试,各测各的!先在屏保下进行一系列的测试,如屏保启动时间、屏保显示界面以及屏保下来电,接收短消息的等一系列复杂的测试,一项一项测试完成大概需要半天的时间,测试完毕后再去测试锁键盘功能,如锁键盘启动时间、界面提示信息,锁键盘情况下来电、短信等等项。等全部测试完成大概又需要半天的时间。51Testing软件测试网W b8@0Lu BA+b+~+]
    51Testing软件测试网X%[ {jd
      其实,我们可以思考一下:这两项我们是否可以合并起来,一起测试呢?
    *V[/Er S+t44722
    %a;Z2L/]9~L/M3H]44722  答案是肯定的!51Testing软件测试网3J%^)FNRF

    }(S8f/JTx2o2n }44722  两项中的很大一部分内容都可以合并起来一起测试!即在屏保以及键盘锁同时启动的情况下进行测试,如果两者同时启动的情况下都是正常工作的,那么我们可以认为其在另一者关闭的情况下功能也一定是正常的!我们要明白一点:越是在复杂的情况下,手机出问题的可能性越大!51Testing软件测试网Dm2d"ZG"G

    n8@Jjx0L y0~44722  其实,我们还可以进一步拓展一下,我们同时启动LCD背光等项,将其合并起来一起测试!这种情况下在单位时间里不但增加了测试内容,而且更容易发现软件中的一些问题。另外,鉴于锁键盘以及屏保、LCD背光等,它们都有不同的启动时间,我们是否该将所有这些的排列组合全部测试一遍呢?这样的话,那你就等着累死或被老板解雇吧!在这里要注到测试的等价性.51Testing软件测试网V ? _,K@ u
    51Testing软件测试网 fd!ww2e H!t1V0PQ
      太多了,更深入的就不说了!
    l'bD)b7k}U44722
    `\J4dl`E44722  小结:51Testing软件测试网%CYI%g5Q(u d`
    51Testing软件测试网N.o(n M Z7i
      在提高测试效率上,我们一定要抓住懂得哪些测试可以合并一起来测,哪些项出问题的可能性比较大,也一定要知道哪些地方是重点!51Testing软件测试网v#k,\\ WA

    n{"c&pc4H$j:gL*P44722  如何在人力资源紧缺的状态下,如何在有限的时间里发现更多的问题和更广的测试是值得我们深入思考的!宏观上而言,一个版本先测哪些后测哪些和不测哪些可以说是一个战略问题,而具体到测试时,如何在有限的时间里发现一个测试项所存在的问题则又是一个战术问题。 战略和战术如何有效地配合?如何更有效的测试。51Testing软件测试网 V5IP0B$[

    D-_x5Ke;Mb]8y44722
  • 软件测试流程

    2008-12-11 14:19:27

    件测试从哪里开始到哪里结束?中间要经过哪些环节以及各环节要注意哪些事项。本文就有关问题结合个人实际工作经验进行阐述,鉴于每个环节都可以做为一个专题来进行探讨,所以受篇幅和时间限制,本文对有关问题未做深入剖析,只做一个宏观上的介绍。

    【关键词】测试流程、需求分析、测试用例、测试计划、缺陷管理

     

    一、概述

     

    一般而言,软件测试从项目确立时就开始了,前后要经过以下一些主要环节:

    需求分析→测试计划→测试设计→测试环境搭建→测试执行→测试记录→缺陷管理→软件评估→RTM.

     

    在进行有关问题阐述前,我们先明确下分工,一般而言,需求分析、测试用例编写、测试环境搭建、测试执行等属于测试开发人员工作范畴,而测试执行以及缺陷提交等属于普通测试人员的工作范畴,测试负责人负责整个测试各个环节的跟踪、实施、管理等。

    说明:

    1.以上流程各环节并未包含软件测试过程的全部,如根据实际情况还可以实施一些测试计划评审、用例评审,测试培训等。在软件正式发行后,当遇到一些严重问题时,还需要进行一些后续维护测试等。

     

    2.以上各环节并不是独立没联系的,实际工作千变万化,各环节一些交织、重叠在所难免,比如编写测试用例的同时就可以进行测试环境的搭建工作,当然也可能由于一些需求不清楚而重新进行需求分析等。这就和我们国家提出建设有中国特色的社会主义国家一样,只所以有中国特色,那是因为国情不一样。所以在实际测试过程中也要做到具体问题具体分析,具体解决。

     

    二、测试流程

     

     

        

    需求分析

     

    需求分析(Requirment Analyzing)应该说是软件测试的一个重要环节,测试开发人员对这一环节的理解程度如何将直接影响到接下来有关测试工作的开展。

    可能有些人认为测试需求分析无关紧要,这种想法是很不对的。需求分析不但重要,而且至关重要!

     

    一般而言,需求分析包括软件功能需求分析、测试环境需求分析、测试资源需求分析等。

     

    其中最基本的是软件功能需求分析,测一款软件首先要知道软件能实现哪些功能以及是怎样实现的。比如一款Smartphone包括VoIPWi-Fi以及Bluetooth等功能。那我们就应该知道软件是怎样来实现这些功能的,为了实现这些功能需要哪些测试设备以及如何搭建相应测试环境等,否则测试就无从谈起!

     

    既然谈了需求分析,那么我们根据什么来分析呢?总不能凭空设想吧。

     

    总得说来,做测试需求分析的依据有软件需求文档、软件规格书以及开发人员的设计文档等,相信管理一些规范的公司在软件开发过程中都有这些文档。

     

    测试计划

      

    测试计划(Test Plan)一般由测试负责人来编写。

     

       测试计划的依据主要是项目开发计划和测试需求分析结果而制定。测试计划一般包括以下一些方面:

     

    1.  测试背景

    a.       软件项目介绍;

    b.       项目涉及人员(如软硬件项目负责人等)介绍以及相应联系方式等。

    2.  测试依据

    a.       软件需求文档;

    b.       软件规格书;

    c.       软件设计文档;

    d.       其他,如参考产品等。

    3.  测试资源

    a.       测试设备需求;

    b.       测试人员需求;

    c.       测试环境需求;

    d.       其他。

    4.  测试策略

    a.       采取测试方法

    b.       搭建哪些测试环境;

    c.       采取哪些测试工具测试管理工具;

    d.       对测试人员进行培训等。

    5.  测试日程

    a.       测试需求分析;

    b.       测试用例编写;

    c.       测试实施,根据项目计划,测试分成哪些测试阶段(如单元测试、集成测试、系统测试阶段,α、β测试阶段等),每个阶段的工作重点以及投入资源等。

    6.  其他。

     

    测试计划还要包括测试计划编写的日期、作者等信息,计划越详细越好了。

    计划赶不上变化,一份计划做的再好,当实际实施的时候就会发现往往很难按照原有计划开展。如在软件开发过程中资源匮乏、人员流动等都会对测试造成一定的影响。所以,这些就要求测试负责人能够从宏观上来调控了。在变化面前能够做到应对自如、处乱不惊那是最好不过了。

     

    测试设计

     

    测试设计主要包括测试用例编写和测试场景设计两方面。

     

    一份好的测试用例对测试有很好的指导作用,能够发现很多软件问题。关于测试用例编写,请参见前面写的《也谈测试用例》一文,里面有详细阐述。

     

    测试场景设计主要也就是测试环境问题了。

     

    测试环境搭建

     

    不同软件产品对测试环境有着不同的要求。如C/SB/S架构相关的软件产品,那么对不同操作系统,如Windows系列、unixlinux甚至苹果OS等,这些测试环境都是必须的。而对于一些嵌入式软件,如手机软件,如果我们想测试一下有关功能模块的耗电情况,手机待机时间等,那么我们可能就需要搭建相应的电流测试环境了。当然测试中对于如手机网络等环境都有所要求。

     

    测试环境很重要,符合要求的测试环境能够帮助我们准确的测出软件问题,并且做出正确的判断。

     

    为了测试一款软件,我们可能根据不同的需求点要使用很多不同的测试环境。有些测试环境我们是可以搭建的,有些环境我们无法搭建或者搭建成本很高。不管如何,我们的目标是测试软件问题,保证软件质量。测试环境问题,还是根据具体产品以及开发者的实际情况而采取最经济的方式吧。

     

    测试执行

        

    测试执行过程又可以分为以下阶段:

     

    单元测试→集成测试→系统测试→出厂测试,其中每个阶段还有回归测试等。

     

    从测试的角度而言,测试执行包括一个量和度的问题。也就是测试范围和测试程度的问题。 比如一个版本需要测试哪些方面?每个方面要测试到什么程度?

     

    从管理的角度而言,在有限的时间内,在人员有限甚至短缺的情况下,要考虑如何分工,如何合理地利用资源来开展测试。当然还要考虑以下问题:

    1.  当测试人员测试的执行不到位、敷衍了事时该如何解决?

    2.  测试效率问题,怎样提高测试效率?

    3.  根据版本的不同特点是只做验证测试还是采取冒烟测试亦或是系统全面测试?

    4.  当测试过程中遇到一些偶然性随机问题该怎样处理?

    5.  当版本中出现很多新问题时该怎样对待?测试停止标准?

    6.  ……

    总之,测试执行过程中会遇到很多复杂的问题,还是那句话,具体问题具体解决!本文不做过多阐述。

     

    测试记录

     

    缺陷记录总的说来包括两方面:由谁提交和缺陷描述。

     

    一般而言,缺陷都是谁测试谁提交,当然有些公司可能为了保证所提交缺陷的质量,还会在提交前进行缺陷评估,以确保所提交的缺陷的准确性。

     

    在缺陷的描述上,至少要包括以下一些方面内容:

    序号

    标题

    预置条件

    操作步骤

    预期结果

    实际结果

    注释

    严重程度

    概率

    版本

    测试者

    测试日期

     

    以上是描述一个bug时通常所要描述的内容,当然在实际提交bug时可以根据实际情况进行补充,如附上图片、log文件等。

     

    另外,一个版本软件测试完毕,还要根据测试情况出份测试报告,这也是所要经过的一个环节。

     

    缺陷管理

     

    缺陷管理方面,很多公司都采取缺陷管理工具来进行管理,常见缺陷管理工具有Test DirectorBugfree等。

     

    下图是一个bug从提出到close所经过的一些流程,其他比如keep No action\keep spec等一些状态流程都未包含在内,在此仅做示范说明。

     

     

    注:软件缺陷和bug两者在含义上有着细微差别,本文统称缺陷。

     

    软件评估

     

    这里评估指软件经过一轮又一轮测试后,确认软件无重大问题或者问题很少的情况下,对准备发给客户的软件进行评估,以确定是否能够发行给客户或投放市场。

    软件评估小组一般由项目负责人、营销人员、部门经理等组成,也可能是由客户指定的第三方人员组成。

     

    测试总结

     

    每个版本有每个版本的测试总结,每个阶段有每个阶段的测试总结,当项目完成RTM后,一般要对整个项目做个回顾总结,看有哪些做的不足的地方,有哪些经验可以对今后的测试工作做借鉴使用,等等。测试总结无严格格式、字数限制。应该说,测试总结还是很总要的。

     

    测试维护

     

       由于测试的不完全性,当软件正式release后,客户在使用过程中,难免遇到一些问题,有的甚至是严重性的问题,这就需要修改有关问题,修改后需要再次对软件进行测试、评估、发行。

     

  • 关于手机内存泄露问题

    2008-12-04 16:48:15

    一: 内存泄漏
    内存泄漏是编程中常常见到的一个问题. 内存泄漏往往会一种奇怪的方式来表现出来,基本上每个程序都表现出不同的方式. 但是一般最后的结果只有两个,一个是程序当掉.一个是系统内存不足. 还有一种就是比较介于中间的结果程序不会当,但是系统的反映时间明显降低,需要定时的Reboot才会正常.

    有一个很简单的办法来检查一个程序是否有内存泄漏.就是是用Windows的任务管理器(Task Manager).   运行程序,然后在任务管理器里面查看 “内存使用”和”虚拟内存大小”两项,当程序请求了它所需要的内存之后,如果虚拟内存还是持续的增长的话,就说明了这个程序有内存泄漏问题. 当然如果内存泄漏的数目非常的小,用这种方法可能要过很长时间才能看的出来.

    当然最简单的办法大概就是用CompuWare的BoundChecker 之类的工具来检测了,不过这些工具的价格对于个人来讲稍微有点奢侈了.

    如果是已经发布的程序,检查是否有内存泄漏是又费时又费力. 所以内存泄漏应该在Code的生成过程就要时刻进行检查.
    二: 原因
    而内存泄漏产生的原因一般是三种情况: 1.分配完内存之后忘了回收.2. 程序Code有问题,造成没有办法回收.3.某些API函数操作不正确,造成内存泄漏.
    1.     内存忘记回收,这个是不应该的事情.但是也是在代码种很常见的问题.分配内存之后,用完之后,就一定要回收. 如果不回收,那就造成了内存的泄漏,造成内存泄漏的Code如果被经常调用的话,那内存泄漏的数目就会越来越多的.从而影响整个系统的运行. 比如下面的代码
    for (int =0;I<100;I++)
    {
         Temp =   new BYTE[100];
    }
    就会产生 100*100Byte的内存泄漏.
    2.     在某些时候,因为代码上写的有问题,会导致某些内存想回收都收不回来,比如下面的代码
    Temp1 = new BYTE[100];
    Temp2 = new BYTE[100];
    Temp2 = Temp1;
    这样,Temp2的内存地址就丢掉了,而且永远都找不回了,这个时候Temp2的内存空间想回收都没有办法.

    3.     API函数应用不当,在Windows提供API函数里面有一些特殊的API,比如FormatMessage.   如果你给它参数中有FORMAT_MESSAGE_ALLOCATE_BUFFER,它会在函数内部New一块内存Buffer出来.但是这个buffer需要你调用LocalFree来释放. 如果你忘了,那就会产生内存泄漏.

    三: 检查方法

    一般的内存泄漏检查的确是很困难,但是也不是完全没有办法.如果你用VC的库来写东西的话,那么很幸运的是,你已经有了很多检查内存泄漏的工具,只是你想不想用的问题了. Visual C++的Debug版本的C运行库(C Runtime Library).它已经提供好些函数来帮助你诊断你的代码和跟踪内存泄漏. 而且最方便的地方是这些函数在Release版本中完全不起任何作用,这样就不会影响你的Release版本程序的运行效率.
    比如下面的例子里面,有一个明细的内存泄漏.当然如果只有这么几行代码的话,是很容易看出有内存泄漏的.但是想在成千上万行代码里面检查内存泄漏问题就不是那么容易了.
         char * pstr = new char[5];
         lstrcpy(pstr,"Memory leak");
    我们如果我们在Debug版本的Code里面对堆(Heap)进行了操作,包括malloc, free, calloc, realloc, new, 和 delete可以利用VC Debug运行时库中堆Debug函数来做堆的完整性和安全性检查. 比如上面的代码,lstrcpy的操作明显破坏了pstr的堆结构.使其溢出,并破坏了临近的数据.那我们可以在调用lstrcpy之后的代码里面加入_CrtCheckMemory函数._CrtCheckMemory函数发现前面的lstrcpy使得pstr的堆结构被破坏,会输出这样的报告:
    emory check error at 0x00372FA5 = 0x79, should be 0xFD.
    memory check error at 0x00372FA6 = 0x20, should be 0xFD.
    memory check error at 0x00372FA7 = 0x6C, should be 0xFD.
    memory check error at 0x00372FA8 = 0x65, should be 0xFD.
    DAMAGE: after Normal block (#41) at 0x00372FA0.
    Normal located at 0x00372FA0 is 5 bytes long.
    它告诉说 pstr的长度应该时5个Bytes,但是在5Bytes后面的几个Bytes也被非法改写了.提醒你产生了越界操作.
    _CrtCheckMemory的返回值只有TRUE和FALSE,那么你可以用_ASSERTE()来报告出错信息. 上面的语句可以换成 _ASSERTE(_CrtCheckMemory()); 这样Debug版本的程序在运行的时候就会弹出一个警告对话框,如图1,这样就不用在运行时候一直盯着Output窗口看了.这个时候按Retry,就可以进入源代码调试了.看看问题到底出在哪里

                         图1
    其他类似的函数还有_CrtDbgReport, _CrtDoForAllClientObjects, _CrtDumpMemoryLeaks,_CrtIsValidHeapPointer, _CrtIsMemoryBlock, _CrtIsValidPointer,_CrtMemCheckpoint, _CrtMemDifference, _CrtMemDumpAllObjectsSince, _CrtMemDumpStatistics, _CrtSetAllocHook, _CrtSetBreakAlloc, _CrtSetDbgFlag,_CrtSetDumpClient, _CrtSetReportFile, _CrtSetReportHook, _CrtSetReportMode
    这些函数全部都可以用来在Debug版本中检查内存的使用情况.具体怎么使用这些函数就不在这里说明了,各位可以去查查MSDN.
    在这些函数中用处比较大的,或者说使用率会比较高的函数是,_CrtMemCheckpoint 设置一个内存检查点.这个函数会取得当前内存的运行状态.   _CrtMemDifference 检查两种内存状态的异同. _CrtMemDumpAllObjectsSince 从程序运行开始,或者从某个内存检查点开始Dump出堆中对象的信息. 还有就是_CrtDumpMemoryLeaks当发生内存溢出的时候Dump出堆中的内存信息. _CrtDumpMemoryLeaks一般都在有怀疑是内存泄漏的代码后面调用,比如下面的例子
    #include <windows.h>
    #include <crtdbg.h>
    void main()
    {
    char * pstr;
    pstr = new char[5];
    _CrtDumpMemoryLeaks();
    }
        输出:
         Detected memory leaks!   à提醒你,代码有内存泄漏.
    Dumping objects ->
    {44} normal block at 0x00372DB8, 5 bytes long.
          Data: <      > CD CD CD CD CD
    Object dump complete.
    如果你双击包含行文件名的输出行,指针将会跳到源文件中内存被分配地方的行.
    当无法确定那些代码产生了内存泄漏的时候,我们就需要进行内存状态比较. 在可疑的代码段的前后设置内存检查点,比较内存使用是否有可疑的变化.以确定内存是否有泄漏.为此要先定义三个_CrtMemState 对象来保存要比较的内存状态.两个是用来比较,一个用了保存前面两个之间的区别
    _CrtMemState Sh1,Sh2,Sh_Diff;
    char *pstr1 = new char[100];
    _CrtMemCheckPoint(&Sh1);   ->设置第一个内存检查点
    char   *pstr2 = new char[100];
       _CrtMemCheckPoint(&Sh2); ->设置第二个内存检查点
       _CrtMemDifference(&Sh_Diff, &Sh1, &Sh2);   ->检查变化
       _CrtMemDumpAllObjectsSince(&Sh_Diff);    ->Dump变化

    如果你的程序中使用了MFC类库,那么内存泄漏的检查方法就相当的简单了.因为Debug版本的MFC本身就提供一部分的内存泄漏检查. 大部分的new 和delete没有配对使用而产生的内存泄漏,MFC都会产生报告.这个主要是因为MFC重载了Debug版本的new 和delete操作符. 并且对前面提到的API函数重新进行了包装.在MFC类库中检查内存泄漏的Class就叫 CMemoryState,它重新包装了了_CrtMemState, _CrtMemCheckPoint, _CrtMemDifference, _CrtMemDumpAllObjectsSince这些函数.并对于其他的函数提供了Afx开头的函数,供MFC程序使用 比如 AfxCheckMemory, AfxDumpMemoryLeaks 这些函数的基本用法同上面提到的差不多. CMemoryState和相关的函数的定义都在Afx.h这个头文件中. 有个简单的办法可以跟踪到这些函数的申明. 在VC中找到MFC程序代码中下面的代码, 一般都在X.cpp的开头部分
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    把光标移到DEBUG_NEW上面 按F12,就可以进入Afx.h中定义这些Class和函数的代码部分. VC中内存泄漏的常规检查办法主要是上面的两种.当然这两种方法只是针对于Debug版本的Heap的检查.如果Release版本中还有内存泄漏,那么检查起来就麻烦很多了.
    4 .总结:
         实际上Heap的内存泄漏问题是相当的好查的.VC的提供的检查工具也不太少,但是如果是栈出了什么问题,恐怕就麻烦很多了. 栈出问题,一般不会产生内存泄漏,但是你的代码的逻辑上很有可能会有影响.这个是最最痛苦的事情. 编程,就是小心,小心再小心而已.
    (本文未最后定稿,处于修改之中,文中有图限于专栏的限制,以去掉,但是不影响阅读)
  • 职业成长需要有计划的跳槽

    2008-11-18 10:00:54

            

       对于频繁跳槽的理解,各人各公司认同感并不相同,不过我要说的是,频繁跳槽并不一定是坏事,有些公司的招聘者,尤其是国际性的大公司并不会对一个频繁跳槽的人抱有成见,相反,如果你的思路清晰,跳槽的轨迹是按你自己的职业发展计划来说的,反而更让人觉得有价值,进一家公司,一般业务不复杂的,一个月就能上手,对于业务复杂的,可能需要的时间多一些,不过完全熟悉你手头的工作,顶多也就是三五个月到顶,熟悉了手头的工作后,就进入了一个学习阶段了,在自己的工作中积累和学习、探索,一般几个月时间,工作就变得简单而重复了,这时就有两种选择:一种是工作一段时间,比如二三年,另一种则为跳槽开始做准备了。

      我们大家在成长的阶段,都或多或少的有一个目标或是期望达到的层次,比如我自己的过程便是如此:

      1.入行 在刚进入测试行业的时候,就对自动化和性能的工作有强烈的欲望,哪怕是沾点边也好,然后我就开始做些准备了,学习工具、别人的经验等,只有这样机会来了的时候才能抓住,在几个月后果然如愿,非专职的负责了这一块的工作,辅助专职人员打点杂。

      2.起步--第一次跳槽 几个月之后,对这些工作慢慢熟悉,不过离专职还是有点距离,这时便可以跳槽到一家新的公司,能让自己更大比例的接触到这些工作,并能使自己学习到新的知识和拿到更多的薪水,薪水也是很重要的因素,这样你就能更安心的工作和有经济来支持你必要的学习培训,这个阶段的周期视人而定,如果你有强烈的求知欲望和学习精神,可能一年后就能再次跳槽了,接下来的时间就要为下次跳槽做准备了。

      3.发展--第二次跳槽  一年或更多时间后,慢慢的应该会积累知识和经验到了一定的程度,这时应该就有二三年经验了,是选择再次跳槽的时候了,这时对工作的选择就会有两种方向了,一种是朝管理发展,对于这种你在第一次挑槽后就应该开始积累和学习管理经验,另一种是继续技术发展,这一种一般就会寻找专职的自动化、性能等职位,我就是朝这条路走的,下一步?我的还没有来到,不过这个时间会比第一次跳槽到第二次跳槽的时间长一些了,这个时候,技术仍是主旋律,而业务行业知识的积累就变得重要起来了,因为这是为下次跳槽做准备了。

      4.稳定--第三次跳槽   这时的选择不再是单纯的职位选择和薪水了,更重要的是选择一个行业发展了,因为从这次跳槽开始就进入了一个职业稳定阶段了,做行业专家、测试资深顾问或是mannager就要看你自己的规划和安排了。

      你要问稳定后再跳槽?这我就不知道了,我目前给自己还是规划到稳定阶段,呵呵,总之一句话,多次跳槽并不是对企业不忠诚、也不会产生对自己职业发展不利,相反,如果你能按自己的规划做个理智的、果然的跳槽,将会使你更成功,企业真正缺的才是这种人,而不是占个位置拿份薪水过日子的人。


  • 回归测试

    2008-08-29 12:01:15

    作者简介:李丹(1978-),女,江苏如东人,信息产业部电子第五研究所助理工程师,从事软件可靠性研究及测试工作

    一、 概述

    在软件生命周期中的任何一个阶段,只要软件发生了改变,就可能给该软件带来问题。软件的改变可能是源于发现了错误并做了修改,也有可能是因为在集成或维护阶段加入了新的模块。当软件中所含错误被发现时,如果错误跟踪与管理系统不够完善,就可能会遗漏对这些错误的修改;而开发者对错误理解的不够透彻,也可能导致所做的修改只修正了错误的外在表现,而没有修复错误本身,从而造成修改失败;修改还有可能产生副作用从而导致软件未被修改的部分产生新的问题,使本来工作正常的功能产生错误。同样,在有新代码加入软件的时候,除了新加入的代码中有可能含有错误外,新代码还有可能对原有的代码带来影响。因此,每当软件发生变化时,我们就必须重新测试现有的功能,以便确定修改是否达到了预期的目的,检查修改是否损害了原有的正常功能。同时,还需要补充新的测试用例来测试新的或被修改了的功能。为了验证修改的正确性及其影响就需要进行回归测试。

    回归测试在软件生命周期中扮演着重要的角色,因忽视回归测试而造成严重后果的例子不计其数,导致阿里亚娜5型火箭发射失败的软件缺陷就是由于复用的代码没有经过充分的回归测试造成的。

    回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中,更是要求每天都进行若干次回归测试。因此,通过选择正确的回归测试策略来改进回归测试的效率和有效性是非常有意义的。

    二、 回归测试策略

    对于一个软件开发项目来说,项目的测试组在实施测试的过程中会将所开发的测试用例保存到“测试用例库”中,并对其进行维护和管理。当得到一个软件的基线版本时,用于基线版本测试的所有测试用例就形成了基线测试用例库。在需要进行回归测试的时候,就可以根据所选择的回归测试策略,从基线测试用例库中提取合适的测试用例组成回归测试包,通过运行回归测试包来实现回归测试。保存在基线测试用例库中的测试用例可能是自动测试脚本,也有可能是测试用例的手工实现过程。

    回归测试需要时间、经费和人力来计划、实施和管理。为了在给定的预算和进度下,尽可能有效率和有效力地进行回归测试,需要对测试用例库进行维护并依据一定的策略选择相应的回归测试包。

    1、测试用例库的维护

    为了最大限度地满足客户的需要和适应应用的要求,软件在其生命周期中会频繁地被修改和不断推出新的版本,修改后的或者新版本的软件会添加一些新的功能或者在软件功能上产生某些变化。随着软件的改变,软件的功能和应用接口以及软件的实现发生了演变,测试用例库中的一些测试用例可能会失去针对性和有效性,而另一些测试用例可能会变得过时,还有一些测试用例将完全不能运行。为了保证测试用例库中测试用例的有效性,必须对测试用例库进行维护。同时,被修改的或新增添的软件功能,仅仅靠重新运行以前的测试用例并不足以揭示其中的问题,有必要追加新的测试用例来测试这些新的功能或特征。因此,测试用例库的维护工作还应包括开发新测试用例,这些新的测试用例用来测试软件的新特征或者覆盖现有测试用例无法覆盖的软件功能或特征。

    测试用例的维护是一个不间断的过程,通常可以将软件开发的基线作为基准,维护的主要内容包括下述几个方面。

    (1)、删除过时的测试用例

    因为需求的改变等原因可能会使一个基线测试用例不再适合被测试系统,这些测试用例就会过时。例如,某个变量的界限发生了改变,原来针对边界值的测试就无法完成对新边界测试。所以,在软件的每次修改后都应进行相应的过时测试用例的删除。

    (2)、改进不受控制的测试用例

    随着软件项目的进展,测试用例库中的用例会不断增加,其中会出现一些对输入或运行状态十分敏感的测试用例。这些测试不容易重复且结果难以控制,会影响回归测试的效率,需要进行改进,使其达到可重复和可控制的要求。

    (3)、删除冗余的测试用例

    如果存在两个或者更多个测试用例针对一组相同的输入和输出进行测试,那么这些测试用例是冗余的。冗余测试用例的存在降低了回归测试的效率。所以需要定期的整理测试用例库,并将冗余的用例删除掉。

    (4)、增添新的测试用例

    如果某个程序段、构件或关键的接口在现有的测试中没有被测试,那么应该开发新测试用例重新对其进行测试。并将新开发的测试用例合并到基线测试包中。

    通过对测试用例库的维护不仅改善了测试用例的可用性,而且也提高了测试库的可信性,同时还可以将一个基线测试用例库的效率和效用保持在一个较高的级别上。

    2、回归测试包的选择

    在软件生命周期中,即使一个得到良好维护的测试用例库也可能变得相当大,这使每次回归测试都重新运行完整的测试包变得不切实际。一个完全的回归测试包括每个基线测试用例,时间和成本约束可能阻碍运行这样一个测试,有时测试组不得不选择一个缩减的回归测试包来完成回归测试。

    回归测试的价值在于它是一个能够检测到回归错误的受控实验。当测试组选择缩减的回归测试时,有可能删除了将揭示回归错误的测试用例,消除了发现回归错误的机会。然而,如果采用了代码相依性分析等安全的缩减技术,就可以决定哪些测试用例可以被删除而不会让回归测试的意图遭到破坏。

    选择回归测试策略应该兼顾效率和有效性两个方面。常用的选择回归测试的方式包括:

    (1)、再测试全部用例

    选择基线测试用例库中的全部测试用例组成回归测试包,这是一种比较安全的方法,再测试全部用例具有最低的遗漏回归错误的风险,但测试成本最高。全部再测试几乎可以应用到任何情况下,基本上不需要进行分析和重新开发,但是,随着开发工作的进展,测试用例不断增多,重复原先所有的测试将带来很大的工作量,往往超出了我们的预算和进度。

    (2)、基于风险选择测试

    可以基于一定的风险标准来从基线测试用例库中选择回归测试包。首先运行最重要的、关键的和可疑的测试,而跳过那些非关键的、优先级别低的或者高稳定的测试用例,这些用例即便可能测试到缺陷,这些缺陷的严重性也仅有三级或四级。一般而言,测试从主要特征到次要特征。

    (3)、基于操作剖面选择测试

    如果基线测试用例库的测试用例是基于软件操作剖面开发的,测试用例的分布情况反映了系统的实际使用情况。回归测试所使用的测试用例个数可以由测试预算确定,回归测试可以优先选择那些针对最重要或最频繁使用功能的测试用例,释放和缓解最高级别的风险,有助于尽早发现那些对可靠性有最大影响的故障。这种方法可以在一个给定的预算下最有效的提高系统可靠性,但实施起来有一定的难度。

    (4)、再测试修改的部分

    当测试者对修改的局部化有足够的信心时,可以通过相依性分析识别软件的修改情况并分析修改的影响,将回归测试局限于被改变的模块和它的接口上。通常,一个回归错误一定涉及一个新的、修改的或删除的代码段。在允许的条件下,回归测试尽可能覆盖受到影响的部分。

    再测试全部用例的策略是最安全的策略,但已经运行过许多次的回归测试不太可能揭示新的错误,而且很多时候,由于时间、人员、设备和经费的原因,不允许选择再测试全部用例的回归测试策略,此时,可以选择适当的策略进行缩减的回归测试。

    3、回归测试的基本过程

    有了测试用例库的维护方法和回归测试包的选择策略,回归测试可遵循下述基本过程进行:

    (1). 识别出软件中被修改的部分;

    (2). 从原基线测试用例库T中,排除所有不再适用的测试用例,确定那些对新的软件版本依然有效的测试用例,其结果是建立一个新的基线测试用例库T0。

    (3). 依据一定的策略从T0中选择测试用例测试被修改的软件。

    (4). 如果必要,生成新的测试用例集T1,用于测试T0无法充分测试的软件部分。

    (5). 用T1执行修改后的软件。

    第(2)和第(3)步测试验证修改是否破坏了现有的功能,第(4)和第(5)步测试验证 修改工作本身。

    三、 回归测试实践

    在实际工作中,回归测试需要反复进行,当测试者一次又一次地完成相同的测试时,这些回归测试将变得非常令人厌烦,而在大多数回归测试需要手工完成的时候尤其如此,因此,需要通过自动测试来实现重复的和一致的回归测试。通过测试自动化可以提高回归测试效率。为了支持多种回归测试策略,自动测试工具应该是通用的和灵活的,以便满足达到不同回归测试目标的要求。

    在测试软件时,应用多种测试技术是常见的。当测试一个修改了的软件时,测试者也可能希望采用多于一种回归测试策略来增加对修改软件的信心。不同的测试者可能会依据自己的经验和判断选择不同的回归测试技术和策略。

    回归测试并不减少对系统新功能和特征的测试需求,回归测试包应包括新功能和特征的测试。如果回归测试包不能达到所需的覆盖要求,必须补充新的测试用例使覆盖率达到规定的要求。

    回归测试是重复性较多的活动,容易使测试者感到疲劳和厌倦,降低测试效率,在实际工作中可以采用一些策略减轻这些问题。例如,安排新的测试者完成手工回归测试,分配更有经验的测试者开发新的测试用例,编写和调试自动测试脚本,做一些探索性的或ad hoc测试。还可以在不影响测试目标的情况下,鼓励测试者创造性地执行测试用例,变化的输入、按键和配置能够有助于激励测试者又能揭示新的错误。

    在组织回归测试时需要注意两点,首先是各测试阶段发生的修改一定要在本测试阶段内完成回归,以免将错误遗留到下一测试阶段。其次,回归测试期间应对该软件版本冻结,将回归测试发现的问题集中修改,集中回归。

    在实际工作中,可以将回归测试与兼容性测试结合起来进行。在新的配置条件下运行旧的测试可以发现兼容性问题,而同时也可以揭示编码在回归方面的错误。

    参考文献:

    [1] Glenford J.Myers,计算机软件测试技巧,清华大学出版社,1985。

    [2] Robert V. Binder,面向对象系统的测试,人民邮电出版社,2001。

    [3] Rex Black, 测试流程管理,北京大学出版社,2001。

  • 今天开通了空间

    2008-08-12 13:39:40

    今天是2008年08月12号,是个特别的日子,因为中国在2008年奥运会上截止现在刚刚取得了第10枚金牌。也因为我今天在这个经常来逛的论坛上开通了自己的空间,一个隐秘的确又开放的秘密花园。

    开通空间的初衷只是被一个blogger的文章触动,看到她的文章有种发现另一个自己的感觉,所以也开通了空间。希望在这个空间里,能够认识自己的不足,学习和记住别人的长处,让自己在工作三年之际能找回当初的热血沸腾,斗志盎然的自己。

Open Toolbar