发布新日志

  • 05上半年评测师考题与分析答案

    2008-07-16 11:25:30

     全国计算机技术与软件专业技术资格(水平)考试
               2005年上半年  网络工程师上午试卷
              (考试时间9:00—11:30  共150分钟)
    请按下述要求正确填写答题卡
      1.在答题卡的指定位置上正确写入你的姓名和准考证号,并用正规2B铅笔在你写入的准考证号下填涂准考证号。
      2.本试卷的试题中共有75个空格,需要全部解答,每个空格1分,满分75分。
      3.每个空格对应一个序号,有A、B、C、D四个选项,请选择一个最恰当的选项作为解答,在答题卡相应序号下填涂该选项。
      4.解答前务必阅读例题和答题卡上的例题填涂样式及填涂注意事项。解答时用正规2B铅笔正确填涂选项,如需修改,请用橡皮擦干净,否则会导致不能正确评分。
    例题
        ●2005年上半年全国计算机技术与软件专业技术资格(水平)考试日期是(88)月(89)日。
        (88)A.4    B.5    C.6    D.7
        (89)A.27    B.28    C.29    D.30
    因为考试日期是“5月29日”,故(88)选B,(89)选C,应在答题卡序号88下对B填涂,在序号89下对C填涂(参看答题卡)。
        ●在计算机中,最适合进行数字加减运算的数字编码是(1),最适合表示浮点数阶码的数字编码是(2)
        (1)A.原码    B.反码    C补码    D.移码
        (2)A.原码  B.反码    C补码    D.移码
    【解析】  (1) C   (2)D
        ●如果主存容量为16M字节,且按字节编址,表示该主存地址至少应需要 (3) 位。
    (3)A.16    B.20    C.24    D.32
    【解析】16M=2^24   选C
        ●操作数所处的位置,可以决定指令的寻址方式。操作数包含在指令中,寻址方式为  (4);操作数在寄存器中,寻址方式为  (5);操作数的地址在寄存器中,寻址方式为  (6)
        (4)立即寻址    B.直接寻址
        C寄存器寻址    D寄存器间接寻址
        (5)A.立即寻址    B.相对寻址
        C寄存器寻址    n寄存器间接寻址
        (6)A.相对寻址    B.直接寻址
    C寄存器寻址    D.寄存器间接寻址
    【解析】
    微机系统有七种基本的寻址方式:
    1操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
    2指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
    3指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
    4操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
    5操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和,称为寄存器相对寻址方式。
    6操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。称为基址加变址寻址方式。
    7操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和,称为相对基址加变址寻址方式。
    (4) A  (5) C   (6)D
        ●两个部件的可靠度R均为0.8,由这两个部件串联构成的系统的可靠度为(7);由这两个部件并联构成的系统的可靠度为  (8)。
        (7)A.0.80    B。0.64    C.0.90    D.0.96   
    (8)A.0.80    B.0.64    C.0.90    D.0.96
    【解析】系统可靠度计算 并联系统:1-(1-p1)(1-p2) 串联系统:p1p2 (p为单个系统的可靠度),所以 (7) B  (8) D
        ●在计算机系统中,构成虚拟存储器(9)。
        (9)A.只需要一定的硬件资源便可实现 
        B.只需要一定的软件即可实现
        C.既需要软件也需要硬件方可实现
    D.既不需要软件也不需要硬件
    【解析】虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。选 C。
        ●两个公司希望通过Intemet进行安全通信,保证从信息源到目的地之间的数据传输以密文形式出现,而且公司不希望由于在中间节点使用特殊的安全单元而增加开支,最合适的加密方式是(10),使用的会话密钥算法应该是(11)。
        (10)A.链路加密    B。节点加密    C端-端加密    D.混合加密
    (11)A.RSA    B.RC-5    C.MD5    D.ECC
    【解析】 (10) C  (11) A
        ●我国著作权法中,(12)系指同一概念。
        (12)A.出版权与版权        B.著作权与版权
    C.作者权与专有权       D.发行权与版权
    【解析】我国《著作权法》使用的是著作权,但同时明确规定著作权与版权是同义语。选 B
        ●由我国信息产业部批准发布,在信息产业部门范围内统一使用的标准,
    称为  (13)。
    (13)A.地方标准    B.部门标准  C行业标准    D.企业标准
    【解析】我国的国家标准由国务院标准化行政主管部门制定;行业标准由国务院有关行政主管部门制定;地方标准由省、自治区和直辖市标准化行政主管部门制定;企业标准由企业自己制定。选C行业标准
        ●某软件设计师自行将他人使用C程序语言开发的控制程序转换为机器语言形式
    的控制程序,并固化在芯片中,该软件设计师的行为(14)。
        (14)A.不构成侵权,因为新的控制程序与原控制程序使用的程序设计语言不同
           B.不构成侵权,因为对原控制程序进行了转换与固化,其使用和表现形式不同
          C.不构成侵权,将一种程序语言编写的源程序转换为另一种程序语言形式,属于一种“翻译”行为
          D.构成侵权,因为他不享有原软件作品的著作权
    【解析】D.构成侵权,因为他不享有原软件作品的著作权
    ● 数据存储在磁盘上的会影响I/O服务的总时间。假设每磁道划分成10个物理块,每块存放1个逻辑记录。逻辑记录R1,R2,…,R10存放在同一个磁道上,记录的安排顺序如下表所示:
    物理块 1 2 3 4 5 6 7 8 9 10
    逻辑块 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
        假定磁盘的旋转速度为20ms/周,磁头当前处在R1的开始处。若系统顺序处理这些记录,使用单缓冲区,每个记录处理时间为4ms,则处理这10个记录的最长时间为(15);若对信息存储进行优化分布后,处理 lO个记录的最少时间为(16)。
        (15)A.180ms    B.200ms    C.204ms    D.220ms   
    (16)A.40ms    B.60ms    C.100ms    D.160ms
    【解析】(15)4*10+9*20=220ms  (16)4*10+20=60ms
    ● 页式存储系统的逻辑地址是由页号和页内地址两部分组成。假定页面的大小为4K,地址变换过程如下图所示,图中逻辑地址用十进制表示。图中有效地址经过变换后,十进制物理地址a应为(17)。
     
    (17)A.33220    B.8644    C.4548    D.2500
    【解析】 8644=2*4k+452,   8*4k+452=33220   选 A
        ●下列叙述中,与提高软件可移植性相关的是(18)。
        (18)A.选择时间效率高的算法   
          B.尽可能减少注释
          C.选择空间效率高的算法
          D.尽量用高级语言编写系统中对效率要求不高的部分
    【解析】D.尽量用高级语言编写系统中对效率要求不高的部分
        ●  在系统转换的过程中,旧系统和新系统并行工作一段时间,再由新系统代替旧系统的策略称为(19);在新系统全部正式运行前,一部分一部分地代替旧系统的策略称为(20)。
        (19)A.直接转换    B.位置转换    C分段转换    n并行转换
    (20)A.直接转换    B.位置转换    C分段转换    n并行转换
    【解析】直接转换就是在确定新系统运行准确无误时,立刻启用新系统,终止老系统运行。并行转换方式是新旧系统并行工作一段时间,经过一段时间的考验以后,新系统正式替代老系统。逐步切换,又叫分段切换。这种切换方式实际上是以上两种切换方式的结合。在新系统正式运行前,一部分一部分地替代老系统。(19)D  (20)C
        ●在OSI参考模型中,上层协议实体与下层协议实体之回的逻辑接口叫做服务访问点(SAP)。在Intemet中,网络层的服务访问点是(21)。
    (21)A.MAC地址    B.LLC地址    C.IP地址    D.端口号
    【解析】C.IP地址
        ●在OSI参考模型中,实现端到端的应答、分组排序和流量控制功能的协议层  是 (22)。
        (22)A.数据链路层    B.网络层    C传输层    D.会话层
    【解析】C传输层
    ● 在Intemet上有许多协议,下面的选项中能正确表示协议层次关系的是(23).
     
    【解析】A
       ●10个9.6Kb/s的信道按时分多路复用在一条线路上传输,如果忽略控制开销,
    在同步TDM情况下,复用线路的带宽应该是(24);在统计TDM情况下,假定每个子信道具有30%的时间忙,复用线路的控制开销为10%,那么复用线路的带宽应该是(25)。
        (24)A. 32Kb/s    B.64Kb/s    C.72Kb/s    D.96Kb/s
        (25)A.32Kb/s    B.64Kb/s    C.72Kb/s    D.96Kb/s
    【解析】(24)10*9.6kb/s=96kb/s   (25)10*9.6×30%(1+10%)=32kb/s
        ●使用海明码进行前向纠错,如果冗余位为4位,那么信息位最多可以用到(26)位,假定码字为a6a5a4a3a2alao,并且有下面的监督关系式:
        S2=a2+a4+a5+a6
        S1=a1+a3+a5+a6
        S0=a0+a3+a4+a6
    若S2S1S0=110,则表示出错位是(27)。
        (26)A.6    B.8      C、11    D.16
    (27)A.a3   B.a4    C.a5    D.a6
    【解析】(26)A  (27)C
    ● 下图中画出曼彻斯特编码和差分曼彻斯特编码的波形图,实际传送的比特串为(28)。
     
    (28)
    A. 0  1  1  0  1  0  0  1  1
        B.0  1  1    1  1  0  0  1  0
        C.1  0  0  1  0  1    1  0  0
    D.1  0  0  0  0  1    1  0  1
    【解析】C
        ●N-ISDN有两种接口:基本速率接口(2B+D)和基群速率接口(30B+D),有关这,两种接口的描述中,正确的是(29)。
        (29)A.基群速率接口中,B信道的带宽为16Kb/s,用于发送用户信息
        B.基群速率接口中,D信道的带宽为16Kb/s,用于发送信令信息
        C基本速率接口中,B信道的带宽为64Kb/s,用于发送用户信息
    D基本速率接口中,D信道的带宽为64Kb/s,用于发送信令信息
    【解析】基本速率接口:  2B+D(144Kbit/s)的基本速率,其中B信道为“64Kbit/s,D信道为16Kbit/s。基群速率接口:速率为 30B+D(2Mbit/S),B通路和D通路的速率都是64kbit/s。选 C
        ●在ATM网络中,AAL5用于LAN仿真,,以下有关AAL5的描述中不正确的是(30)。
        A.AAL5提供面向连接的服务      B.AAL5提供无连接的服务
    C.AAL5提供可变比特率的服务    D.AAL5提供固定比特率的服务
    【解析】B
        ●以下有关帧中继网的描述中不正确的是 (31) 。
        (31)A.帧中继在虚电路上可以提供不同的服务质量
        B.在帧中继网中,用户的数据速率可以在一定的范围内变化
        C.帧中继网只提供永久虚电路服务
    D.帧中继不适合对传输延迟敏感的应用
    【解析】帧中继网络提供的业务有两种:永久虚电路和交换虚电路。选 C
    ●在下图的网络配置中,总共有(32)个广播域,(33)个冲突域。
        
    (32)A.2    B.3    C.4    D.5
    (33)A.2    B.5    C.6    D.10
    【解析】(32)A  (33)C
        ●网络连接如下图所示,要使计算机能访问到服务器,在路由器R1中配置路由表
    的命令是(34)。
     
        (34)A.R1(config)#ip  hostR2  202.116.45.1i0
              B.R1(config)#ip network2  02.16.7.0255.255.255.0
               C.RI(config)#ip  host  R2  202.116.45.0255.255.255.0
               D.R1(config)#ip  route  201.16.7.0   255.255.255.0  202.116.45.110
    【解析】D
        ●内部网关协议RIP是一种广泛使用的基于_的协议。RIP规定一条通路上最多可包含的路由器数量是(35)。
        (35)A.链路状态算法    B.距离矢量算法
        C.集中式路由算法    D.固定路由算法
    (36)A.1个    B.16个    C.15今    D.无数个
    【解析】 (35)B (36) C
        ●  以下协议中支持旦变长子网掩码(VLSM)和路由汇聚功能(RouteSummarization)的是(37)。
    (37)A.IGRP    B.OSPF    C.VTP    D.RIPvl
    【解析】C.VTP
        ●关于OSPF拓扑数据库,下面选项中正确的是(38)。
        (38)A每一个路由器都包含了拓扑数据库的所有选项
        B.在同一区域中的所有路由器包含同样的拓扑数据库
        C.使用Dijkstra算法来生成拓扑数据库
    D.使用LSA分组来更新和维护拓扑数据库
    【解析】B
        ●OSPF协议使用(39)分组来保持与其邻居的连接。
        (39)A.Hello    B.Keepalive
    C.SPF(最短路径优先)    D.LSU(链路状态更新)
    【解析】A
        ●下面有关边界网关协议BGP4的描述中,不正确的是(40)。
        (40)A.BGP4网关向对等实体(Peer)发布可以到达的AS列表
        B.BGP4网关采用逐跳路由(hop-by-hop)模式发布自己使用的路由信息
        CBGP4可以通过路由汇聚功能形成超级网络(Supernet)
    D.BGP4报文直接封装在IP数据报中传送
    【解析】选D
        ●多协议标记交换(MPLS)是IETF提出的第三层交换标准,下面有关MPLS的描
    述中,正确的是(41)。
        (41)A.MPLS支持各种网络层协议,带有MPLS标记的分组必须封装在PPP帧中传送
        B.MPLS标记在各个子网中是特定分组的唯一标识
        C.路由器可以根据转发目标把多个Ⅲ流聚合在—起,组成一个转发等价类(FEC)
    D.传送带有MPLS标记的分组之前先要建立对应的网络连接
    【解析】 B
        ●以下给出的地址中,属于子网192.168.15.19/28的主机地址是(42)。
        (42)A.192.168.15.17    B.192.168.15.14
    C.192.168.15.16    D.192.168.15.31
    【解析】 B
        ●在一条点对点的链路上,为了减少地址的浪费,子网掩码应该指定为(43)。
        (43)A.255.255.255.252    B.255.255.255.248
    C.255.255.255.240    D.255.255.255.196
    【解析】因为是点对点,有一对可用地址就行了。选A
        ●下面的地址中,属于单播地址的是(44)。
        (44)A.172.31.128.255/18    B.10.255.255.255
    C.192.168.24.59/30    D.224.105.5.211
    【解析】选A
        ●若Web站点的默认文档中依次有index.htm,default.htm,default.asp,ih.btm四个文档,则主页显示的是(45)的内容。
    (45)A.index.htm    B.ih.htm    C.default.htm    D.default.asp
    【解析】A.index.htm
        ●在Windows命令窗口输入(46)命令来查看DNS服务器的IP。
    (46)A.DNSserver    B.Nslookup    C.DNSconfig    D.DNSip
    【解析】B.Nslookup
        ●在一台256M RAM的计算机上安装Linux系统,交换分区(swap)的大小合理
    的设置应该为(47)。
    (47)A.128M    B.512M    C.1024M    D.4096M
    【解析】交换分区一般来说设为内存的2倍。选B
        ●在Linux中系统的配置文件存放在(48)目录下。
    (48)A./bin    B./etc    C./dev    D./root
    【解析】B./etc
        ●在Linux中,下列(49)可以获得任何Linux命令的在线帮助。
        (49)A.#help  <command>    B.#show  <command>
    C.#man  <command>    D.#1s  <command>
    【解析】C.#man  <command>
        ●路由器的访问控制列表(ACL)的作用是(50)。
        (50)A.ACL可以监控交换的字节数    B.ACL提供路由过滤功能
    C,ACL可以检测网络病毒    D.ACL可以提高网络的利用率
    【解析】B.ACL提供路由过滤功能
        ●以下的访问控制列表中,(51)禁止所有Telnet访问子网10.10.1.0/24。
        (51)A.access-list 15deny telnet any 10.10.1.0  0.0.0.255 eq 23
        B.access-listl  l5 denyu卸any l0.10.1.0 eq telnet
        C。access-list 115deny tcp any 10.10.1.0  0.0.0.255 eq 23
    D.access-list 15deny udp any 10.10.1.0  255.255.255.0 eq 23
    【解析】选C
        ●不使用面向连接传输服务的应用层协议是(52)。
    (52)A.SMTP    B.FTP    C.HTTP    D.SNMP
    【解析】TCP支持的应用协议(面向连接)主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。选 D
        ●HTTPS是一种安全的HTTP协议,它使用(53)来产保证信息安全,使用(54)来
    发送和接收报文。   
        (53)A.IPSec    B.SSL    C.SET    D.SSH
        (54)A.TCP的443端口    B.UDP的443端口
    C.TCP的80端口    D.UDP的80端口
    【解析】HTTPS服务一般是通过SSL(安全套接字层)来保证安全性的(53)B 
    80/tcp是常见的HTTP服务默认端口,而443/tcp则是HTTPS服务的默认端口。
    (54)选A.TCP的443端口
        ●在下面关于VLAN的描述中,不正确的是(55)。
        (55)A.VLAN把交换机划分成多个逻辑上独立的交换机   
        B.主干链路(Trunk)可以提供多个VLAN之间通信的公共通道
        C. 由于包含了多个交换机,所以VLAN扩大了冲突域
    D.一个VLAN可以跨越多个交换机
    【解析】C
        ●Windows2000有两种认证协议,即Kerberos和PKI,下面有关这两种认证协议的
    描述中,正确的是(56)在使用Kerberos认证时,首先向密钥分发中心发送初始票据(57),请求一个会话票据,以便获取服务器提供的服务。
        (56)  A.Kerberos和PKI都是对称密钥
            B.Kerberos和PKI都是非对称密钥
           C.Kerberos是对称密钥,而PKI是非对称密钥
           D.Kerberos是非对称密钥,而PKI是对称密钥
    (57)A.RSA    B.TGT    C.DES    D.LSA
    【解析】(56)选C   (57)B
    Windows 2000中有两种验证协议,即Kerberos和公钥基础结构(Public Key Infrastructure,PKI),这两者的不同之处在于:Kerberos是对称密钥,而PKI是非对称密钥。
        ●在Windows中,  ping命令的-n选项表示 (58) 。   
        (58)A.ping的次数    B.ping的网络号
    C.用数字形式显示结果    D.不要重复,只ping一次
    【解析】A.ping的次数
        ●在Windows中,tracert命令的-h选项表示 (59)  。
        (59)A.指定主机名    B.指定最大跳步数
    C.指定到达目标主机的时间    D.指定源路由
    【解析】B.指定最大跳步数
        ●对路由选择协议的一个要求是必须能够快速收敛,所谓“路由收敛”是指(60) 。
        (60)A.路由器能把分组发送到预订的目标
        B.路由器处理分组的速度足够快
        C.网络设备的路由表与网络拓扑结构保持一致
    D.能把多个子网汇聚成一个超网
    【解析】收敛就是说如果网络上拓扑结构有了变化,从这个时刻开始到整个网络所有路由器的路由表变的重新一致,这个时间间隔就是收敛时间。选 C
        ●一个局域网中某台主机的p地址为176.68.160.12,使用22位作为网络地址,
    那么该局域网的子网掩码为(61),最多可以连接的主机数为(62)。
        (61)A.255.255.255.0    B. 255.255.248.0
        C.255.255.252.0    D.255.255.0.0   
    (62)A.254    B.512    C.1022    D.1024
    【解析】22位作为网络地址11111111.11111111.11111100.00000000, 掩码为255.255.252.0,
    最多可以连接的主机数为2^10-2=1022.
    (61)C   (62)C
        ●以下选项中,可以用于Internet信息服务器远程管理的是(63)。
    (63)A.Telnet    B.RAS    C.FTP    D.SMTP
    【解析】B.RAS
        ●在TCP/IP网络中,为各种公共服务保留的端口号范围是(64)。
    (64)A.1~255    B.1~1023    C.1~1024    D.1~65535
    【解析】B.1~1023
        ●在以下网络应用中,要求带宽最高的应用是(65)。
    (65)A.可视电话  B.数字电视    C拨号上网    D.收发邮件 
    【解析】B.数字电视
        ● DOM is a platform- and language-  (66)   API that allows programs and scrīpts to
     dynamically access and update the content, structure and style of WWW documents (currently,
     definitions for HTML and XML documents are part of the specification). The document can
     be further processed and the results of that processing can be incorporated back into the
     presented   (67)  . DOM is a   (68)  -based AP1 to documents, which requires the whole
     document to be represented in   (69)   while processing it. A simpler alternative to DOM is
     the event-based SAX, which can be used to process very large (70) documents that do not
     fit into the memory available for processing.
          (66) A. specific       B. neutral            C. contained          D. related
          (67) A. text           B. image             C. page              D. graphic
          (68) A. table          B. tree               C. control            D. event
          (69)A. document       B. processor           C. disc           D. memory
    (70) A. XML         B. HTML            C. scrīpt             D. Web
    【解析】(66)B(67)C (68)B (69)D   (70)A
           ● Melissa and LoveLetter made use of the trust that exists between friends or
     colleagues. Imagine receiving an  (71 )  from a friend who asks you to open it. This is what
     happens with Melissa and several other similar email   (72)  . Upon running, such worms
     usually proceed to send themselves out to email addresses from the victim''s address book,
     previous emails, web pages   (73)
           As administrators seek to block dangerous email attachments through the recognition of
     well-known   (74)  , virus writers use other extensions to circumvent such protection.
     Executable (.exe) files are renamed to .bat and .cmd plus a whole list of other extensions and
     will still run and successfully infect target users.
           Frequently, hackers try to penetrate networks by sending an attachment that looks like a
     flash movie, which, while displaying some cute animation, simultaneously runs commands in
     the background to steal your passwords and give the   (75)   access to your network.
          (71 ) A. attachment     B. packet          C. datagram          D. message
          (72) A. virtual        B. virus           C. worms             D. bacteria
          (73) A. memory        B. caches          C. ports             D. registers
          (74) A. names         B. cookies         C. software           D. extensions
    (75) A. cracker        B. user            C. customer           D. client
    【解析】(71)A(72)B (73) D (74) C(75)A
  • cmm 与cmmi

    2008-03-27 15:11:23

    CMMI全称是Capability Maturity Model Integration, 即软件能力成熟度模型集成模型,是由美国国防部与卡内基-梅隆大学和美国国防工业协会共同开发和研制的。CMMI是一套融合多学科的、可扩充的产品集合, 其研制的初步动机是为了利用两个或多个单一学科的模型实现一个组织的集成化过程改进

    cmm是项目管理
    由美国卡内基梅隆大学的软件工程研究所(SEI)创立的CMM(Capability Maturity Model 软件能力成熟度模型)认证评估,在过去的十几年中,对全球的软件产业产生了非常深远的影响。CMM共有五个等级,分别标志着软件企业能力成熟度的五个层次。从低到高,软件开发生产计划精度逐级升高,单位工程生产周期逐级缩短,单位工程成本逐级降低。据SEI统计,通过评估的软件公司对项目的估计与控制能力约提升40%到50%;生产率提高10%到20%,软件产品出错率下降超过1/3。
    对一个软件企业来说,达到CMM2就基本上进入了规模开发,基本具备了一个现代化软件企业的基本架构和方法,具备了承接外包项目的能力。CMM3评估则需要对大软件集成的把握,包括整体架构的整合。一般来说,通过CMM认证的级别越高,其越容易获得用户的信任,在国内、国际市场上的竞争力也就越强。因此,是否能够通过CMM认证也成为国际上衡量软件企业工程开发能力的一个重要标志。
    CMM是目前世界公认的软件产品进入国际市场的通行证,它不仅仅是对产品质量的认证,更是一种软件过程改善的途径。参与CMM评估的博科负责人表示,通过CMM的评估认证不是目标,它只是推动软件企业在产品的研发、生产、服务和管理上不断成熟和进步的手段,是一种持续提升和完善企业自身能力的过程。此次由美国PIA咨询公司负责评估并最终通过CMM3认证,标志着博科在质量管理的能力已经上升到一个新的高度。

    CMMI分为五个等级,二十五个过程区域(PA)(如图所示)。

    1. 初始级 软件过程是无序的,有时甚至是混乱的,对过程几乎没有定义,成功取决于个人努力。管理是反应式的。

    2. 已管理级 建立了基本的项目管理过程来跟踪费用、进度和功能特性。制定了必要的过程纪律,能重复早先类似应用项目取得的成功经验。

    3. 已定义级 已将软件管理和工程两方面的过程文档化、标准化,并综合成该组织的标准软件过程。所有项目均使用经批准、剪裁的标准软件过程来开发和维护软件,软件产品的生产在整个软件过程是可见的。

    4. 量化管理级 分析对软件过程和产品质量的详细度量数据,对软件过程和产品都有定量的理解与控制。管理有一个作出结论的客观依据,管理能够在定量的范围内预测性能。

    5. 优化管理级 过程的量化反馈和先进的新思想、新技术促使过程持续不断改进。

    每个等级都被分解为过程域,特殊目标和特殊实践,通用目标、通用实践和共同特性:

    每个等级都有几个过程区域组成,这几个过程域共同形成一种软件过程能力。每个过程域,都有一些特殊目标和通用目标,通过相应的特殊实践和通用实践来实现这些目标。当一个过程域的所有特殊实践和通用实践都按要求得到实施,就能实现该过程域的目标。

    能力度等级:属于连续式表述,共有六个能力度等级(0~5),每个能力度等级对应到一个一般目标,以及一组一般执行方法和特定方法。
    0 不完整级
    1 执行级
    2 管理级
    3 定义级
    4 量化管理级
    5 最佳化级

    CMMI的评估方式:
    自我评估:用于本企业领导层评价公司自身的软件能力。
    主任评估:使本企业领导层评价公司自身的软件能力,向外宣布自己企业的软件能力
    CMMI的评估类型:
    软件组织的关于具体的软件过程能力的评估。
    软件组织整体软件能力的评估(软件能力成熟度等级评估)。
    CMMI的基本思想
    1、解决软件项目过程改进难度增大问题
    2、实现软件工程的并行与多学科组合
    3、实现过程改进的最佳效益


    1、CMMI的背景
    CMM的成功促使其他学科也相继开发类似的过程改进模型,例如系统工程、需求工程、
    人力资源、集成产品开发、软件采购等等,从CMM衍生出了一些改善模型,比如:
    (1) SW-CMM (Software CMM) 软件CMM
    (2) SE-CMM (System Engineering CMM) 系统工程CMM
    (3) SA-CMM (Software Acquisition CMM) 软件采购CMM
    (4) IPT-CMM (Integrated Product Team CMM) 集成产品群组CMM
    (5) P-CMM (People CMM) 人力资源能力成熟度模型
    为了以示区别,国内外很多资料把CMM叫做SW-CMM。按照SEI原来的计划,CMM的改进版本2.0应该在1997年11月完成,然后在取得版本2.0得实践反馈意见之后,在1999年完成准CMM2.0版本。但是,美国国防部办公室要求SEI推迟发布CMM2.0版本,而要先完成一个更为紧迫的项目CMMI,原因是在同一个组织中多个过程改进模型的存在可能会引起冲突和混淆, CMMI就是为了解决怎么保持这些模式之间的协调。
    CMMI(Capability Maturity Model Integration)即能力成熟度集成模型,这是美国国防部的一个设想,他们想把现在所有的以及将被发展出来的各种能力成熟度模型,集成到一个框架中去。这个框架有两个功能,第一,软件采购方法的改革;第二,建立一种从集成产品与过程发展的角度出发、包含健全的系统开发原则的过程改进。就软件而言,CMMI是SW-CMM的修订本。它兼收了SW-CMM 2.0版C稿草案和SPA中更合理、更科学和更周密的优点。SEI在发表CMMI-SE/SW 1.0版时,宣布大约用两年的时间完成从CMM到CMMI的过渡。
    CMMI项目更为工业界和政府部门提供了一个集成的产品集,其主要目的是消除不同模型之间的不一致和重复,降低基于模型改善的成本。CMMI将以更加系统和一致的框架来指导组织改善软件过程,提高产品和服务的开发、获取和维护能力。
    由业界、美国政府和卡内基•梅隆大学软件工程研究所率先倡导的能力成熟度模型集成(CMMI)项目致力于帮助企业缓解这种困境。CMMI为改进一个组织的各种过程提供了一个单一的集成化框架,新的集成模型框架消除了各个模型的不一致性,减少了模型间的重复,增加透明度和理解,建立了一个自动的、可扩展的框架。因而能够重总体上改进组织的质量和效率。CMMI主要关注点就是成本效益、明确重点、过程集中和灵活性四个方面。
      与原有的能力成熟度模型类似,CMMI也包括了在不同领域建立有效过程的必要元素,反映了业界普遍认可的"最佳"实践;专业领域覆盖软件工程、系统工程、集成产品开发和系统采购。在此前提下,CMMI为企业的过程构建和改进提供了指导和框架作用;同时为企业评审自己的过程提供了可参照的行业基准。
    2、CMMI的源模型
    软件能力成熟度模型2.0版,C稿;电子行业协会临时标准(EIA/IS)731;集成产品开发能力成熟度模型(IPD-CMM)v0.98。
    3、CMMI的原则
      (1)、 强调高层管理者的支持。过程改进往往也是由高层管理者认识和提出的,大力度的、一致的支持是过程改进的关键。
      (2)、 仔细确定改进目标,首先应该对给定时间内的所能完成的改进目标进行正确的估计和定义并制定计划。选择能够达到的目标和能够看到对组织的效益。
      (3)、 选择最佳实践,应该基于组织现有的软件活动和过程财富,参考其他标准模型,取其精华去其糟粕,得到新的实践活动模型。
      (4)、 过程改进要与组织的商务目标一致,与发展战略紧密结合。
    4、CMMI目标
      (1)、 为提高组织过程和管理产品开发、发布和维护能力的提供保障。
      (2)、 帮助组客观织评价自身能力成熟度和过程域能力,为过程改进建立优先级以及执行过程改进。
    5、CMMI的方法
      (1)、决定哪个CMMI模型等级最适合组织过程改进需要。
      (2)、 选择模型的表示法是连续式还是阶段式。
      (3)、 决定组织需要用到的模型中的知识领域。
      (4)、 类似CMM提出的过程改进6步,集成化过程改进分成:开始集成过程改进,建造集成改善平台,集成传统过程,启动新过程,进行改进评估。
    6、CMMI内容
      CMMI内容分为“Required”(必需的)、“Expected”(期望的)、“Informative”(提供信息的)三个级别,来衡量模型包括的质量重要性和作用。最重要的是"要求"级别,是模型和过程改进的基础。第二级别"期望"在过程改进中起到主要作用,但是某些情况不是必须的可能不会出现在成功的组织模型中。 "提供的信息"构成了模型的主要部分,为过程改进提供了有用的指导,在许多情况下他们对需要和期望的构件做了进一步说明。
      "要求"的模型构件是目标,代表了过程改进想要达到的最终状态,它的实现表示了项目和过程控制已经达到了某种水平。当一个目标对应一个关键过程域,就称为"特定目标";对应整个关键过程域就称为"公用目标"。整个CMMI模型包括了54个特定目标,每个关键过程域都对应了一到四个特定目标。每个目标的描述都是非常简捷的,为了充分理解要求的目标就是扩展"期望"的构件。
      "期望"的构件是方法,代表了达到目标的实践手段和补充认识。每个方法都能映射到一个目标上,当一个方法对一个目标是唯一就是"特定方法";而能适用于所有目标时就是"公用方法"。CMMI模型包括了186个特定方法,每个目标有两到七个方法对应。
      CMMI包括了10种"提供的信息":目的,概括和总结了关键过程域的特定目标;介绍说明,介绍关键过程域的范围、性质和实际方法和影响等特征;引用,关键过程域之间的指向是通过引用;名字,表示了关键过程域的构件;方法和目标关系,关键过程域中方法映射到目标的关系表;注释,注释关键过程域的其他模型构件的信息来源;典型工作产品集,定义关键过程域中执行方法时候产生的工作产品;子方法,通过方法活动的分解和详细描述;学科扩充,CMMI对应学科是独立的,这里提供了对应特定学科的扩展;公用方法的详细描述,关键过程域中公用方法应用实践的详细描述。
      CMMI提供了阶段式和连续式两种表示方法,但是这两种表示法在逻辑上是等价的。我们熟悉的SW-CMM软件能力成熟模型就是是阶段式的模型,SE-CMM系统工程模型是连续式模型,而IPD-CMM集成产品开发模型结合了阶段式和连续式两者的特点。
      阶段式方法将模型表示威一系列"成熟度等级"阶段,每个阶段都有一组KPA指出一个组织应集中于何处以改善其组织过程,每个KPA用满足其目标的方法来描述,过程改进通过在一个特定的成熟度等级中满足所有KPA的目标而实现的。
      连续式模型没有像阶段式那样的分散阶段,模型的KPA中的方法是当KPA的外部形式,并可应用于所有的KAP中,通过实现公用方法来改进过程。它不专门指出目标,而是强调方法。组织可以根据自身情况适当裁剪连续模型并以确定的KPA为改进目标。
      两种表示法的差异反应了为每个能力和成熟度等级描述过程而使用的方法,他们虽然描述的机制可能不同,但是两种表示方法通过采用公用的目标和方法作为需要的和期望的模型元素,而达到了相同的改善目的。
      现在CMMI面临的一个挑战就是创建一个单一的模型,可以从连续和阶段两个角度进行观察,包含相同的过程改进基本信息;处理相同范围的一个CMMI过程能够产生相同的结论。统一的CMMI(U-CMMI)是指产生一个只有公用方法和支持他们的KPA组成的模型。当按一种概念性的可伸展的方式编写,并产生了用于定义组织的特定目标过程模版,定义的模版构件将定义一个模型以适用于任何工程或其他方面。

    CMMI与CMM差别:
      CMMI 模型的前身是 SW-CMM 和 SE-CMM,前者就是我们指的CMM。CMMI与SW-CMM的主要区别就是覆盖了许多领域;到目前为止包括四个下面领域:
      (1)、软件工程(SW-CMM)
      软件工程的对象是软件系统的开发活动,要求实现软件开发、运行、维护活动系统化、制度化、量化。
      (2)、系统工程(SE-CMM)
      系统工程的对象是全套系统的开发活动,可能包括也可能不包括软件。系统工程的核心是将客户的需求、期望和约束条件转化为产品解决方案,并对解决方案的实现提供全程的支持。
     (3)、集成的产品和过程开发(IPPD-CMM)
      集成的产品和过程开发是指在产品生命周期中,通过所有相关人员的通力合作,采用系统化的进程来更好地满足客户的需求、期望和要求。如果项目或企业选择IPPD进程,则需要选用模型中所有与IPPD相关的实践。
     (4)、采购(SS-CMM)
      采购的内容适用于那些供应商的行为对项目的成功与否起到关键作用的项目。主要内容包括:识别并评价产品的潜在来源、确定需要采购的产品的目标供应商、监控并分析供应商的实施过程、评价供应商提供的工作产品以及对供应协议很供应关系进行适当的调整。
      在以上模块中,企业可以选择软件工程,或系统工程,也可以都选择。集成的产品和过程开发和采购主要是配合软件工程和系统工程的内容使用。例如,纯软件企业可以选择CMMI中的软件工程的内容;设备制造企业可以选择系统工程和采购;集成的企业可以选择软件工程、系统工程和集成的产品和过程开发。CMMI中的大部分内容是适用各不同领域的,但是实施中会有显著的差别,因此模型中提供了"不同领域应用详解"。
      CMM的基于活动的度量方法和瀑布过程的有次序的、基于活动的管理规范有非常密切的联系,更适合瀑布型的开发过程。而CMMI相对CMM更一步支持迭代开发过程和经济动机推动组织采用基于结果的方法:开发业务案例、构想和原型方案;细化后纳入基线结构、可用发布,最后定为现场版本的发布。虽然CMMI保留了基于活动的方法,它的确集成了软件产业内很多现代的最好的实践,因此它很大程度上淡化了和瀑布思想的联系。
      在 CMMI 模型中在保留了CMM阶段式模式的基础上,出现了连续式模型,这样可以帮助一个组织以及这个组织的客户更加客观和全面的了解它的过程成熟度。同时,连续模型的采用可以给一个组织在进行过程改进的时候带来更大的自主性,不用再象CMM 中 一样,受到等级的严格限制。这种改进的好处是灵活性和客观性强,弱点在于由于缺乏指导,一个组织可能缺乏对关键过程域之间依赖关系的正确理解而片面的实施过程,造成一些过程成为空中楼阁,缺少其他过程的支撑。两种表现方式(连续的和阶段的)从他们所涵盖的过程区域上来说并没有不同,不同的是过程区域的组织方式以及对成熟度(能力)级别的判断方式。
      CMMI 模型中比CMM 进一步强化了对需求的重视。在CMM 中,关于需求只有需求管理这一个关键过程域,也就是说,强调对有质量的需求进行管理,而如何获取需求则没有提出明确的要求。在CMMI的阶段模型中,3 级有一个独立的关键过程域叫做需求开发,提出了对如何获取优秀的需求的要求和方法。CMMI 模型对工程活动进行了一定的强化。在CMM中,只有3级中的软件产品工程和同行评审两个关键过程域是与工程过程密切相关的,而在CMMI中,则将需求开发,验证,确认,技术解决方案,产品集成这些工程过程活动都作为单独的关键过程域进行了要求,从而在实践上提出了对工程的更高要求和更具体的指导。CMMI中还强调了风险管理。不像在CMM 中把风险的管理分散在项目计划和项目跟踪与监控中进行要求,CMMI3级里单独提出了一个独立的关键过程域叫做风险管理。

  • LR8.1安装过程中的不少问题

    2008-03-21 12:05:26

    1.在安装LR8.1之前还特定加了一个英文的文件夹,就是为了安装在这个英文文件夹里.

    在安装的过程中遇到必须得点击回车才能安好..当时我就纳闷,怎么会这样..在不懈努力下终于安好了..

    在程序里面去看看LR8.1,结果发现好多LR8.1里面的程序图标都无法显示,心想没安好..

    找好好久的原因,才发现原来是因为安装包和解压出来的安装程序文件放在了一个中文文件夹里.那个郁闷哦,在安之前就已经很小心的把东西英文文件夹建好,结果解压出来的安装程序却忘了.

    2.安装好了后,按照破解文件里面的步骤一步一步的弄好了之后,开始我的LR旅程,于是参照LRr的教程一步一步开始了.结果一直到脚本回放的那一步,LR页面自动给关闭了,当时还没太注意,后来又开始回放动作时,页面就一直自动的关闭了,找了好久也不知道是怎么回事..后来想想可能是因为在设置的时候把什么地方设置错了于是又把以前设置的东西全都弄回来,结果还是不行..没办法卸了重装,后来卸的时候貌似没卸掉所有的东西,只有手却一个一个的删除.

    3.重新安装的时候在输入密钥一步给卡住了,一直找了好多网上的资料都没有说到这个安装时候的密钥,都说安装起来都一直点下一步,后来在同事的提醒下,输入了密钥上行的提示里面的东西,结果奇迹般的安起了...呵呵

    4.安好了后就开始破解,结果之后还是遇到了回放以前的脚本时页面自动关闭,在录制的时候都开始自动关闭了...郁闷呐..

  • Alpha和Beta测试

    2008-02-21 17:08:13

    大型通用软件,在正式发布前,通常需要执行Alpha和Beta测试,目的是从实际终端用户的使用角度,对软件的功能和性能进行测试,以发现可能只有最终用户才能发现的错误。
    ;s5DI[+zR115532 软件测试专业网站:51Testing软件测试网2{'lQ sO/U)t@
    Alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由程序员或测试员完成。Alpha测试发现的错误,可以在测试现场立刻反馈给开发人员,由开发人员及时分析和处理。目的是评价软件产品的功能、可使用性、可靠性、性能和支持。尤其注重产品的界面和特色。Alpha测试可以从软件产品编码结束之后开始,或在模块(子系统)测试完成后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。有关的手册(草稿)等应该在Alpha测试前准备好。
    5S0\o`X;X115532 软件测试专业网站:51Testing软件测试网-T"\G @AP*P
    Beta测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。因而,Beta测试是在开发者无法控制的环境下进行的软件现场应用。在Beta测试中,由用户记下遇到的所有问题,包括真实的以及主管认定的,定期向开发者报告,开发者在综合用户的报告后,做出修改,最后将软件产品交付给全体用户使用。Beta测试着重于产品的支持性,包括文档、客户培训和支持产品的生产能力。只有当Alpha测试达到一定的可靠程度后,才能开始Beta测试。由于Beta测试的主要目标是测试可支持性,所以Beta测试应该尽可能由主持产品发行的人员来管理。软件测试专业网站:51Testing软件测试网(TKM0X8vX/vY)O#Bk
    软件测试专业网站:51Testing软件测试网%~Hp3Wm6y:?/Jy!n
    由于Alpha和Beta测试的组织难度大,测试费用高,测试的随机性强、测试周期跨度较长,测试质量和测试效率难于保证,所以,很多专业软件可能不再进行Beta测试。随着测试技术的提高,以及专业测试服务机构的大量涌现,很多软件的Beta测试外包给这些专业测试机构进行测试。
  • 验收测试

    2008-02-21 17:05:34

    验收测试
    W~)T k9t EE&[ {h115532
    软件测试专业网站:51Testing软件测试网d V N"W"ayqcCQ.o/@

    ,?Q.PJrWi V8p V1Q115532      验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
    Y5d{/xK:@115532
    (Nvr0?8\d;xOK_?115532      验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。软件测试专业网站:51Testing软件测试网&\}M S"ob }T2Y

    V;z@%]F)f9W115532      通过综合测试之后,软件已完全组装起来,接口方面的错误也已排除,软件测试的最后一步——验收测试即可开始。验收测试应检查软件能否按合同要求进行工作,即是否满足软件需求说明书中的确认标准。
    A}*Z+Z8}9k;e115532软件测试专业网站:51Testing软件测试网!?;ssKd$n
           1.验收测试标准   实现软件确认要通过一系列墨盒测试。验收测试同样需要制订测试计划和过程,测试计划应规定测试的种类和测试进度,测试过程则定义一些特殊的测试用例,旨在说明软件与需求是否一致。无是计划还是过程,都应该着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确人机界面和其他方面(例如,可移植性、兼容性、错误恢复能力和可维护性等)是否令用户满意。验收测试的结果有两种可能,一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受。项目进行到这个阶段才发现严重错误和偏差一般很难在预定的工期内改正,因此必须与用户协商,寻求一个妥善解决问题的方法。
    9Jz0g2x#|+n:J115532
    ,f c|1{8bok.CC:y115532       2.配置复审   验收测试的另一个重要环节是配置复审。复审的目的在于保证软件配置齐全、分类有序,并且包括软件维护所必须的细节。
    9Kx.~*l0}*S9C115532
    tD:m|Y#j8o2q3x B115532      3.α、β测试  事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。 α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。一般包括功能度、安全可靠性、易用性、可扩充性、兼容性、效率、资源占用率、用户文档八个方面。软件测试专业网站:51Testing软件测试网|8y:ko-]Gf$F
    软件测试专业网站:51Testing软件测试网] EJ\,Du x(z)~w
    一、施验收测试的常用策略软件测试专业网站:51Testing软件测试网D-O?c0Xh/oC!A

    z:LIbi;DZbX(U115532      施验收测试的常用策略有三种,它们分别是:
    X)] ~ S5\9Fa7u \115532
    0q5i-c,s9l E115532· 正式验收
    %[QU8`U3Vk9Rf'd115532· 非正式验收或 Alpha 测试软件测试专业网站:51Testing软件测试网g-j*y:g }3S"C1|
    · Beta 测试软件测试专业网站:51Testing软件测试网Vl9x8Mu/V5OXl
          您选择的策略通常建立在合同需求、组织和公司标准以及应用领域的基础上。
    ,K-TI^0ZM115532
    7M8a%nM*QMz115532      正式验收测试软件测试专业网站:51Testing软件测试网Wj G4k@N1~E(@4\~

    g(iz4WbdYz115532      正式验收测试是一项管理严格的过程,它通常是系统测试的延续。计划和设计这些测试的周密和详细程度不亚于系统测试。选择的测试用例应该是系统测试中所执行测试用例的子集。不要偏离所选择的测试用例方向,这一点很重要。在很多组织中,正式验收测试是完全自动执行的。
    P1O b$e N+g)J115532
    +oqn%S6yG9Gr115532      对于系统测试,活动和工件是一样的。在某些组织中,开发组织(或其独立的测试小组)与最终用户组织的代表一起执行验收测试。在其他组织中,验收测试则完全由最终用户组织执行,或者由最终用户组织选择人员组成一个客观公正的小组来执行。
    kkc/i1OF$N115532
    B!Ok vw)T115532      这种测试形式的优点是:软件测试专业网站:51Testing软件测试网)M7nIV~7JF^_

    qu7i6{tW115532· 要测试的功能和特性都是已知的。软件测试专业网站:51Testing软件测试网(VW6g%hLx3xTT
    · 测试的细节是已知的并且可以对其进行评测。软件测试专业网站:51Testing软件测试网'q{IFdN4~8pIf8t
    · 这种测试可以自动执行,支持回归测试。软件测试专业网站:51Testing软件测试网 [2M k a.e'D+RU*\
    · 可以对测试过程进行评测和监测。
    3iv DmiLv115532· 可接受性标准是已知的。
    p9Bf&s Sc115532
    9i k"IWw$[ V6q115532      缺点包括:软件测试专业网站:51Testing软件测试网O!J] w0P$s2r
    软件测试专业网站:51Testing软件测试网6j!c|/o0Q1UAm
    · 要求大量的资源和计划。
    4s9U5U&JX`Aq2V115532· 这些测试可能是系统测试的再次实施。
    ]0~/`*r&UjZN115532· 可能无法发现软件中由于主观原因造成的缺陷,这是因为您只查找预期要发现的缺陷。
    C)G\yt1h4q w)e115532
    l u3~uRb:D[115532      非正式验收测试
    :V3g9Bg/K&cFJ(h115532
    s;{!e$w]$eUz115532      在非正式验收测试中,执行测试过程的限定不象正式验收测试中那样严格。在此测试中,确定并记录要研究的功能和业务任务,但没有可以遵循的特定测试用例。测试内容由各测试员决定。这种验收测试方法不象正式验收测试那样组织有序,而且更为主观。
    N7b2s0f @Z-[1`SB115532
    vYK[(|7W Y115532      大多数情况下,非正式验收测试是由最终用户组织执行的。软件测试专业网站:51Testing软件测试网lu EO(@m7V*?.D5l

    RJve8Y!kB![)o\115532      这种测试形式的优点是:
    1{ Qn'@2B m"aHS8l115532
    0rs:i} A$jzlk]115532· 要测试的功能和特性都是已知的。软件测试专业网站:51Testing软件测试网 S(}-crty.eT gIX
    · 可以对测试过程进行评测和监测。软件测试专业网站:51Testing软件测试网]*W9KEl_
    · 可接受性标准是已知的。软件测试专业网站:51Testing软件测试网g|J'v/J:OI4P
    · 与正式验收测试相比,可以发现更多由于主观原因造成的缺陷。
    d}kfA\115532软件测试专业网站:51Testing软件测试网 Z~*fs5v{X M:S6^
          缺点包括:软件测试专业网站:51Testing软件测试网m p mo[)dv-N

    'd+W g9dk] bH:Z115532· 要求资源、计划和管理资源。软件测试专业网站:51Testing软件测试网E8kuB(sr0SA
    · 无法控制所使用的测试用例。
    'Wia{(a5qf8G115532· 最终用户可能沿用系统工作的方式,并可能无法发现缺陷。
    (_rN"G I*H B~~115532· 最终用户可能专注于比较新系统与遗留系统,而不是专注于查找缺陷。软件测试专业网站:51Testing软件测试网"`%SJgE,H n'kU4w
    · 用于验收测试的资源不受项目的控制,并且可能受到压缩。
    1R%h1I LAG@C115532软件测试专业网站:51Testing软件测试网#VfgA f
          Beta 测试软件测试专业网站:51Testing软件测试网*V}x'}vIq} A

    5WY@ S*JC115532      在以上三种验收测试策略中,Beta 测试需要的控制是最少的。在 Beta 测试中,采用的细节多少、数据和方法完全由各测试员决定。各测试员负责创建自己的环境、选择数据,并决定要研究的功能、特性或任务。各测试员负责确定自己对于系统当前状态的接受标准。软件测试专业网站:51Testing软件测试网'~Q} K%_6Y

    (B-^ R{1hF4d U115532      Beta 测试由最终用户实施,通常开发(或其他非最终用户)组织对其的管理很少或不进行管理。Beta 测试是所有验收测试策略中最主观的。软件测试专业网站:51Testing软件测试网4}Nd$am%x)j$X-D7Y
    软件测试专业网站:51Testing软件测试网c[7G:| }8N*u%hc
          这种测试形式的优点是:
    Bk1kX+NhRg5_]8C115532软件测试专业网站:51Testing软件测试网'Ws5x"sI7]cY
    · 测试由最终用户实施。
    %SV]-{-O115532· 大量的潜在测试资源。
    I2g7QB.atT115532· 提高客户对参与人员的满意程度。
    |Q2I7GJ115532· 与正式或非正式验收测试相比,可以发现更多由于主观原因造成的缺陷。
    0R{b4PHhc115532软件测试专业网站:51Testing软件测试网J$] t!alpths.Ja
          缺点包括:
    ZsR+aM!e(e+hh Z115532
    #P?/Vu*KP Jv'S115532· 未对所有功能和/或特性进行测试。
    p1@ Xqg?115532· 测试流程难以评测。
    ]N:feEc/I115532· 最终用户可能沿用系统工作的方式,并可能没有发现或没有报告缺陷。软件测试专业网站:51Testing软件测试网B2h(W'y&LZ5D)R
    · 最终用户可能专注于比较新系统与遗留系统,而不是专注于查找缺陷。软件测试专业网站:51Testing软件测试网'Fv(jp`q?'@
    · 用于验收测试的资源不受项目的控制,并且可能受到压缩。软件测试专业网站:51Testing软件测试网1a#y KAK
    · 可接受性标准是未知的。软件测试专业网站:51Testing软件测试网fd [ b_|B
    · 您需要更多辅助性资源来管理 Beta 测试员。软件测试专业网站:51Testing软件测试网;b2Zkxh7OR

    `2`}'X5R*D6{0b]115532二、验收测试过程软件测试专业网站:51Testing软件测试网E8S$?0[0D

    T;j A8f'M1155321. 软件需求分析:了解软件功能和性能要求、软硬件环境要求等,并特别要了解软件的质量要求和验收要求。软件测试专业网站:51Testing软件测试网!s#uu5HD
    2. 编制《验收测试计划》和《项目验收准则》:根据软件需求和验收要求编制测试计划,制定需测试的测试项,制定测试策略及验收通过准则,并经过客户参与的计划评审。软件测试专业网站:51Testing软件测试网vO4\&y'pma1YP'C
    3. 测试设计和测试用例设计:根据《验收测试计划》和《项目验收准则》编制测试用例,并经过评审。软件测试专业网站:51Testing软件测试网"h5B8w8t {&t DU-P
    4. 测试环境搭建:建立测试的硬件环境、软件环境等。(可在委托客户提供的环境中进行测试)软件测试专业网站:51Testing软件测试网6R.Y%Ilr
    5. 测试实施:测试并记录测试结果。
    #} k g$H]%YZI{1155326. 测试结果分析:根据验收通过准则分析测试结果,作出验收是否通过及测试评价。
    bGr-e @w1155327. 测试报告:根据测试结果编制缺陷报告和验收测试报告,并提交给客户。
    TN h*`C%f \e9~3i6j115532软件测试专业网站:51Testing软件测试网Y [ql#H on8N(@z
    三、验收测试的总体思路
    XM%Yn;\4\115532软件测试专业网站:51Testing软件测试网%a%gfii2~MNW|
      用户验收测试是软件开发结束后,用户对软件产品投入实际应用以前进行的最后一次质量检验活动。它要回答开发的软件产品是否符合预期的各项要求,以及用户能否接受的问题。由于它不只是检验软件某个方面的质量,而是要进行全面的质量检验,并且要决定软件是否合格,因此验收测试是一项严格的正式测试活动。需要根据事先制订的计划,进行软件配置评审、功能测试、性能测试等多方面检测。软件测试专业网站:51Testing软件测试网!b2G1f+F7T
    软件测试专业网站:51Testing软件测试网/O [0[L-J8Ho j&[
      用户验收测试可以分为两个大的部分:软件配置审核和可执行程序测试,其大致顺序可分为:文档审核、源代码审核、配置脚本审核、测试程序或脚本审核、可执行程序测试。
    DHV nN7I7_d115532软件测试专业网站:51Testing软件测试网6n V6L/AZ,R1`f9R
      要注意的是,在开发方将软件提交用户方进行验收测试之前,必须保证开发方本身已经对软件的各方面进行了足够的正式测试(当然,这里的“足够”,本身是很难准确定量的)。软件测试专业网站:51Testing软件测试网tq%v)S6RD z$X

    m&xX|+_pq115532  用户在按照合同接收并清点开发方的提交物时(包括以前已经提交的),要查看开发方提供的各种审核报告和测试报告内容是否齐全,再加上平时对开发方工作情况的了解,基本可以初步判断开发方是否已经进行了足够的正式测试。软件测试专业网站:51Testing软件测试网4tZ2[&Gl7@'E2I

    5L-zY Z%r7Y `"L}115532  用户验收测试的每一个相对独立的部分,都应该有目标(本步骤的目的)、启动标准(着手本步骤必须满足的条件)、活动(构成本步骤的具体活动)、完成标准(完成本步骤要满足的条件)和度量(应该收集的产品与过程数据)。在实际验收测试过程中,收集度量数据,不是一件容易的事情。
    $R p2`M%l^115532
    :C"U h+RZ{"a?4t115532  软件配置审核软件测试专业网站:51Testing软件测试网$oR^ n Z~

    IjR*b l115532  对于一个外包的软件项目而言,软件承包方通常要提供如下相关的软件配置内容:软件测试专业网站:51Testing软件测试网/XK:Mu*e(FM;iX
    软件测试专业网站:51Testing软件测试网^_t$G_\ W.v
      ●可执行程序、源程序、配置脚本、测试程序或脚本。
    N[wOF [/N5x2R OF6z115532软件测试专业网站:51Testing软件测试网 aCal)b\Q
      ●主要的开发类文档:《需求分析说明书》、《概要设计说明书》、《详细设计说明书》、《数据库设计说明书》、《测试计划》、《测试报告》、《程序维护手册》、《程序员开发手册》、《用户操作手册》、《项目总结报告》。
    qF2{#kp2Bk?,C115532软件测试专业网站:51Testing软件测试网4e-UW{ frA
      ●主要的管理类文档:《项目计划书》、《质量控制计划》、《配置管理计划》、《用户培训计划》、《质量总结报告》、《评审报告》、《会议记录》、《开发进度月报》。软件测试专业网站:51Testing软件测试网r(Z%\:QT#`%e1S

    ]6^ Fy9oeo,n|;]115532  在开发类文档中,容易被忽视的文档有《程序维护手册》和《程序员开发手册》。
    4Hg4g E tiVn115532软件测试专业网站:51Testing软件测试网p2r3NE&@%ccO+s
      《程序维护手册》的主要内容包括:系统说明(包括程序说明)、操作环境、维护过程、源代码清单等,编写目的是为将来的维护、修改和再次开发工作提供有用的技术信息。
    cR6A!s/n@ `| \115532
    6j7R F:Z_0Qed115532  《程序员开发手册》的主要内容包括:系统目标、开发环境使用说明、测试环境使用说明、编码规范及相应的流程等,实际上就是程序员的培训手册。软件测试专业网站:51Testing软件测试网Z L$rI!k Hu
    软件测试专业网站:51Testing软件测试网x,R5w U2_ |
      不同大小的项目,都必须具备上述的文档内容,只是可以根据实际情况进行重新组织。软件测试专业网站:51Testing软件测试网z}.G2[Ew4I
    软件测试专业网站:51Testing软件测试网/zo,h5tj~"M
      对上述的提交物,最好在合同中规定阶段提交的时机,以免发生纠纷。
    x7e0r K&}5}2A|.`115532软件测试专业网站:51Testing软件测试网#e"[vc+Jm oga
      通常,正式的审核过程分为5个步骤:计划、预备会议(可选)、准备阶段、审核会议和问题追踪。预备会议是对审核内容进行介绍并讨论。准备阶段就是各责任人事先审核并记录发现的问题。审核会议是最终确定工作产品中包含的错误和缺陷。软件测试专业网站:51Testing软件测试网{#kN*o8Y'Pd
    软件测试专业网站:51Testing软件测试网"A9R ]-w _[3PRVsyE
      审核要达到的基本目标是:根据共同制定的审核表,尽可能地发现被审核内容中存在的问题,并最终得到解决。在根据相应的审核表进行文档审核和源代码审核时,还要注意文档与源代码的一致性。软件测试专业网站:51Testing软件测试网\[|D A&`(vf$p

    otyDZ jP'`$F115532  在实际的验收测试执行过程中,常常会发现文档审核是最难的工作,一方面由于市场需求等方面的压力使这项工作常常被弱化或推迟,造成持续时间变长,加大文档审核的难度;另一方面,文档审核中不易把握的地方非常多,每个项目都有一些特别的地方,而且也很难找到可用的参考资料。
    5V^XBW1W*Hy115532软件测试专业网站:51Testing软件测试网AOm T5cuk[n_(d-s
      可执行程序的测试
    oc G%I"n]-j6d"H115532软件测试专业网站:51Testing软件测试网_'H4L7kz:V/j9}&W"l
      在文档审核、源代码审核、配置脚本审核、测试程序或脚本审核都顺利完成,就可以进行验收测试的最后一个步骤——可执行程序的测试,它包括功能、性能等方面的测试,每种测试也都包括目标、启动标准、活动、完成标准和度量等五部分。
    Uv#Tg:_'So-m115532软件测试专业网站:51Testing软件测试网5Zq4Bn F+e
      要注意的是不能直接使用开发方提供的可执行程序用于测试,而要按照开发方提供的编译步骤,从源代码重新生成可执行程序。软件测试专业网站:51Testing软件测试网%V3T.d3},`'d#g7vF
    软件测试专业网站:51Testing软件测试网 Q;?0g5mnqBU F
      在真正进行用户验收测试之前一般应该已经完成了以下工作(也可以根据实际情况有选择地采用或增加):软件测试专业网站:51Testing软件测试网#dp0?_D3R#p:_

    E"F2wK)}6c D&h115532  ●软件开发已经完成,并全部解决了已知的软件缺陷。软件测试专业网站:51Testing软件测试网~ys%eI2_
    软件测试专业网站:51Testing软件测试网1n([+eH4};C,{
      ●验收测试计划已经过评审并批准,并且置于文档控制之下。
    4l&Jk8j{4@115532软件测试专业网站:51Testing软件测试网"xFLa_R1C
      ●对软件需求说明书的审查已经完成。软件测试专业网站:51Testing软件测试网BJA+k.OY7n.Q

    YO'oLs;C115532  ●对概要设计、详细设计的审查已经完成。
    H*x9{`'l'm9DS4i&E115532
    b9A t9zagx X115532  ●对所有关键模块的代码审查已经完成。
    niB,|q"f-c V-{8O115532软件测试专业网站:51Testing软件测试网3|h$G:hM O(` X
      ●对单元、集成、系统测试计划和报告的审查已经完成。
    jJl4A%u115532
    &R(rW8oQ5v$b115532  ●所有的测试脚本已完成,并至少执行过一次,且通过评审。
    6}I3o V a]d115532
    Ao2E5_hc115532  ●使用配置管理工具且代码置于配置控制之下。
    ha K6dx`C115532软件测试专业网站:51Testing软件测试网hhLL*Z M
      ●软件问题处理流程已经就绪。
    h0[0~ ~#sP)_Cr115532软件测试专业网站:51Testing软件测试网-nch([o PJN!}|(n
      ●已经制定、评审并批准验收测试完成标准。软件测试专业网站:51Testing软件测试网*zr%M OD2A B@\.k
    软件测试专业网站:51Testing软件测试网,}'v d-N ah
      具体的测试内容通常可以包括:安装(升级)、启动与关机、功能测试(正例、重要算法、边界、时序、反例、错误处理)、性能测试(正常的负载、容量变化)、压力测试(临界的负载、容量变化)、配置测试、平台测试、安全性测试、恢复测试(在出现掉电、硬件故障或切换、网络故障等情况时,系统是否能够正常运行)、可靠性测试等。软件测试专业网站:51Testing软件测试网c0SX2b:_8c{6K!C1M!Q

    %]y9l3vO9[+a115532  性能测试和压力测试一般情况下是在一起进行,通常还需要辅助工具的支持。在进行性能测试和压力测试时,测试范围必须限定在那些使用频度高的和时间要求苛刻的软件功能子集中。由于开发方已经事先进行过性能测试和压力测试,因此可以直接使用开发方的辅助工具。也可以通过购买或自己开发来获得辅助工具。具体的测试方法可以参考相关的软件工程书籍。软件测试专业网站:51Testing软件测试网*e(\{DT
    软件测试专业网站:51Testing软件测试网#c}5y#N2P^aN e
      如果执行了所有的测试案例、测试程序或脚本,用户验收测试中发现的所有软件问题都已解决,而且所有的软件配置均已更新和审核,可以反映出软件在用户验收测试中所发生的变化,用户验收测试就完成了。
    :x_,PR2H.|E115532
    6L,z h(S3xM-Uw115532四、测试报告形式软件测试专业网站:51Testing软件测试网+jM'T*TD{
    软件测试专业网站:51Testing软件测试网e d#f f1th
          《验收测试报告》软件测试专业网站:51Testing软件测试网a&`1t.e8\aF
          《缺陷报告》软件测试专业网站:51Testing软件测试网/G o r `7F"E&vI"U
          《验收测试计划》中规定的其他文档
    &SW#{ v&I AsN1xG115532软件测试专业网站:51Testing软件测试网VGVq*?-sX
    五、验收测试工作流程图
    |P5wxJ%s\Z?115532软件测试专业网站:51Testing软件测试网3W/I*\N uo-Q
     
    A7{1H?fa115532软件测试专业网站:51Testing软件测试网~L Ti\;uoE
    六、验收测试工作流程说明和注意事项软件测试专业网站:51Testing软件测试网6YM1l9gngnY}
    验收测试业务恰谈软件测试专业网站:51Testing软件测试网 thxy+nD
    双方就测试项目及合同进行洽谈软件测试专业网站:51Testing软件测试网9a"`iHT-a:}
    签订测试合同软件测试专业网站:51Testing软件测试网`(R8j}e&F@
    委托方提交测试样品及相关资料
    Uj r},Rs}Mc8`115532软件测试专业网站:51Testing软件测试网 _'X5p!A3ZOCx i
    委托方需提交的文档有:软件测试专业网站:51Testing软件测试网$@5}!s{A/]f3G

    fF$@pznZ*b1^115532¨基本文档:(验收测试必需的文档)
    QxL&[z%Dp.HF |115532
    'K"i8`aZ']![&p [+t;f#_115532用户手册
    a,Of-zP3O[115532
    6SZB0hB2o115532安装手册
    i&G\.U;c#^ c3`i115532
    W)o\`+bT2N115532操作手册
    ~ Ip8_t'I115532软件测试专业网站:51Testing软件测试网aG0pNx
    维护手册软件测试专业网站:51Testing软件测试网`0c y XSI
    软件测试专业网站:51Testing软件测试网(Cy8NU"B'WB.\
    软件开发合同
    \5ux4b&G5in115532
    &E-mC0Xg/Sav115532需求规格说明书
    4iREH4JZS115532软件测试专业网站:51Testing软件测试网j Y,a8?u*N/Eetg
    软件设计说明软件测试专业网站:51Testing软件测试网j(y!N#a0wko
    软件测试专业网站:51Testing软件测试网IX]kO(W[
    软件样品(可刻录在光盘)软件测试专业网站:51Testing软件测试网C"{l L&];c
    软件测试专业网站:51Testing软件测试网;];?SLL%k/Yj"ZS5K
    ¨特殊文档:(根据测试内容不同,委托方所需提交下列相应的文档)软件测试专业网站:51Testing软件测试网7pg1oh4e V u.C!D
    软件测试专业网站:51Testing软件测试网 \:\/KiK-vw2UzB%O
    软件产品开发过程中的测试记录软件测试专业网站:51Testing软件测试网l w e6l:^ z
    软件测试专业网站:51Testing软件测试网n9\B Jw ]Z
    软件产品源代码。软件测试专业网站:51Testing软件测试网.c(|+p h4f0l$Y^
    编制测试计划并通过评审软件测试专业网站:51Testing软件测试网7e-_HUo
    进行项目相关知识培训
    +fN;`"]:z%\xm115532测试设计
    S p`h GuW115532
    l4_d"OS9k5{nA S115532评测中心编制测试方案和设计测试用例集。软件测试专业网站:51Testing软件测试网Hb2A tW:U{8wu+f
    方案评审
    1z f$M0W4r5U.t$]8s B*uO115532软件测试专业网站:51Testing软件测试网PvS^XP&u b
    评测中心测试组成员、委托方代表一起对测试方案进行评审。
    R8v&w3cQSi115532实施测试软件测试专业网站:51Testing软件测试网 b U;I(FC

    {DxlnI Fl115532评测中心对测试方案进行整改,并实施测试。在测试过程中每日提交测试事件报告给委托方。软件测试专业网站:51Testing软件测试网?-d:@%g[9fnd'k3w2k
    编制验收测试报告并组织评审
    'TK r;D*[115532
    %_$Q6nU&ojy/\115532评测中心编制验收测试报告,并组织内部评审。软件测试专业网站:51Testing软件测试网0iGZ#X1V3@N
    提交验收测试报告软件测试专业网站:51Testing软件测试网 Rj O h-cy$l

    t#c E"H!WBjW L115532评测中心提交验收测试报告。
    ^#[2gH4cY3`115532
  • 怎么保证软件测试的可靠性和全面性?

    2007-12-13 09:53:20

    怎么保证软件测试的可靠性和全面性?
  • CMMI

    2007-11-21 11:18:28

    第一级:初始级

    第二:可重复级

    第三:已定义级

    第四:已管理级

    第五:优化级
    公司方面:

    初始级:无秩序,无纪律,无文档

    可重复级:文档化,有纪律性

    已定义级:有标准,有规范,文档化,过程化,流程化

    已管理级:继承已定义级的基础上,还可预测,可控制

    优化级:继承已管理级的基础上,进行定期的可持续 改进

  • testlink

    2007-11-21 10:55:09

    相信测试行业的同学们对这个工具应该是有所耳闻的了——开源的一个测试管理工具。
    对于测试管理来讲,实际上注重的是流程性的东西。
    所以,本文主要从流程的角度来对testlink如何使用做一个简要的说明。
    ——————————————————————————————————————

    根据实际情况,基本上我们可以按照如下的流程来实施我们的测试管理方案:

    首先创建项目

    然后创建需求

    创建计划

    创建用例

    给需求指派用例(可能不止一个)

    给计划添加用例

    为用例指定执行者

    执行计划/报告bug

    查看分析结果

     

     

    1. 创建项目:

    主页左边的列表栏有 “Test Project management”的菜单,子菜单中有 “ create new test project”,通过它可以创建新的测试项目。

    同时,菜单中的其它子菜单可以实现对已存在的test project的编辑,删除,以及设置已存在的用户对于某一个测试项目的权限。

    默认设置下,只有admin组的成员拥有对test project进行操作的权力。

     

    2. 创建需求:

    主页左边的列表栏中有 “Requirements”的菜单,子菜单中有“Requirement Specification”,可以添加编辑需求规格说明书。

    同时,菜单中的另一项可以为需求指定测试用例(结果统计的时候会有一种根据需求覆盖率进行统计的方式)。

    需要说明的一点:每一个需求都必须有相应的多个Req——实际上就是我们对需求进行分析,然后把它分成一条一条的,测试用例是与这些Req相对应的。

    默认设置下,只有admin组的成员拥有对Requirements进行操作的权力。

     

    3. 制定测试计划:

    主页右侧列表,有专门的”Test Plan Management”的菜单,选择其子菜单中的”Test Plan Management”,进入的页面会出现”create”的按钮,点击即可以创建新的测试计划。

     

    4. 创建用例:

    首先需要说明一下testlink 用例树的层次:

    Test project —— test suite —— test case

    所以在创建测试用例之前,需要保证用例隶属于的 test project 和 test suite都已经存在了。

    上面已经讲过如何创建测试项目了,接下来说明一下如何创建 test suite测试集。

    当测试项目创建完毕的时候,选择横向导航条中的“specification”,出现的页面还是分左右两部分——左侧是用例树。

    树的根节点就是咱们创建的测试项目(页面右上角可以切换测试项目,类似mantis)。

    点击测试项目,右侧页面内容中会有“new test suite”的按钮,点击可以创建test suite(测试集——可以理解成测试项目的一个功能模块)。

    Test suite创建完成以后,刷新用例树(左侧页面内容,update tree),可以看到用例树中已经出现了我们刚才创建的测试集。

    点击测试集,右侧页面内容中会出现“create test case(s)”的按钮,点击可以创建新的测试用例。

    测试用例创建完毕以后,刷新用例树,则会看到用例树中test suite的下一级中出现了我们刚刚创建的test case。

    注:用例是可以指定版本的——因为随着需求的变化,或者其他某些因素,用例是要不断变化的,需要用版本号来区别这种变化。

    PS:选择不同的level,右侧页面中会出现不尽相同的各种按钮——每个按钮对应的操作与其字面意思是相对应的,例如

    a)       用例树中我们选择的是一个 test project,右侧页面中会出现如下按钮:

    New test suite —— 创建测试集

    Reorder children —— 对该测试项目的子项(test suite)进行重新排序

    Import test suite —— 导入测试集

    Export all test suites —— 导出所有的测试集

    b)       用例树中我们选择的是一个 test suite,右侧页面中会出现如下按钮:

    Edit —— 编辑测试集

    Delete —— 删除测试集

    Move/copy —— 移动或者复制测试集

    Reorder children —— 对该测试集的子项进行重新排序

    Export test suite —— 导出测试集

    New test suite —— 新建测试集

    Import test suite —— 导入测试集

    Create test case(s) —— 创建测试用例

    Import test case(s) —— 导入测试用例

    Export test case(s) —— 导出测试用例

    c)       用例树中我们选择的是一个test case,右侧页面中会出现如下按钮:

    Edit —— 编辑当前用例

    Delete —— 删除当前用例

    Move/copy —— 移动/复制当前用例

    Deactivate this version —— 将当前用例版本设置为 无效 状态

    Create a new version —— 为当前用例创建一个新版本

    Export —— 导出用例

  • 软件测试常用术语表

    2007-11-07 10:10:33

    Acceptance Testing--可接受性测试

      一般由用户/客户进行的确认是否可以接受一个产品的验证性测试。

      actual outcome--实际结果

      被测对象在特定的条件下实际产生的结果。

      Ad Hoc Testing--随机测试

      测试人员通过随机的尝试系统的功能,试图使系统中断。

      algorithm--算法

      (1)一个定义好的有限规则集,用于在有限步骤内解决一个问题;(2)执行一个特定任务的任何操作序列。

      algorithm analysis--算法分析

      一个软件的验证确认任务,用于保证选择的算法是正确的、合适的和稳定的,并且满足所有精确性、规模和时间

      方面的要求。

      Alpha Testing--Alpha测试

      由选定的用户进行的产品早期性测试。这个测试一般在可控制的环境下进行的。

      analysis--分析

      (1)分解到一些原子部分或基本原则,以便确定整体的特性;(2)一个推理的过程,显示一个特定的结果是假

      设前提的结果;(3)一个问题的方法研究,并且问题被分解为一些小的相关单元作进一步详细研究。

      anomaly--异常

      在文档或软件操作中观察到的任何与期望违背的结果。

      application software--应用软件

      满足特定需要的软件。

      architecture--构架

      一个系统或组件的组织结构。

      ASQ--自动化软件质量(Automated Software Quality)

      使用软件工具来提高软件的质量。

      assertion--断言

      指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的

      条件。

      assertion checking--断言检查

      用户在程序中嵌入的断言的检查。

      audit--审计

      一个或一组工作产品的独立检查以评价与规格、标准、契约或其它准则的符合程度。

      audit trail--审计跟踪

      系统审计活动的一个时间记录。

      Automated Testing--自动化测试

      使用自动化测试工具来进行测试,这类测试一般不需要人干预,通常在GUI、性能等测试中用得较多。

      第120贴【2004-10-13】:常见测试术语二

      Backus-Naur Form--BNF范式

      一种分析语言,用于形式化描述语言的语法

      baseline--基线

      一个已经被正式评审和批准的规格或产品,它作为进一步开发的一个基础,并且必须通过正式的变更流程来变更

      。

      Basic Block--基本块

      一个或多个顺序的可执行语句块,不包含任何分支语句。

      basis test set--基本测试集

      根据代码逻辑引出来的一个测试用例集合,它保证能获得100%的分支覆盖。

      behaviour--行为

      对于一个系统的一个函数的输入和预置条件组合以及需要的反应。一个函数的所有规格包含一个或多个行为。

      benchmark--标杆/指标/基准

      一个标准,根据该标准可以进行度量或比较。

      Beta Testing--Beta测试

      在客户场地,由客户进行的对产品预发布版本的测试。这个测试一般是不可控的。

      big-bang testing--大锤测试/一次性集成测试

      非渐增式集成测试的一种策略,测试的时候把所有系统的组件一次性组合成系统进行测试。

      Black Box Testing--黑盒测试

      根据软件的规格对软件进行的测试,这类测试不考虑软件内部的运作原理,因此软件对用户来说就像一个黑盒子

      。

      bottom-up testing--由低向上测试

      渐增式集成测试的一种,其策略是先测试底层的组件,然后逐步加入较高层次的组件进行测试,直到系统所有组

      件都加入到系统。

      boundary value--边界值

      一个输入或输出值,它处在等价类的边界上。

      boundary value coverage--边界值覆盖

      通过测试用例,测试组件等价类的所有边界值。

      boundary value testing--边界值测试

      通过边界值分析方法来生成测试用例的一种测试策略。

      Boundry Value Analysis--边界值分析

      该分析一般与等价类一起使用。经验认为软件的错误经常在输入的边界上产生,因此边界值分析就是分析软件输

      入边界的一种方法。

      branch--分支

      在组件中,控制从任何语句到其它任何非直接后续语句的一个条件转换,或者是一个无条件转换。

      branch condition--分支条件

      branch condition combination coverage--分支条件组合覆盖

      在每个判定中所有分支条件结果组合被测试用例覆盖到的百分比。

      branch condition combination testing--分支条件组合测试

      通过执行分支条件结果组合来设计测试用例的一种方法。

      branch condition coverage--分支条件覆盖

      每个判定中分支条件结果被测试用例覆盖到的百分比。

      branch condition testing--分支条件测试

      通过执行分支条件结果来设计测试用例的一种方法。

      branch coverage--分支覆盖

      通过测试执行到的分支的百分比。

      branch outcome--分支结果

      见判定结果(decision outcome)

      branch point--分支点

      见判定(decision)

      branch testing--分支测试

      通过执行分支结果来设计测试用例的一种方法。

      Breadth Testing--广度测试

      在测试中测试一个产品的所有功能,但是不测试更细节的特性。

      bug--缺陷

      第121贴【2004-10-14】:常见测试术语三

      capture/playback tool--捕获/回放工具

      参考capture/replay tool

      Capture/Replay Tool--捕获/回放工具

      一种测试工具,能够捕获在测试过程中传递给软件的输入,并且能够在以后的时间中,重复这个执行的过程。这

      类工具一般在GUI测试中用的较多。

      CASE--计算机辅助软件工程(computer aided software engineering)

      用于支持软件开发的一个自动化系统。

      CAST--计算机辅助测试

      在测试过程中使用计算机软件工具进行辅助的测试。

      cause-effect graph--因果图

      一个图形,用来表示输入(原因)与结果之间的关系,可以被用来设计测试用例。

      certification --证明

      一个过程,用于确定一个系统或组件与特定的需求相一致。

      change control--变更控制

      一个用于计算机系统或系统数据修改的过程,该过程是质量保证程序的一个关键子集,需要被明确的描述。

      code audit --代码审计

      由一个人、组或工具对源代码进行的一个独立的评审,以验证其与设计规格、程序标准的一致性。正确性和有效

      性也会被评价。

      Code Coverage--代码覆盖率

      一种分析方法,用于确定在一个测试套执行后,软件的哪些部分被执行到了,哪些部分没有被执行到。

      Code Inspection--代码检视

      一个正式的同行评审手段,在该评审中,作者的同行根据检查表对程序的逻辑进行提问,并检查其与编码规范的

      一致性。

      Code Walkthrough--代码走读

      一个非正式的同行评审手段,在该评审中,代码被使用一些简单的测试用例进行人工执行,程序变量的状态被手

      工分析,以分析程序的逻辑和假设。

      code-based testing--基于代码的测试

      根据从实现中引出的目标设计测试用例。

      coding standards--编程规范

      一些编程方面需要遵循的标准,包括命名方式、排版格式等内容。

      Compatibility Testing--兼容性测试

      测试软件是否和系统的其它与之交互的元素之间兼容,如:浏览器、操作系统、硬件等。

      complete path testing --完全路径测试

      参考穷尽测试(exhaustive testing)

      completeness--完整性

      实体的所有必须部分必须被包含的属性。

      complexity --复杂性

      系统或组件难于理解或验证的程度。

      Component--组件

      一个最小的软件单元,有着独立的规格

      Component Testing--组件测试

      参考单元测试

      computation data use--计算数据使用

      一个不在条件中的数据使用。

      computer system security--计算机系统安全性

      计算机软件和硬件对偶然的或故意的访问、使用、修改或破坏的一种保护机制。

      condition--条件

      一个不包含布尔操作的布尔表达式,例如:A

      condition coverage--条件覆盖

      通过测试执行到的条件的百分比。

      condition outcome--条件结果

      条件为真为假的评价。

      configuration control--配置控制

      配置管理的一个方面,包括评价、协调、批准、和实现配置项的变更。

      configuration management--配置管理

      一套技术和管理方面的原则用于确定和文档化一个配置项的功能和物理属性、控制对这些属性的变更、记录和报

      告变更处理和实现的状态、以及验证与指定需求的一致性。

      conformance criterion-- 一致性标准

      判断组件在一个特定输入值上的行为是否符合规格的一种方法。

      Conformance Testing-- 一致性测试

      测试一个系统的实现是否和其基于的规格相一致的测试。

      consistency -- 一致性

      在系统或组件的各组成部分和文档之间没有矛盾,一致的程度。

      consistency checker-- 一致性检查器

      一个软件工具,用于测试设计规格中需求的一致性和完整性。

      control flow--控制流

      程序执行中所有可能的事件顺序的一个抽象表示。

      control flow graph--控制流图

      通过一个组件的可能替换控制流路径的一个图形表示。

      conversion testing--转换测试

      用于测试已有系统的数据是否能够转换到替代系统上的一种测试。

      corrective maintenance--故障检修

      用于纠正硬件或软件中故障的维护。

      correctness --正确性

      软件遵从其规格的程度。

      correctness --正确性

      软件在其规格、设计和编码中没有故障的程度。软件、文档和其它项满足需求的程度。软件、文档和其它项满足

      用户明显的和隐含的需求的程度。

      coverage --覆盖率

      用于确定测试所执行到的覆盖项的百分比。

      coverage item--覆盖项

      作为测试基础的一个入口或属性:如语句、分支、条件等。

      crash--崩溃

      计算机系统或组件突然并完全的丧失功能。

      criticality--关键性

      需求、模块、错误、故障、失效或其它项对一个系统的操作或开发影响的程度。

      criticality analysis--关键性分析

      需求的一种分析,它根据需求的风险情况给每个需求项分配一个关键级别。

      cyclomatic complexity--循环复杂度

      一个程序中独立路径的数量。

      第122贴【2004-10-19】:常见测试术语四

      data corruption--数据污染

      违背数据一致性的情况。

      data definition--数据定义

      一个可执行语句,在该语句上一个变量被赋予了一个值。

      data definition C-use coverage--数据定义C-use覆盖

      在组件中被测试执行到的数据定义C-use使用对的百分比。

      data definition C-use pair--数据定义C-use使用对

      一个数据定义和一个计算数据使用,数据使用的值是数据定义的值。

      data definition P-use coverage--数据定义P-use覆盖

      在组件中被测试执行到的数据定义P-use使用对的百分比。

      data definition P-use pair--数据定义P-use使用对

      一个数据定义和一个条件数据使用,数据使用的值是数据定义的值。

      data definition-use coverage--数据定义使用覆盖

      在组件中被测试执行到的数据定义使用对的百分比。

      data definition-use pair --数据定义使用对

      一个数据定义和一个数据使用,数据使用的值是数据定义的值。

      data definition-use testing--数据定义使用测试

      以执行数据定义使用对为目标进行测试用例设计的一种技术。

      data dictionary--数据字典

      (1)一个软件系统中使用的所有数据项名称,以及这些项相关属性的集合。(2)数据流、数据元素、文件、数据基础、和相关处理的一个集合。

      data flow analysis--数据流分析

      一个软件验证和确认过程,用于保证输入和输出数据和它们的格式是被适当定义的,并且数据流是正确的。

      data flow coverage--数据流覆盖

      测试覆盖率的度量是根据变量在代码中的使用情况。

      data flow diagram--数据流图

      把数据源、数据接受、数据存储和数据处理作为节点描述的一个图形,数据之间的逻辑体现为节点之间的边。

      data flow testing--数据流测试

      根据代码中变量的使用情况进行的测试。

      data integrity--数据完整性

      一个数据集合完全、正确和一致的程度。

      data use--数据使用

      一个可执行的语句,在该语句中,变量的值被访问。

      data validation--数据确认

      用于确认数据不正确、不完整和不合理的过程。

      dead code--死代码

      在程序操作过程中永远不可能被执行到的代码。

      Debugging--调试

      发现和去除软件失效根源的过程。

      decision--判定

      一个程序控制点,在该控制点上,控制流有两个或多个可替换路由。

      Decision condition--判定条件

      判定内的一个条件。

      decision coverage--判定覆盖

      在组件中被测试执行到的判定结果的百分比。

      decision outcome--判定结果

      一个判定的结果,决定控制流走哪条路径。

      decision table--判定表

      一个表格,用于显示条件和条件导致动作的集合。

      Depth Testing--深度测试

      执行一个产品的一个特性的所有细节,但不测试所有特性。比较广度测试。

      design of experiments--实验设计

      一种计划实验的方法,这样适合分析的数据可以被收集。

      design-based testing--基于设计的测试

      根据软件的构架或详细设计引出测试用例的一种方法。

      desk checking--桌面检查

      通过手工模拟软件执行的方式进行测试的一种方式。

      diagnostic--诊断

      检测和隔离故障或失效的过程。

      dirty testing--肮脏测试

      参考负面测试(negative testing)

      disaster recovery--灾难恢复

      一个灾难的恢复和重建过程或能力。

      documentation testing --文档测试

      测试关注于文档的正确性。

      domain--域

      值被选择的一个集合。

      domain testing--域测试

      参考等价划分测试(equivalence partition testing)

      dynamic analysis--动态分析

      根据执行的行为评价一个系统或组件的过程。

      Dynamic Testing--动态测试

      通过执行软件的手段来测试软件。

      第123贴【2004-10-20】:常见测试术语五

      embedded software--嵌入式软件

      软件运行在特定硬件设备中,不能独立于硬件存在。这类系统一般要求实时性较高。

      emulator--仿真

      一个模仿另一个系统的系统或设备,它接受相同的输入并产生相同的输出。

      End-to-End testing--端到端测试

      在一个模拟现实使用的场景下测试一个完整的应用环境,例如和数据库交互,使用网络通信等。

      entity relationship diagram--实体关系图

      描述现实世界中实体及它们关系的图形。

      entry point --入口点

      一个组件的第一个可执行语句。

      Equivalence Class--等价类

      组件输入或输出域的一个部分,在该部分中,组件的行为从组件的规格上来看认为是相同的。

      equivalence partition coverage--等价划分覆盖

      在组件中被测试执行到的等价类的百分比。

      equivalence partition testing--等价划分测试

      根据等价类设计测试用例的一种技术。

      Equivalence Partitioning--等价划分

      组件的一个测试用例设计技术,该技术从组件的等价类中选取典型的点进行测试。

      error--错误

      IEEE的定义是:一个人为产生不正确结果的行为。

      error guessing--错误猜测

      根据测试人员以往的经验猜测可能出现问题的地方来进行用例设计的一种技术。

      error seeding--错误播种/错误插值

      故意插入一些已知故障(fault)到一个系统中去的过程,目的是为了根据错误检测和跟踪的效率并估计系统中遗

      留缺陷的数量。

      exception--异常/例外

      一个引起正常程序执行挂起的事件。

      executable statement--可执行语句

      一个语句在被编译后会转换成目标代码,当程序运行是会被执行,并且可能对程序数据产生动作。

      Exhaustive Testing--穷尽测试

      测试覆盖软件的所有输入和条件组合。

      exit point--出口点

      一个组件的最后一个可执行语句。

      expected outcome--期望结果

      参考预期结果(predicted outcome)。

      第124贴【2004-10-21】:常见测试术语六

      failure--失效

      软件的行为与其期望的服务相背离。

      fault--故障

      在软件中一个错误的表现。

      feasible path--可达路径

      可以通过一组输入值和条件执行到的一条路径。

      feature testing--特性测试

      参考功能测试(Functional Testing)

      FMEA--失效模型效果分析(Failure Modes and Effects Analysis)

      可靠性分析中的一种方法,用于在基本组件级别上确认对系统性能有重大影响的失效。

      FMECA--失效模型效果关键性分析(Failure Modes and Effects Criticality Analysis)

      FMEA的一个扩展,它分析了失效结果的严重性。

      FTA--故障树分析(Fault Tree Analysis)

      引起一个不需要事件产生的条件和因素的确认和分析,通常是严重影响系统性能、经济性、安全性或其它需要特

      性。

      functional decomposition--功能分解

      参考模块分解(modular decomposition)

      Functional Specification --功能规格说明书

      一个详细描述产品特性的文档。

      Functional Testing--功能测试

      测试一个产品的特性和可操作行为以确定它们满足规格。

      第125贴【2004-10-22】:常见测试术语七

      glass box testing--玻璃盒测试

      参考白盒测试(White Box Testing)

      IEEE--美国电子与电器工程师学会(Institute of Electrical and Electronic Engineers)

      incremental testing--渐增测试

      集成测试的一种,组件逐渐被增加到系统中直到整个系统被集成。

      infeasible path--不可达路径

      不能够通过任何可能的输入值集合执行到的路径。

      input domain--输入域

      所有可能输入的集合。

      inspection--检视

      对文档进行的一种评审形式。

      installability testing--可安装性测试

      确定系统的安装程序是否正确的测试。

      instrumentation--插装

      在程序中插入额外的代码以获得程序在执行时行为的信息。

      instrumenter--插装器

      执行插装的工具

      Integration Testing--集成测试

      测试一个应用组合后的部分以确保它们的功能在组合之后正确。该测试一般在单元测试之后进行。

      interface--接口

      两个功能单元的共享边界。

      interface analysis--接口分析

      分析软件与硬件、用户和其它软件之间接口的需求规格。

      interface testing--接口测试

      测试系统组件间接口的一种测试。

      invalid inputs--无效输入

      在程序功能输入域之外的测试数据。

      isolation testing--孤立测试

      组件测试(单元测试)策略中的一种,把被测组件从其上下文组件之中孤立出来,通过设计驱动和桩进行测试的

      一种方法。

      第126贴【2004-10-25】:常见测试术语八

      Job--工作

      一个用户定义的要计算机完成的工作单元。

      job control language--工作控制语言

      用于确定工作顺序,描述它们对操作系统要求并控制它们执行的语言。

      LCSAJ--线性代码顺序和跳转(Linear Code Sequence And Jump)

      包含三个部分:可执行语句线性顺序的起始,线性顺序的结束,在线性顺序结束处控制流跳转的目标语句。

      LCSAJ coverage--LCSAJ覆盖

      在组件中被测试执行到的LCSAJ的百分比。

      LCSAJ testing--LCSAJ测试

      根据LCSAJ设计测试用例的一种技术。

      Load Testing--负载测试

      通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。

      logic analysis--逻辑分析

      (1)评价软件设计的关键安全方程式、算法和控制逻辑的方法。(2)评价程序操作的顺序并且检测可能导致灾难的错误。

      logic-coverage testing--逻辑覆盖测试

      参考结构化测试用例设计(structural test case design)

      maintainability--可维护性

      一个软件系统或组件可以被修改的容易程度,这个修改一般是因为缺陷纠正、性能改进或特性增加引起的。

      maintainability testing--可维护性测试

      测试系统是否满足可维护性目标。

      modified condition/decision coverage--修改条件/判定覆盖

      在组件中被测试执行到的修改条件/判定的百分比。

      modified condition/decision testing --修改条件/判定测试

      根据MC/DC设计测试用例的一种技术。

      Monkey Testing--跳跃式测试

      随机性,跳跃式的测试一个系统,以确定一个系统是否会崩溃。

      MTBF--平均失效间隔实际(mean time between failures)

      两次失效之间的平均操作时间。

      MTTF--平均失效时间 (mean time to failure)

      第一次失效之前的平均时间

      MTTR--平均修复时间(mean time to repair)

      两次修复之间的平均时间

      multiple condition coverage--多条件覆盖

      参考分支条件组合覆盖(branch condition combination coverage)

      mutation analysis--变体分析

      一种确定测试用例套完整性的方法,该方法通过判断测试用例套能够区别程序与其变体之间的程度。

      第127贴【2004-10-26】:常见测试术语九

      Negative Testing--逆向测试/反向测试/负面测试

      测试瞄准于使系统不能工作。

      non-functional requirements testing--非功能性需求测试

      与功能不相关的需求测试,如:性能测试、可用性测试等。

      N-switch coverage--N切换覆盖

      在组件中被测试执行到的N转换顺序的百分比。

      N-switch testing--N切换测试

      根据N转换顺序设计测试用例的一种技术,经常用于状态转换测试中。

      N-transitions--N转换

      N+1转换顺序

      operational testing--可操作性测试

      在系统或组件操作的环境中评价它们的表现。

      output domain--输出域

      所有可能输出的集合。

      第128贴【2004-10-27】:常见测试术语十

      partition testing--分类测试

      参考等价划分测试(equivalence partition testing)

      path--路径

      一个组件从入口到出口的一条可执行语句顺序。

      path coverage--路径覆盖

      在组件中被测试执行到的路径的百分比。

      path sensitizing--路径敏感性

      选择一组输入值强制组件走一个给定的路径。

      path testing--路径测试

      根据路径设计测试用例的一种技术,经常用于状态转换测试中。

      performance testing--性能测试

      评价一个产品或组件与性能需求是否符合的测试。

      portability testing--可移植性

      测试瞄准于证明软件可以被移植到指定的硬件或软件平台上。

      Positive Testing--正向测试

      测试瞄准于显示系统能够正常工作。

      precondition--预置条件

      环境或状态条件,组件执行之前必须被填充一个特定的输入值。

      predicate--谓词

      一个逻辑表达式,结果为‘真’或‘假’。

      predicate data use--谓词数据使用

      在谓词中的一个数据使用。

      program instrumenter--程序插装

      参考插装(instrumenter)

      progressive testing--递进测试

      在先前特性回归测试之后对新特性进行测试的一种策略。

      pseudo-random--伪随机

      看似随机的,实际上是根据预先安排的顺序进行的。

      第129贴【2004-10-28】:常见测试术语十一

      QA--质量保证(quality assurance)

      (1)已计划的系统性活动,用于保证一个组件、模块或系统遵从已确立的需求。(2)采取的所有活动以保证一

      个开发组织交付的产品满足性能需求和已确立的标准和过程。

      QC--质量控制(quality control)

      用于获得质量需求的操作技术和过程,如测试活动。

      Race Condition--竞争状态

      并行问题的根源。对一个共享资源的多个访问,至少包含了一个写操作,但是没有一个机制来协调同时发生的访问。

      recovery testing--恢复性测试

      验证系统从失效中恢复能力的测试。

      regression analysis and testing--回归分析和测试

      一个软件验证和确认任务以确定在修改后需要重复测试和分析的范围。

      Regression Testing--回归测试

      在发生修改之后重新测试先前的测试以保证修改的正确性。

      release--发布

      一个批准版本的正式通知和分发。

      reliability--可靠性

      一个系统或组件在规定的条件下在指定的时间内执行其需要功能的能力。

      reliability assessment--可靠性评价

      确定一个已有系统或组件的可靠性级别的过程。

      requirements-based testing--基于需求的测试

      根据软件组件的需求导出测试用例的一种设计方法。

      review--评审

      在产品开发过程中,把产品提交给项目成员、用户、管理者或其它相关人员评价或批准的过程。

      risk--风险

      不期望效果的可能性和严重性的一个度量。

      risk assessment--风险评估

      对风险和风险影响的一个完整的评价。

      第130贴【2004-10-29】:常见测试术语十二

      safety--(生命)安全性

      不会引起人员伤亡、产生疾病、毁坏或损失设备和财产、或者破坏环境。

      safety critical--严格的安全性

      一个条件、事件、操作、过程或项,它的认识、控制或执行对生命安全性的系统来说是非常关键的。

      Sanity Testing--理智测试

      软件主要功能成分的简单测试以保证它是否能进行基本的测试。参考冒烟测试

      SDP--软件开发计划(software development plan)

      用于一个软件产品开发的项目计划。

      security testing--安全性测试

      验证系统是否符合安全性目标的一种测试。

      security.--(信息)安全性

      参考计算机系统安全性(computer system security)

      serviceability testing--可服务性测试

      参考可维护性测试(maintainability testing)

      simple subpath--简单子路径

      控制流的一个子路径,其中没有不必要的部分被执行。

      simulation--模拟

      使用另一个系统来表示一个物理的或抽象的系统的选定行为特性。

      simulation--模拟

      使用一个可执行模型来表示一个对象的行为。

      simulator--模拟器

      软件验证期间的一个设备、软件程序、或系统,当它给定一个控制的输入时,表现的与一个给定的系统类似。

      第131贴【2004-11-1】:常见测试术语十三

      SLA--服务级别协议(service level agreement)

      服务提供商与客户之间的一个协议,用于规定服务提供商应当提供什么服务。

      Smoke Testing--冒烟测试

      对软件主要功能进行快餐式测试。最早来自于硬件测试实践,以确定新的硬件在第一次使用的时候不会着火。

      software development process--软件开发过程

      一个把用户需求转换为软件产品的开发过程。

      software diversity--软件多样性

      一种软件开发技术,其中,由不同的程序员或开发组开发的相同规格的不同程序,目的是为了检测错误、增加可靠性。

      software element--软件元素

      软件开发或维护期间产生或获得的一个可交付的或过程内的文档。

      software engineering--软件工程

      一个应用于软件开发、操作和维护的系统性的、有纪律的、可量化的方法。

      software engineering environment--软件工程环境

      执行一个软件工程工作的硬件、软件和固件。

      software life cycle--软件生命周期

      开始于一个软件产品的构思,结束于该产品不再被使用的这段期间。

      SOP--标准操作过程(standard operating procedures)

      书面的步骤,这对保证生产和处理的控制是必须的。

      source code--源代码

      用一种适合于输入到汇编器、编译器或其它转换设备的计算机指令和数据定义。

      source statement--源语句

      参考语句(statement)

      第132贴【2004-11-2】:常见测试术语十四

      specification--规格

      组件功能的一个描述,格式是:对指定的输入在指定的条件下的输出。

      specified input--指定的输入

      一个输入,根据规格能预知其输出。

      spiral model --螺旋模型

      软件开发过程的一个模型,其中的组成活动,典型的包括需求分析,概要设计,详细设计,编码,集成和测试等活动被迭代的执行直到软件被完成。

      SQL--结构化查询语句(structured query language)

      在一个关系数据库中查询和处理数据的一种语言。

      state--状态

      一个系统、组件或模拟可能存在其中的一个条件或模式。

      state diagram--状态图

      一个图形,描绘一个系统或组件可能假设的状态,并且显示引起或导致一个状态切换到另一个状态的事件或环境。

      state transition--状态转换

      一个系统或组件的两个允许状态之间的切换。

      state transition testing --状态转换测试

      根据状态转换来设计测试用例的一种方法。

      statement--语句

      程序语言的一个实体,是典型的最小可执行单元。

      statement coverage--语句覆盖

      在一个组件中,通过执行一定的测试用例所能达到的语句覆盖百分比。

      statement testing--语句测试

      根据语句覆盖来设计测试用例的一种方法。

      Static Analysis--静态分析

      分析一个程序的执行,但是并不实际执行这个程序。

      第133贴【2004-11-3】:常见测试术语十五

      Static Analyzer--静态分析器

      进行静态分析的工具。

      Static Testing--静态测试

      不通过执行来测试一个系统。

      statistical testing--统计测试

      通过使用对输入统计分布进行分析来构造测试用例的一种测试设计方法。

      stepwise refinement--逐步优化

      一个结构化软件设计技术,数据和处理步骤首先被广泛的定义,然后被逐步的进行了细化。

      storage testing--存储测试

      验证系统是否满足指定存储目标的测试。

      Stress Testing--压力测试

      在规定的规格条件或者超过规定的规格条件下,测试一个系统,以评价其行为。类似负载测试,通常是性能测试

      的一部分。

      structural coverage--结构化覆盖

      根据组件内部的结构度量覆盖率。

      structural test case design--结构化测试用例设计

      根据组件内部结构的分析来设计测试用例的一种方法。

      structural testing--结构化测试

      参考结构化测试用例设计(structural test case design)

      structured basis testing--结构化的基础测试

      根据代码逻辑设计测试用例来获得100%分支覆盖的一种测试用例设计技术。

      structured design--结构化设计

      软件设计的任何遵循一定纪律的方法,它按照特定的规则,例如:模块化,有顶向下设计,数据逐步优化,系统

      结构和处理步骤。

      structured programming--结构化编程

      在结构化程序开发中的任何包含结构化设计和结果的软件开发技术。

      structured walkthrough--结构化走读

      参考走读(walkthrough)

      第134贴【2004-11-4】:常见测试术语十六

      stub--桩

      一个软件模块的框架或特殊目标实现,主要用于开发和测试一个组件,该组件调用或依赖这个模块。

      symbolic evaluation--符号评价

      参考符号执行(symbolic execution)

      symbolic execution--符号执行

      通过符号表达式来执行程序路径的一种静态分析设计技术。其中,程序的执行被用符号来模拟,例如,使用变量

      名而不是实际值,程序的输出被表示成包含这些符号的逻辑或数学表达式。

      symbolic trace--符号轨迹

      一个计算机程序通过符号执行是经过的语句分支结果的一个记录。

      syntax testing--语法分析

      根据输入语法来验证一个系统或组件的测试用例设计技术。

      system analysis--系统分析

      对一个计划的或现实的系统进行的一个系统性调查以确定系统的功能以及系统与其它系统之间的交互。

      system design--系统设计

      一个定义硬件和软件构架、组件、模块、接口和数据的过程以满足指定的规格。

      system integration--系统集成

      一个系统组件的渐增的连接和测试,直到一个完整的系统。

      System Testing--系统测试

      从一个系统的整体而不是个体上来测试一个系统,并且该测试关注的是规格,而不是系统内部的逻辑。

      第135贴【2004-11-7】:常见测试术语十七

      technical requirements testing--技术需求测试

      参考非功能需求测试(non-functional requirements testing)

      test automation--测试自动化

      使用工具来控制测试的执行、结果的比较、测试预置条件的设置、和其它测试控制和报告功能。

      test case--测试用例

      用于特定目标而开发的一组输入、预置条件和预期结果。

      test case design technique--测试用例设计技术

      选择和导出测试用例的技术。

      test case suite--测试用例套

      对被测软件的一个或多个测试用例的集合。

      test comparator--测试比较器

      一个测试工具用于比较软件实际测试产生的结果与测试用例预期的结果。

      test completion criterion--测试完成标准

      一个标准用于确定被计划的测试何时完成。

      test coverage--测试覆盖

      参考覆盖率(Coverage)

      test driver--测试驱动

      一个程序或测试工具用于根据测试套执行软件。

      test environment--测试环境

      测试运行其上的软件和硬件环境的描述,以及任何其它与被测软件交互的软件,包括驱动和桩。

      第136贴【2004-11-8】:常见测试术语十八

      test execution--测试执行

      一个测试用例被被测软件执行,并得到一个结果。

      test execution technique--测试执行技术

      执行测试用例的技术,包括手工、自动化等。

      test generator--测试生成器

      根据特定的测试用例产生测试用例的工具。

      test harness--测试用具

      包含测试驱动和测试比较器的测试工具。

      test log--测试日志

      一个关于测试执行所有相关细节的时间记录。

      test measurement technique--测试度量技术

      度量测试覆盖率的技术。

      Test Plan--测试计划

      一个文档,描述了要进行的测试活动的范围、方法、资源和进度。它确定测试项、被测特性、测试任务、谁执行

      任务,并且任何风险都要冲突计划。

      test procedure--测试规程

      一个文档,提供详细的测试用例执行指令。

      test records--测试记录

      对每个测试,明确的记录被测组件的标识、版本,测试规格,和实际结果

      test report--测试报告

      一个描述系统或组件执行的测试和结果的文档。

      Test scrīpt--测试脚本

      一般指的是一个特定测试的一系列指令,这些指令可以被自动化测试工具执行。

      Test Specification--测试规格

      一个文档,用于指定一个软件特性、特性组合或所有特性的测试方法、输入、预期结果和执行条件。

      第137贴【2004-11-9】:常见测试术语十九

      test strategy--测试策略

      一个简单的高层文档,用于描述测试的大致方法,目标和方向。

      test suite--测试套

      测试用例和/或测试脚本的一个集合,与一个应用的特定功能或特性相关。

      test target--测试目标

      一组测试完成标准。

      testability--可测试性

      一个系统或组件有利于测试标准建立和确定这些标准是否被满足的测试执行的程度。

      Testing--测试

      IEEE给出的定义是:1)一个执行软件的过程,以验证其满足指定的需求并检测错误。2)一个软件项的分析过程

      以检测已有条件之间的不同,并评价软件项的特性。

      thread testing--线程测试

      自顶向下测试的一个变化版本,其中,递增的组件集成遵循需求子集的实现。

      time sharing--时间共享

      一种操作方式,允许两个或多个用户在相同的计算机系统上同时执行计算机程序。其实现可能通过时间片轮转、

      优先级中断等。

      top-down design--由顶向下设计

      一种设计策略,首先设计最高层的抽象和处理,然后逐步向更低级别进行设计。

      top-down testing--自顶向下测试

      集成测试的一种策略,首先测试最顶层的组件,其它组件使用桩,然后逐步加入较低层的组件进行测试,直到所

      有组件被集成到系统中。

      traceability--可跟踪性

      开发过程的两个或多个产品之间关系可以被建立起来的程度,尤其是产品彼此之间有一个前后处理关系。

      traceability analysis--跟踪性分析

      (1)跟踪概念文档中的软件需求到系统需求;(2)跟踪软件设计描述到软件需求规格,以及软件需求规格到软

      件设计描述;(3)跟踪源代码对应到设计规格,以及设计规格对应到源代码。分析确定它们之间正确性、一致性

      、完整性、精确性的关系。

      traceability matrix--跟踪矩阵

      一个用于记录两个或多个产品之间关系的矩阵。例如,需求跟踪矩阵是跟踪从需求到设计再到编码的实现。

      第138贴【2004-11-10】:常见测试术语二十

      transaction--事务/处理

      (1)一个命令、消息或输入记录,它明确或隐含的调用了一个处理活动,例如更新一个文件。(2)用户和系统

      之间的一次交互。(3)在一个数据库管理系统中,完成一个特定目的的处理单元,如恢复、更新、修改或删除一

      个或多个数据元素。

      transform analysis--事务分析

      系统的结构是根据分析系统需要处理的事务获得的一种分析技术。

      trojan horse--特洛伊木马

      一种攻击计算机系统的方法,典型的方法是提供一个包含具有攻击性隐含代码的有用程序给用户,在用户执行该

      程序的时候,其隐含的代码对系统进行非法访问,并可能产生破坏。

      truth table--真值表

      用于逻辑操作的一个操作表格。

      Unit Testing--单元测试

      测试单个的软件组件,属于白盒测试范畴,其测试基础是软件内部的逻辑。

      Usability Testing--可用性测试

      测试用户使用和学习产品的容易程度。

      validation--确认

      根据用户需要确认软件开发的产品的正确性。

      verification--验证

      评价一个组件或系统以确认给定开发阶段的产品是否满足该阶段开始时设定的标准。

      version--版本

      一个软件项或软件元素的一个初始发布或一个完整的再发布。

      volume testing--容量测试

      使用大容量数据测试系统的一种策略。

      Walkthrough--走读

      一个针对需求、设计或代码的非正式的同行评审,一般由作者发起,由作者的同行参与进行的评审过程。

      waterfall model--瀑布模型

      软件开发过程模型的一种,包括概念阶段、需求阶段、设计阶段、实现阶段、测试阶段、安装和检查阶段、操作

      和维护阶段,这些阶段按次序进行,可能有部分重叠,但很少会迭代。

      White Box Testing--白盒测试

      根据软件内部的工作原理分析来进行测试。

  • 单元测试的基本方法

    2007-11-06 15:31:05

    单元测试的基本方法


      单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试

    单元测试任务


      单元测试任务包括:1 模块接口测试;2 模块局部数据结构测试;3 模块边界条件测试;4 模块中所有独立执行通路测试;5 模块的各条错误处理通路测试。


      模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:
      1 输入的实际参数与形式参数的个数是否相同;
      2 输入的实际参数与形式参数的属性是否匹配;
      3 输入的实际参数与形式参数的量纲是否一致;
      4 调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;
      5 调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;
      6调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;
      7 调用预定义函数时所用参数的个数、属性和次序是否正确;
      8 是否存在与当前入口点无关的参数引用;
      9 是否修改了只读型参数;
      10 对全程变量的定义各模块是否一致;
      11是否把某些约束作为参数传递。


      如果模块内包括外部输入输出,还应该考虑下列因素:
      1 文件属性是否正确;
      2 OPEN/CLOSE语句是否正确;
      3 格式说明与输入输出语句是否匹配;
      4缓冲区大小与记录长度是否匹配;
      5文件使用前是否已经打开;
      6是否处理了文件尾;
      7是否处理了输入/输出错误;
      8输出信息中是否有文字性错误;


      检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:
      1 不合适或不相容的类型说明;
      2变量无初值;
      3变量初始化或省缺值有错;
      4不正确的变量名(拼错或不正确地截断);
      5出现上溢、下溢和地址异常。


      除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。


      在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:
      1 误解或用错了算符优先级;
      2混合类型运算;
      3变量初值错;
      4精度不够;
      5表达式符号错。


      比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误:
      1不同数据类型的对象之间进行比较;
      2错误地使用逻辑运算符或优先级;
      3因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;
      4比较运算或变量出错;
      5循环终止条件或不可能出现;
      6迭代发散时不能退出;
      7错误地修改了循环变量。


      一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:
      1输出的出错信息难以理解;
      2记录的错误与实际遇到的错误不相符;
      3在程序自定义的出错处理段运行之前,系统已介入;
      4异常处理不当;
      5错误陈述中未能提供足够的定位出错信息。


      边界条件测试是单元测试中最后,也是最重要的一项任务。众的周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。


    单元测试过程


      一般认为单元测试应紧接在编码之后,当源程序编制完成并通过复审和编译检查,便可开始单元测试。测试用例的设计应与复审工作相结合,根据设计信息选取测试数据,将增大发现上述各类错误的可能性。在确定测试用例的同时,应给出期望结果。


      应为测试模块开发一个驱动模块(driver)和(或)若干个桩模块(stub),下图显示了一般单元测试的环境。驱动模块在大多数场合称为“主程序”,它接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,“主程序”打印“进入-退出”消息。


      驱动模块和桩模块是测试使用的软件,而不是软件产品的组成部分,但它需要一定的开发费用。若驱动和桩模块比较简单,实际开销相对低些。遗憾的是,仅用简单的驱动模块和桩模块不能完成某些模块的测试任务,这些模块的单元测试只能采用下面讨论的综合测试方法。


      提高模块的内聚度可简化单元测试,如果每个模块只能完成一个,所需测试用例数目将显著减少,模块中的错误也更容易发现。
  • selenium命令集

    2007-11-06 11:10:34

         

    一、  Commands (命令)

    • Action
      对当前状态进行操作
      失败时,停止测试
    • Assertion
      校验是否有产生正确的值
    • Element Locators
      指定HTML中的某元素
    • Patterns
      用于模式匹配

    1. Element Locators (元素定位器)

    • id=id
      id locator 指定HTML中的唯一id的元素 
    •  name=name
      name locator指定 HTML中相同name的元素中的第一个元素
    •  identifier=id
      identifier locator 首先查找HTML是否存在该id的元素, 若不存在,查找第一个该name的元素 
    • dom=javascrīptExpression
      dom locator用Javascrīpt表达式来定位HTML中的元素,注意必须要以"document"开头
      例如:
      dom=document.forms['myForm'].myDropdown
      dom=document.images[56]
    •  xpath=xpathExpression
      xpath locator用 XPath 表达式来定位HTML中的元素,必须注意要以"//"开头
      例如:
      xpath=//img[@alt='The image alt text']
      xpath=//table[@id='table1']//tr[4]/td[2]
    •  link=textPattern
      link locator 用link来选择HTML中的连接或锚元素
      例如:
      link=The link text
    • 在没有locator前序的情况下 Without a locator prefix, Selenium uses:
      如果以"document."开头,则默认是使用 dom locator,如果是以"//"开头,则默认使用xpath locator,其余情况均认作identifier locator

    2. String Matching Patterns (字符串匹配模式)

    • glob:patthern
      glob模式,用通配符"*"代表任意长度字符,"?"代表一个字符
    • regexp:regexp
      正则表达式模式,用Javascrīpt正则表达式的形式匹配字符串
    • exact:string
      精确匹配模式,精确匹配整个字符串,不能用通配符
    • 在没有指定字符串匹配前序的时候,selenium 默认使用golb 匹配模式

    3. Select Option Specifiers (Select选项指定器)

    • label=labelPattern
      通过匹配选项中的文本指定选项
      例如:label=regexp:^[Oo]ther
    • value=valuePattern
      通过匹配选项中的值指定选项
      例如:value=other
    • id=id
      通过匹配选项的id指定选项
      例如: id=option1
    • index=index
      通过匹配选项的序号指定选项,序号从0开始
      例如:index=2
    • 在没有选项选择前序的情况下,默认是匹配选项的文本

    二、 Actions
    描述了用户所会作出的操作。
    Action 有两种形式: action和actionAndWait, action会立即执行,而actionAndWait会假设需要较长时间才能得到该action的相响,而作出等待,open则是会自动处理等待时间。

    • click
      click(elementLocator)
      - 点击连接,按钮,复选和单选框
      - 如果点击后需要等待响应,则用"clickAndWait"
      - 如果是需要经过Javascrīpt的alert或confirm对话框后才能继续操作,则需要调用verify或assert来告诉Selenium你期望对对话框进行什么操作。
      click aCheckbox  
      clickAndWait submitButton  
      clickAndWait anyLink  
    • open
      open(url)
      - 在浏览器中打开URL,可以接受相对和绝对路径两种形式
      - 注意:该URL必须在与浏览器相同的安全限定范围之内
      open /mypage  
      open http://localhost/  
    • type
       type(inputLocator, value)
      - 模拟人手的输入过程,往指定的input中输入值
      - 也适合给复选和单选框赋值
      - 在这个例子中,则只是给钩选了的复选框赋值,注意,而不是改写其文本
      type nameField John Smith
      typeAndWait textBoxThatSubmitsOnChange newValue
    • select
      select(dropDownLocator, optionSpecifier)
      - 根据optionSpecifier选项选择器来选择一个下拉菜单选项
      - 如果有多于一个选择器的时候,如在用通配符模式,如"f*b*",或者超过一个选项有相同的文本或值,则会选择第一个匹配到的值
      select  dropDown Australian Dollars
      select  dropDown index=0
      selectAndWait currencySelector value=AUD
      selectAndWait currencySelector label=Auslian D*rs
    •  goBack,close
      goBack()
      模拟点击浏览器的后退按钮
      close()
      模拟点击浏览器关闭按钮
    • selectWindow
      select(windowId)
      - 选择一个弹出窗口
      - 当选中那个窗口的时候,所有的命令将会转移到那窗口中执行
      selectWindow myPopupWindow  
      selectWindow null  
    • pause
      pause(millisenconds)
      - 根据指定时间暂停Selenium脚本执行
      - 常用在调试脚本或等待服务器段响应时
      pause 5000  
      pause 2000  
    • fireEvent
       fireEvent(elementLocatore,evenName)
      模拟页面元素事件被激活的处理动作
      fireEvent textField focus
      fireEvent dropDown blur
    • waitForCondition
      waitForCondition(JavascrīptSnippet,time)
      - 在限定时间内,等待一段Javascrīpt代码返回true值,超时则停止等待
      waitForCondition var value=selenium.getText("foo"); value.match(/bar/); 3000
    • waitForValue
      waitForValue(inputLocator, value)
      - 等待某input(如hidden input)被赋予某值,
      - 会轮流检测该值,所以要注意如果该值长时间一直不赋予该input该值的话,可能会导致阻塞
      waitForValue finishIndication isfinished
           
    • store,stroreValue
      store(valueToStore, variablename)
      保存一个值到变量里。
      该值可以由自其他变量组合而成或通过Javascrīpt表达式赋值给变量
      store Mr John Smith fullname
      store $.{title} $.{firstname} $.{suname} fullname
      store javascrīpt.{Math.round(Math.PI*100)/100} PI
      storeValue inputLocator variableName

      把指定的input中的值保存到变量中

      storeValue userName userID
      type userName $.{userID}
    • storeText, storeAttribute
      storeText(elementLocator, variablename)
      把指定元素的文本值赋予给变量
      storeText currentDate expectedStartDate
      verifyValue startDate $.{expectedStartDate}

      storeAttribute(.{}elementLocator@attributeName,variableName.{)
      把指定元素的属性的值赋予给变量

      storeAttribute input1@class  classOfInput1
      verifyAttribute input2@class $.{classOfInput1}
    • chooseCancel.., answer..
      chooseCancelOnNextConfirmation()
      - 当下次Javascrīpt弹出confirm对话框的时候,让selenium选择Cancel
      - 如果没有该命令时,遇到confirm对话框Selenium默认返回true,如手动选择OK按钮一样
      chooseCancelOnNextConfirmation     

      - 如果已经运行过该命令,当下一次又有confirm对话框出现时,也会同样地再次选择Cancel
      answerOnNextPrompt(answerString)
      - 在下次Javascrīpt弹出prompt提示框时,赋予其anweerString的值,并选择确定

      answerOnNextPrompt Kangaroo  

    三、 Assertions
    允许用户去检查当前状态。两种模式: Assert 和 Verify, 当Assert失败,则退出测试;当Verify失败,测试会继续运行。

    • assertLocation, assertTitle
      assertLocation(relativeLocation)
      判断当前是在正确的页面
      verifyLocation /mypage  
      assertLocation /mypage  
    • assertTitle(titlePattern)
      检查当前页面的title是否正确
      verifyTitle My Page  
      assertTitle My Page  
    • assertValue
      assertValue(inputLocator, valuePattern)
      - 检查input的值
      - 对于 checkbox或radio,如果已选择,则值为"on",反之为"off"
      verifyValue nameField John Smith
      assertValue document.forms[2].nameField John Smith
    • assertSelected, assertSelectedOptions
      assertSelected(selectLocator, optionSpecifier)
      检查select的下拉菜单中选中的选型是否和optionSpecifer(Select选择选项器)的选项相同
      verifySelected dropdown2 John Smith
      verifySelected dorpdown2 value=js*123
      assertSelected document.forms[2].dropDown label=J*Smith
      assertSelected document.forms[2].dropDown index=0
    • assertSelectOptions(selectLocator, optionLabelList)
      - 检查下拉菜单中的选项的文本是否和optionLabelList相同
      - optionLabelList是以逗号分割的一个字符串
      verifySelectOptions dropdown2 John Smith,Dave Bird
      assertSelectOptions document.forms[2].dropdown Smith,J,Bird,D
    • assertText
      assertText(elementLocator,textPattern)
      - 检查指定元素的文本
      - 只对有包含文本的元素生效
      - 对于Mozilla类型的浏览器,用textContent取元素的文本,对于IE类型的浏览器,用innerText取元素文本
      verifyText statusMessage Successful
      assertText //div[@id='foo']//h1 Successful
    • assertTextPresent, assertAttribute
      assertTextPresent(text)
      检查在当前给用户显示的页面上是否有出现指定的文本
      verifyTextPresent You are now logged in  
      assertTextPresent You are now logged in  
    • assertAttribute(.{}elementLocator@attributeName.{, ValuePattern)
      检查当前指定元素的属性的值
      verifyAttribute txt1@class bigAndBlod
      assertAttribute document.images[0]@alt alt-text
      verifyAttribute //img[@id='foo']/alt alt-text
    • assertTextPresent, etc.
      assertTextPresent(text)
      assertTextNotPresent(text)
      assertElementPresent(elementLocator)
       verifyElementPresent   submitButton   
       assertElementPresent   //img[@alt='foo']    assertElementNotPresent(elementLocator)
    • assertTable
      assertTable(cellAddress, valuePattern)
      - 检查table里的某个cell中的值
      - cellAddress的语法是tableName.row.column, 注意行列序号都是从0开始
      verifyTable myTable.1.6 Submitted
      assertTable results0.2 13
    • assertVisible, nonVisible
      assertVisible(elementLocator)
      - 检查指定的元素是否可视的
      - 隐藏一个元素可以用设置css的'visibility'属性为'hidden',也可以设置'display'属性为'none'
      verfyVisible postcode  
      assertVisible postcode  
    • assertNotVisible(elementLocator)
       verfyNotVisible   postcode   
       assertNotVisible   postcode   
    • Editable, non-editable
      assertEditable(inputLocator)
      检查指定的input是否可以编辑
      verifyEditable shape  
      assertEditable colour  
    • assertNotEditable(inputLocator)
      检查指定的input是否不可以编辑
    • assertAlert
      assertAlert(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的alert对话框
      - alert产生的顺序必须与检查的顺序一致
      - 检查alert时会产生与手动点击'OK'按钮一样的效果。如果一个alert产生了,而你却没有去检查它,selenium会在下个action中报错。
      - 注意:Selenium 不支持 Javascrīpt 在onload()事件时 调用alert();在这种情况下,Selenium需要你自己手动来点击OK.
    • assertConfirmation
      assertConfirmation(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的confirmation对话框和alert情况一样,confirmation对话框也必须在它们产生的时候进行检查
      - 默认情况下,Selenium会让confirm() 返回true, 相当于手动点击Ok按钮的效果。你能够通过chooseCancelOnNextConfirmation命令让confirm()返回false.同样地,如果一个cofirmation对话框出现了,但你却没有检查的话,Selenium将会在下个action中报错
      - 注意:在Selenium的环境下,confirmation对话框框将不会再出现弹出显式对话框
      - 注意:Selenium不支持在onload()事件时调用confirmation对话框,在这种情况下,会出现显示confirmatioin对话框,并需要你自己手动点击。
    •  assertPrompt
      assertPrompt(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的Prompt对话框
      - 你检查的prompt的顺序Prompt对话框产生的顺序必须相同
      - 必须在verifyPrompt之前调用answerOnNextPrompt命令
      - 如果prompt对话框出现了但你却没有检查,则Selenium会在下个action中报错
      answerOnNextPrompt Joe  
      click id=delegate  
      verifyPrompt Delegate to who?  

    四、 Parameters and Variables
    参数和变量的声明范围由简单的赋值到Javascrīpt表达式赋值。
    Store,storeValue 和storeText 为下次访问保存值。
    在Selenium内部是用一个叫storeVars的map来保存变量名。

    • Variable Substitution 变量替换
      提供了一个简单的方法去访问变量,语法 $.{xxx}
      store Mr title
      storeValue nameField surname
      store $.{title} $.{suname} fullname
      type textElement Full name is: $.{fullname}
    •  Javascrīpt Evaluation Javascrīpt赋值
      你能用Javascrīpt来构建任何你所需要的值。
      这个参数是以javascrīpt开头,语法是 javascrīpt.{'with a trailing'}。
      可以通过Javascrīpt表达式给某元素赋值。
      store javascrīpt.{'merchant'+(new Date()).getTime()} merchantId
      type textElement javascrīpt.{storedVars['merchantId'].toUpperCase()}
    • Generating Unique values 产生唯一值.  
      问题:你需要唯一的用户名
      解决办法: 基于时间来产生用户名,如'fred'+(new Date().getTime())

     
  • 配置管理

    2007-11-05 15:03:04

    配置管理

         配置管理(Configuration ManagementCM)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。配置管理的目标是记录软件产品的演化过程,确保软件开发者在软件生命周期中各个阶段都能得到精确的产品配置。

          配置管理过程是对处于不断演化、完善过程中的软件产品的管理过程。其最终目标是实现软件产品的完整性、一致性、可控性,使产品极大程度地与用户需求相吻合。它通过控制、记录、追踪对软件的修改和每个修改生成的软件组成部件来实现对软件产品的管理功能。

          早在七十年代初期加利福利亚大学的Leon Presser教授就撰写了一篇论文,提出控制变更和配置的概念,之后在1975年,他成立了一家名为SoftTool的公司,开发了自己的配置管理工具:CCC,这也是最早的配置管理工具之一。之后,随着软件开发规模的逐渐增大,越来越多的公司和团队意识到了软件配置管理的重要性,而相应的软件配置管理工具也如雨后春笋一般,纷纷涌现,比较有代表性的有:Marc Rochkind的SCCS(Source Code Control System)和Walter Tichy的RCS(Revision Control System),这两种工具对日后的配置管理工具的发展做出了重大的贡献,目前绝大多数广泛使用的配置管理工具基本上都是基于这两者的设计思想和体系架构

    一、配置管理在软件开发过程和项目管理过程中的作用

          随着软件系统的日益复杂化和用户需求、软件更新的频繁化,配置管理逐渐成为软件生命周期中的重要控制过程,在软件开发过程中扮演着越来越来重要的角色。一个好的配置管理过程能覆盖软件开发和维护的各个方面,同时对软件开过程的宏观管理,即项目管理,也有重要的支持作用。良好的配置管理能使软件开发过程有更好的可预测性,使软件系统具有可重复性,使用户和主管部门用软件质量和开发小组有更强的信心。

          软件配置管理的最终目标是管理软件产品。由于软件产品是在用户不断变化的需求驱动下不断变化,为了保证对产品有效地进行控制和追踪,配置管理过程不能仅仅对静态的、成形的产品进行管理,而必须对动态的、成长的产品进行管理。由此可见,配置管理同软件开发过程紧密相关。配置管理必须紧扣软件开发过程的各个环节:管理用户所提出的需求,监控其实施,确保用户需求最终落实到产品的各个版本中去,并在产品发行和用户支持等方面提供帮助,响应用户新的需求,推动新的开发周期。通过配置管理过程的控制,用户对软件产品的需求如同普通产品的订单一样,遵循一个严格的流程,经过一条受控的生产流水线,最后形成产品,发售给相应用户。从另一个角度看,在产品开发的不同阶段通常有不同的任务,由不同的角色担当,各个角色职责明确,泾渭分明,但同时又前后衔接,相互协调。

          好的配置管理过程有助于规范各个角色的行为,同时又为角色之间的任务传递提供无缝的接合,使整个开发团队象一个交响乐队一样和谐而又错杂地行进。正因为配置管理过程直接连接产品开发过程、开发人员和最终产品,这些都是项目主管人员所关注的重点,因此配置管理系统在软件项目管理中也起着重要。配置管理过程演化出的控制、报告功能可帮助项目经理更好地了解项目的进度、开发人员的负荷、工作效率和产品质量状况、交付日期等信息。同时配置管理过程所规范的工作流程和明确的分工有利于管理者应付开发人员流动的困境,使新的成员可以快速实现任务交接,尽量减少因人员流动而造成的损失。


    二、配置管理的功能

          配置管理系统应该具备以下主要功能:

    并行开发支持:因开发和维护的原因,要求能够实现开发人员同时在同一个软件模块上工作,同时对同一个代码部分作不同的修改,即使是跨地域分布的开发团队也能互不干扰,协同工作,而又不失去控制;
    修订版管理:跟踪每一个变更的创造者、时间和原因,从而加快问题和缺陷的确定 ;
    版本控制:能够简单、明确地重现软件系统的任何一个历史版本 ;
    产品发布管理:管理、计划软件的变更,与软件的发布计划、预先定制好的生命周期或相关的质量过程保持一致;项目经理能够随时清晰地了解项目的状态 ;
    建立管理:基于软件存储库的版本控制功能,实现建立(build)过程自动化 ;
    过程控制:贯彻实施开发规范,包括访问权限控制、开发规则的实施等 ;
    变更请求管理:跟踪、管理开发过程中出现的缺陷(Defect)、功能增强请求(RFE)或任务(Task),加强沟通和协作,能够随时了解变更的状态 ;
    代码共享:提供良好的存储和访问机制,开发人员可以共享各自的开发资源 ;

    三、配置管理的流程


    图17-1 配置管理流程图

    1、制定配置管理计划


          配置管理员制定《配置管理计划》,主要内容包括配置管理软硬件资源、配置项计划、基线计划、交付计划、备份计划等。CCB审批该计划。

    2、配置库管理
          配置管理员为项目创建配置库,并给每个项目成员分配权限。各项目成员根据自己的权限操作配置库。配置管理员定期维护配置库,例如清楚垃圾文件、备份配置库等。

    3、版本控制
          在项目开发过程中,绝大部分的配置项都要经过多次的修改才能最终确定下来。对配置项的任何修改都将产生新的版本。由于我们不能保证新版本一定比老版本“好”,所以不能抛弃老版本。版本控制的目的是按照一定的规则保存配置项的所有版本,避免发生版本丢失或混淆等现象,并且可以快速准确地查找到配置项的任何版本。
          配置项的状态有三种:“草稿”、“正式发布”和“正在修改”,本规程制定了配置项状态变迁与版本号的规则。

    4、变更控制
          在项目开发过程中,配置项发生变更几乎是不可避免的。变更控制的目的就是为了防止配置项被随意修改而导致混乱。
          修改处于“草稿”状态的配置项不算是“变更”,无需CCB的批准,修改者按照版本控制规则执行即可。
          当配置项的状态成为“正式发布”,或者被“冻结”后,此时任何人都不能随意修改,必须依据“申请-审批-执行变更-再评审-结束”的规则执行。

    5、配置审计
          为了保证所有人员(包括项目成员、配置管理员和CCB)都遵守配置管理规范,质量保证人员要定期审计配置管理工作。配置审计是一种“过程质量检查”活动,是质量保证人员的工作职责之一。

    四、配置管理的实施

          实施配置管理系统,一般的步骤和需要考虑的问题如下:

          规划、调整网络开发环境

          一个规划良好的开发环境,是实施配置管理系统的前提。在此阶段我们要对配置管理系统做出规划,主要考虑以下问题:

         * 网络的带宽、拓扑结构
          *服务器的选择、命名规范
          *存储区的定位
          *开发人员及组的命名规约等


          设计配置管理库

          根据项目开发的要求,设计开发资源的存储模式,良好的存储模式有利于减轻管理上的负担,增强配置管理库的访问性能,同时便于控制访问权限,保护软件资产。

          定义配置管理系统的角色

          在此阶段,我们需要确定与配置管理相关的所有角色,包括他们的相应的活动。在开发过程中,一个开发人员可能兼任多种角色,但一项任务在同一时刻只能由一个角色来执行。

          一般配置管理中的角色主要包括:

           项目经理:项目经理在配置管理方面的职责是依靠配置管理员、系统管理员和系统体系结构设计人员的帮助,制定项目的组织结构和配置管理策略。这些工作包括:定制开发子系统,定制访问控制,制定常用策略,制定集成里程碑,以及进行系统集成;


          配置管理员:配置管理员的职责是根据项目经理制定的开发组织结构和策略,实施、维护配置管理的环境。其主要职责如下:创建配置管理库,对存储库进行日常备份和恢复,维护配置管理环境,及管理配置管理相关的用户;
          软件开发人员:软件开发人员依据项目的开发和配置管理策略,创建、修改和测试开发工件;
          集成人员:对软件进行归并,形成相应的基线或发布版本 ;
          QA人员:需要对软件配置管理有较深的认识,其主要工作是跟踪当前项目的状态,测试,报告错误,并验证其修复结果;

          制定配置管理流程

          这是配置管理实施的一个重要阶段,其主要目的是根据项目开发的需要,制定相应的配置管理流程,以更好地支持开发,主要活动包括:

          定制并行开发策略:合理的并行开发策略应该具有以下特点:协调项目的复杂性和需求,统一创建分支类型元数据,为开发过程中的变更集成制定有效的规范,适时反映开发过程中方法和需求的变化
    发布版本管理:软件开发过程中的一个关键活动是提取工件的相关版本,以形成软件系统的阶段版本或发布版本,我们一般将其称为稳定基线。一个稳定基线代表新开发活动的开始,而一系列定制良好的活动之后又会产生一个新的稳定基线。有效地利用此项功能,在项目开发过程中可以自始至终管理、跟踪工件版本间的关联。

          相关人员的培训

         一般来讲,实施配置管理系统,相关人员需要接受以下培训:

          管理员培训:针对配置管理员,主要学习配置管理工具管理相关内容
          开发人员培训:针对开发人员,主要学习配置管理工具与开发相关的常用操作
          管理流程培训:针对全体人员,目的是了解配置管理策略和流程,以及如何与开发管理、项目管理相结合

    五、配置管理经验谈

          围绕配置管理,世界一些致力于软件工程研究的公司在深入理解ISO 9000的基础上, 推出了各种符合ISO 9000配置管理标准的工具软件,如INTERSOLV公司的PVCS,Rational公司的Clear Case等。这些配置管理工具面向软件规范化、工程化、自动化的需要,帮助开发团队提高科学管理水平,从而提高工程效率,降低工程成本。现以PVCS为例,结合我们的实际经验,谈谈我们实施配置管理的益处:

    1. 节约费用

          (1) 缩短开发周期

          利用PVCS的Version Manager对程序资源进行版本管理和跟踪,建立公司的代码知识库,保存开发过程中每一过程版本,这样大大提高了代码的重用率,还便于同时维护多个版本和进行新版本的开发,防止系统崩溃,最大限度地共享代码。同时项目管理人员可以通过Version Manager查看项目开发日志,测试人员可以根据开发日志和不同版本对软件进行测试,工程人员可以从Version Manager上得到不同的运行版本,并且Version Manager 可以安装在Web Server供外地施工人员存取最新版本,无需开发人员亲临现场。

          利用Tracker组建开发团体之间的问题跟踪及消息通迅,通过其Notify模块与电子邮件结合起来大大加强了开发团体之间的沟通,Reporter模块可对发现的问题进行整理、以报表方式分报出,作为开发的指导。

          以上为PVCS的两个主要模块,科学地应用可以大大提高开发效率,避免了代码覆盖、沟通不够、开发无序的混乱局面,如果利用了公司原有的知识库,则更能提高工作效率,缩短开发周期。

          (2) 减少施工费用

          利用PVCS进行软件配置管理后,建立开发管理规范,把版本管理档案挂接在公司内部的Web服务器上,内部直接通过Netscape访问Version Manager,工程人员通过远程进入内部网,获取所需的最新版本。开发人员无需下现场,现场工程人员通过对方系统管理员收集反馈意见,书面提交到公司内部开发组项目经理,开发组内部讨论决定是否修改,并作出书面答复。这样做,可以同时响应多个项目点,防止开发人员分配到各个项目点、分散力量、人员不够的毛病,同时节约大量的旅差费用。

    2. 有利于知识库的建立

          (1) 代码对象

          软件代码是软件开发人员脑力劳动的结晶,也是软件公司的宝贵财富,长期开发过程中形成的各种代码对象就像一个个零件坯一样,是快速生成系统的组成部分。长期的一个事实是:一旦某个开发人员离开工作岗位,其原来所作的代码便基本成为垃圾,无人过问。究其原因,就是没有专门对各人的有用对象进行管理,把其使用范围扩大到公司一级,进行规范化,加以说明和普及。Version Manager为对象管理提供了一个平台和仓库,有利于建立公司级的代码对象库。

          (2) 业务及经验库

          通过PVCS Version Manager的注释及Tracker,可形成完整的开发日志及问题集合,以文字方式伴随开发的整个过程,不依某个人的转移而消失,有利于公司积累业务经验,无论对版本整改或版本升级,都具有重要的指导作用。

    3. 规范管理

          (1) 量化工作量考核

          传统的开发管理中,工作量一直是难以估量的指标,靠开发人员自已把握,随意性相当大;靠管理人员把握,主观性又太强。采用PVCS管理后,开发人员每天下班前对修改的文件 Check In,其中记述当天修改细节描述,这些描述可以作为工作量的衡量指标。

          (2) 规范测试

          采用PVCS以后,测试有了实实在在的工作,测试工作人员根据每天的修改细节描述对每一天的工作做具体的测试,对测试人员也具有可考核性,这样环环相扣,大大减少了其工作的随意性。

          (3) 加强协调与沟通

          采用PVCS后,通过Version Manager文档共享及其特定锁机制、Tracker与电子邮件的集成,大大加强了项目成员之间的沟通,做到有问题及时发现、及时修改、及时通知,但又不额外增加很多的工作量。

    六、配置管理的精髓

    具体来讲,配置管理包含如下内容:

    􀂾 标识:识别产品的结构、产品的构件及其类型,为其分配唯一的标识符,并以某种形式提供对它们的存取。
    􀂾 控制:通过一定的机制控制对配置项的修改
    􀂾 状态报告:记录并报告配置项以及元数据的状态。
    􀂾 配置审计:确认产品的完整性并维护配置项间的一致性。

    从上面的描述,我们知道,配置管理的基本单位是配置项。
    从“哲学”意义上讲,它记录配置项的三个方面:
    􀂾 从哪里来?此项可归结为WWW的问题,(Who)谁创建的?(When)什么时间创建的?(Why)为什么创建此配置项?
    􀂾 当前在哪里?此项纪录配置项当前的存储位置以及状态。
    􀂾 将到哪里去?通过配置控制来把配置项“组装”到正确的版本中去。

          配置项可以是大粒度的,也可以是小粒度的。如果跟踪个别需求,那么不必要把整个需求规格说明文档定义为一个配置项,可以把每个需求定义为配置项;如果把软件开发工具也放入配置管理系统,那么把配置项定义为文件级就不合适了,只需要跟踪开发工具的版本,即把整个配置工具定义为一个配置项就足够了。

          简而言之,配置项可以是文件级粒度的,也可以使文件版本级粒度的。当然,粒度越小管理的成本越高,但是配置的精度也就越高。

          一个完整的SCM系统要具有三个核心功能:版本控制、变更控制、配置控制以及两个支持功能:状态统计和配置审计

          版本控制

          版本,亦称配置标识,是指某一特定对象的具体实例的潜在存在。这里的某一特定对象是指版本维护工具管理的软件组成单元,一般是指源文件;具体实例则是指软件开发人员从软件库中恢复出来的某软件组成单元的具有一定内容和属性的一个真实拷贝。例如,对源文件的每一次修改都生成一个新版本。

          版本控制就是对在软件开发过程中所创建的配置对象的不同版本进行管理,保证任何时候都能取到正确的版本以及版本的组合。

          当前,这方面典型的工具有如VSSCVS

          变更控制

          变更控制是通过对变更请求(Change Request,简称CR)进行分类、追踪和管理的过程来实现的。

          变更的起源有两种:功能变更和缺陷修补(Bug-Fix)。功能变更是为了增加或者删除某些功能。缺陷修补则是对已存在的缺陷进行修补。

          对变更进行控制的机构称为变更控制委员会(Change Control Board,简称CCB)。变更控制委员会要定期召开会议,对近期所产生的变更请求进行分析、整理,并做出决定。而且要遵循一定的变更机制。

          下面是一个典型的变更机制:


          我们可以随着变更过程的推进,提升配置项的状态。 这方面的工具有Bugzilla。
     

          配置控制

          配置控制使用户能够通过对适当版本的选择来组成特定属性(配置)的软件系统,这种灵活的“组装”策略使得配置管理系统象搭积木似的使用已有的积木(版本)组装成各种各样、不同功能的模型。
    软件产品的每个版本都是一组配置项(源代码、文档、数据)的集合。配置控制就是要保证每个配置的完整性和精确性。

          举个例子来说,我们要发布软件的32.6版本,那么我们就要把源代码、文档、数据中所有这个应该包含到这个版本中的正确配置项检出。

          在开发过程中,我们在不同阶段要建立各种基线。基线的建立是配置控制功能的典型应用。所以说,基线是具有里程碑意义的一个配置。

          一般的商业软件配置管理工具都具有配置控制的功能,只是灵活性和精确性有差别。

          状态报告
    状态报告要回答所谓4W的问题:
    What:发生了什么事?
    Who:谁做的此事?
    When:此事是什么时候发生的?
    Why:为什么做此事?
    状态报告还要能够报告所有配置项以及变更请求的状态。

          配置审计

          配置审计要审查整个配置管理过程是否符合规范,配置项是否与需求一致,记录正确,配置的组成是否具有一致性等等。

          由于现在软件行业越来越重视质量,许多项目专门成立质量保证部门专门来进行配置审计。所以现在也可以说,配置审计是一个SQA软件质量保证)活动。

          配置管理的商业模型

          配置管理的实施包括两部分:工具和规范。

         在软件开发过程自动化的今天,没有工具的支持而实施配置完整的配置管理是不能想象的。因此选择一个符合公司或项目的工具至关重要。在配置管理系统中,我们可归纳出四种模型。当前商业工具一般采用其中一种或几种模型。

          我们通过对商业模型的理解可以帮助我们了解某种工具是否适合我们公司或项目。

          CICO模型

          CICO模型主要关注的是单个文件的版本控制。图显示了一个支持CICO模型的CM系统的工作过程。用户利用库和文件系统来进行工作。文件被版本化并存储到库中,新版本的产生是由库工具控制的。然而, 文件在库中不是可以直接存取的,用户必须去检出(即Check Out)一个文件的版本到工作空间中以便读取它的内容。更改后的文件可以被检入库中(即Check in),产生文件的一个新版本。
    此模型的代表工具是SCCS和CVS。

          组织模型


          组织模型由CICO模型自然导出,建立于构件版本图的基础之上,同时依赖于存储库和工作空间的概念,可以通过对构件加锁进行并发控制。组织模型的重点是在CM系统支撑下加强了对创建配置、对有关的历史信息的管理和使用他们作为工作环境的支持。

          组织模型中的配置由系统模型和版本选择规则组成。系统模型列出了组成系统的所有的构件。版本选择规则指出了组成配置的每一个构件选择版本。选择规则用于系统模型,选择构件版本,即绑定一构件到某一版本。这个模型的操作方式是:开发员根据模型的构件定义整个系统,并在每一步骤中给每个构件选择合适的版本。版本操作的工作方式如图所示。

          CM支持主要关心的是维护系统和其构件的版本历史,并选择符合一致性配置的构件版本。只有在所选构件的版本与所选其它构件版本一致时才认为一个配置版本。
    此模型的代表工具是CCC。

          长事务模型

          长事务模型主要支持包括一系列原子变更的全系统演变和由团队开发员对系统变更的协调。开发员主要操作配置而非单独的构件。事务提交的结果是新配置版本,一系列连续的变更结果生成一系列的配置版本,称为开发路径。
    在长事务模型中,开发员主要的工作对象时配置,开发员首先选择系统配置版本,接下来把关注重点放在系统结构上。构件的版本由配置隐式决定。长事务由两个概念组成:工作空间和并发控制方案。工作空间来源于存储库或一个封闭工作空间中的一个固定配置。工作空间由工作配置和一系列已保存的配置组成。工作配置代表构件和系统结构能够被动态更改的配置。提供通过工作空间进行的透明库访问、将高效的库存储技术应用于工作空间和管理派生构件的版本。


    此模型的代表系统是NSE。


          变更集模型 

          主要集中于对系统配置的逻辑变更的支持。在这个模型中引入的变更集表示组成逻辑变更的对不同构件修改的集合,它是创建变更的活动完成后对逻辑变更的记录。支持这个模型的CM系统用户可以直接操作变更集。在变更集模型中,配置可描述为由基线和一组变更集组成。

          变更传播给其它配置可通过包含各自变更集来进行。开发员使用不同的集成策略将逻辑变更集包含到一个新的系统发行中。这样的好处非常明显,例如,我们现在维护10个不同版本的产品,现在要对所有的版本修改一个缺陷(Bug)。如果相同的工具简单的重复10次显然是不可接受的。而通过变更集把这个逻辑变更从一个版本自由的传到另外一个版本。

          开发员可跟踪逻辑变更和确定这些变更是否属于特定配置。这种配置管理的方法,因为其将重点放于逻辑变更上,所以被称作面向变更的配置管理。它不同于现在的其他3种CM模型,因为其它3种CM模型使用的面向版本的方法把重点放在构件和配置版本上。

          在单一构件的情况下,变更集是两个文件版本之间区别的集合,通常指的是增量内容。对配置来说,变更集就是两个配置版本之间区别的集合。这组区别就是两个配置版本间的修改构件增量集合,即变更构件集的增量。

          面向变更的观点不同于面向版本的观点。这有两点不同,一是逻辑变更的显式表示允许对与单个构件和配置有关的变更集进行跟踪。二是引用单个变更集并有选择地将它们纳入配置管理中的这种能力提供了对系统演化管理的支持,这种演化是基于将逻辑变更传播到维护的系统配置进行的。
    此模型的代表工具是UCM和SABLIME。

    结束语

          配置管理本身无论从理论和实践都在不断丰富和发展。例如,配置管理应用于“知识库”的管理就产生了“内容管理”这一新的领域。配置管理提供的状态报告和数据统计也为软件度量提供了决策依据。配置管理为项目管理提供了各种监控项目进展的视角,为项目经理确切掌握项目进程提供了保证。配置管理也为开发人员提供了一个协作的平台,在此平台上,大家能够更有效率的交流和协作。可以说,配置管理是软件开发的基石!
          配置管理近年来在中国得到了极大的认可,可以毫不夸张的说,没有配置管理,就谈不上软件开发,就谈不上软件质量,就谈不上软件业的发展。随着软件业规模的扩大,配置管理的实施不是要不要的问题,而是什么时间、如何实施的问题了。
    参考文献:
    Babich, W.A., Software Configuration Management, Addison-Wesley, 1986.
    Peter H. Feiler, Configuration Management Models in Commercial Environment, CMU/SEI-91-TR-7, 1991.4

  • 4、 用图形表示出软件测试与软件开发过程的关系。

    2007-11-02 11:24:42

      用图形表示出软件测试与软件开发过程的关系。

  • 等价类分析法是什么勒...

    2007-11-01 18:19:48

    请问等价类分析法是什么,设计出来的用例是哪种呢?

     

    因果图的画法又是什么样,符号有哪些呢?

  • 驱动模块和桩模块的定义与区别

    2007-11-01 18:17:46

    驱动模块和桩模块的定义与区别??
  • 显示器有阴影怎么办呢~~~~~~~~~哭

    2007-08-01 19:19:34

    哭哇~~~~~~~~~~

    我的显示器是PHILIPS滴,用了还没多久,出现严重的拖影,如果把接口把了,然后再插入到机箱接口会好一会,但又马上有问题了,忽~~~~~~~~~~怎么办勒~~~~~~~~

    我的机子没显卡滴.机箱也没在水多的地方放着

  • 测试试题)二(

    2007-07-31 15:04:48

     

    试题三

    [问题]按照V模型安排测试活动,在验收测试阶段发现的某些功能缺陷是与产品需求设计说明书有关,造成软件缺陷修复成本较高。你认为如果采用WH模型是否能避开这些类似问题出现?请谈一下W模型和H模型它们的优势。

     

    试题四

    [问题]去年全国处理“税票收入”交易约100万笔,考虑到3年后交易量递增到每年200万笔。假设每年交易量集中在8个月,每个月20个工作日,每个工作日8小时,试用80~20原理估算系统服务器的业务高峰期“税票收入”的交易吞吐量。

     

    试题五

    [问题]测试三角形是普通三角形、等腰三角形、等边三角形,画出程序流程图以及测试用例。

        

    A

    试题六

    [问题] 8.基于WEB信息管理系统测试时应考虑的因素有哪些?并加以详细阐述。

           

          

     

    试题七

    [问题]请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别和联系。

          

    试题八

    [问题]请尽可能举例描述性能测试工作的完整工作流程。

  • 测试试题

    2007-07-31 14:59:17

    试题一
    [
    说明]
      
    基本路径法设计出的测试用例能够保证在测试中程序的每一条可执行语句至少执行一次。以下代码由C什语言书写,请按要求回答问题。

    以下由C#语言书写
      void ReadPara( CString temp)
      {
       if ( temp == ">=")
         m_oper.SetCurSel(0);
       else
       {
         if (temp == ">")
          m_oper.SetCurSel(1);
         else
         {
          if ( temp == "==")
           m_oper.SetCurSel(2);
          else
          {
           if( temp == "<=")
            m_oper.SetCurSel(3);
           else
           {
            if ( temp == "<")
             m_oper.SetCurSel(4);
            else
             m_oper.SetCurSel(5);
           }
          }
         }
        }
       return;
      }
    [
    问题1] 请画出以上

    [问题2]请计算上述控制流图的环路复杂度V(G)

    [问题3] 请使用基本路径测试法为变量temp设计测试用例,使之满足基本路径覆盖要求。

     

    试题二

    [说明]ERPEnterprise Resource Planning)(企业资源计划)系统中,“计划管理”模块的流程图如下:

    销售发货管理

    销售管理

    计划需求

    MPS计算

    (主生产计划)

    废品报告

    可用库存是否满足销售计划

    销售发货管理

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


                            

    是否有可用内存

     


               

     

                              

    主生产计划

     


                      

    MRP计算

    (主需求计划)

    可用库存是否满足生存需求

    计划采购定单

     

     

     

     


                                                  

    下达

     

     


                                       

     

    采购管理

    计划生产定单

    下达

    生产管理

     

     

     

     

     

     

     

     

     

     


    [问题]

    下图画出“计划管理”模块的因果图,请将相应的输入条件和输出结果的编号填到相应的空白框中。

     

     

     

     


                  E                                       V

     


     E     I

    生成主生产计划

     


                  E                                        V

     

     

     


                                                           V

    可用库存满足生产需求

                                          

     

     


             O                                 

                                                           V

                                       

     

    条件和结果如下:

    a.                                                                                              可以进行销售发货管理

    b.                                                                                             可用库存不满足销售需求(有可用库存)

    c.                                                                                             可用库存不满足销售需求(无可用库存)

    d.                                                                                             可用库存满足生产需求

    e.                                                                                              可用库存不满足生产需求(有可用库存)

    f.                                                                                              可用库存不满足生产需求(无可用库存)

    g.                                                                                             可以进行MPS计算

    h.                                                                                             可用库存满足销售需求

    i.                                                                                               生成主生产计划

    j.                                                                                               生成计划采购定单

    k.                                                                                             生成计划生产定单

    l.                                                                                               可以进行MRP计算    

     

     

     

     

     

  • c#25问

    2007-07-02 10:26:31

    1.静态变量和非静态变量的区别?
    2.const 和 static readonly 区别?
    3.extern 是什么意思?
    4.abstract 是什么意思?
    5.internal 修饰符起什么作用?
    6.sealed 修饰符是干什么的?
    7.override 和 overload 的区别?
    8.什么是索引指示器?
    9.new 修饰符是起什么作用?
    10.this 关键字的含义?
    11.可以使用抽象函数重写基类中的虚函数吗?
    12.密封类可以有虚函数吗?
    13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?
    14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
    15.接口可以包含哪些成员?
    16.类和结构的区别?
    17.接口的多继承会带来哪些问题?
    18.抽象类和接口的区别?
    19.别名指示符是什么?
    20.如何释放非托管资源?
    21.P/Invoke是什么?
    22.StringBuilder 和 String 的区别?
    23.explicit 和 implicit 的含义?
    24.params 有什么用?
    25.什么是反射?

    以下是我做的一份参考答案(C# 语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正!


    1.静态变量和非静态变量的区别?

    答:

    静态变量:

    静态变量使用 static 修饰符进行声明

    在所属类被装载时创建

    通过类进行访问

    所属类的所有实例的同一静态变量都是同一个值

    非静态变量:

    不带有 static 修饰符声明的变量称做非静态变量

    在类被实例化时创建

    通过对象进行访问

    同一个类的不同实例的同一非静态变量可以是不同的值

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example01
    {
        class Program
        {
            class Class1
            {
                public static String staticStr = "Class";
                public String notstaticStr = "Obj";
            }
            static void Main(string[] args)
            {
                //静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
                Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
     
                Class1 tmpObj1 = new Class1();
                tmpObj1.notstaticStr = "tmpObj1";
                Class1 tmpObj2 = new Class1();
                tmpObj2.notstaticStr = "tmpObj2";
     
                //非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
                Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
                Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    Class1's staticStr: Class
    tmpObj1's notstaticStr: tmpObj1
    tmpObj2's notstaticStr: tmpObj2


    2.const 和 static readonly 区别?

    答:

    const

    用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序

    static readonly

    用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化

    示例:

    测试类:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example02Lib
    {
        public class Class1
        {
            public const String strConst = "Const";
            public static readonly String strStaticReadonly = "StaticReadonly";
            //public const String strConst = "Const Changed";
            //public static readonly String strStaticReadonly = "StaticReadonly Changed";
        }
    }
     
    客户端代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Example02Lib;
     
    namespace Example02
    {
        class Program
        {
            static void Main(string[] args)
            {
                //修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
                //然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe
                //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
     
                //可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
                //表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
                Console.WriteLine("strConst : {0}", Class1.strConst);
                Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    strConst : Const
    strStaticReadonly : StaticReadonly

    修改后的示例:

    测试类:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example02Lib
    {
        public class Class1
        {
            //public const String strConst = "Const";
            //public static readonly String strStaticReadonly = "StaticReadonly";
            public const String strConst = "Const Changed";
            public static readonly String strStaticReadonly = "StaticReadonly Changed";
        }
    }
    结果

    strConst : Const
    strStaticReadonly : StaticReadonly Changed


    3.extern 是什么意思?

    答:

    extern 修饰符用于声明由程序集外部实现的成员函数

    经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符

    也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)

    不能与 abstract 修饰符同时使用

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
     
    namespace Example03
    {
        class Program
        {
            //注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义
            //extern与DllImport一起使用时必须再加上一个static修饰符
            [DllImport("User32.dll")]
            public static extern int MessageBox(int Handle, string Message, string Caption, int Type);
     
            static int Main()
            {
                string myString;
                Console.Write("Enter your message: ");
                myString = Console.ReadLine();
                return MessageBox(0, myString, "My Message Box", 0);
            }
        }
    }
    结果:
     


    4.abstract 是什么意思?

    答:

    abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员

    abstract 不可以和 static 、virtual 、override 一起使用

    声明为 abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example04
    {
        #region 基类,抽象类
        public abstract class BaseClass
        {
            //抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写
            public abstract String Attribute
            {
                get;
                set;
            }
     
            //抽象方法,传入一个字符串参数无返回值
            public abstract void Function(String value);
     
            //抽象事件,类型为系统预定义的代理(delegate):EventHandler
            public abstract event EventHandler Event;
     
            //抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读
            public abstract Char this[int Index]
            {
                get;
            }
        }
        #endregion
     
        #region 继承类
        public class DeriveClass : BaseClass
        {
            private String attribute;
     
            public override String Attribute
            {
                get
                {
                    return attribute;
                }
                set
                {
                    attribute = value;
                }
            }
            public override void Function(String value)
            {
                attribute = value;
                if (Event != null)
                {
                    Event(this, new EventArgs());
                }
            }
            public override event EventHandler Event;
            public override Char this[int Index]
            {
                get
                {
                    return attribute[Index];
                }
            }
        }
        #endregion
     
        class Program
        {
            static void OnFunction(object sender, EventArgs e)
            {
                for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++)
                {
                    Console.WriteLine(((DeriveClass)sender)[i]);
                }
            }
            static void Main(string[] args)
            {
                DeriveClass tmpObj = new DeriveClass();
     
                tmpObj.Attribute = "1234567";
                Console.WriteLine(tmpObj.Attribute);
     
                //将静态函数OnFunction与tmpObj对象的Event事件进行关联
                tmpObj.Event += new EventHandler(OnFunction);
     
                tmpObj.Function("7654321");
     
                Console.ReadLine();
            }
        }
    }
    结果:
    1234567
    7
    6
    5
    4
    3
    2
    1


    5.internal 修饰符起什么作用?

    答:

    internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问

    接口的成员不能使用 internal 修饰符

    示例

    Example05Lib 项目的 Class1

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example05Lib
    {
        public class Class1
        {
            internal String strInternal = null;
            public String strPublic;
        }
    }
    结果
    Example05Lib 项目的 Class2 类可以访问到 Class1 的 strInternal 成员

     

    Example05 项目的 Program 类无法访问到 Class1 的 strInternal 成员

     


    6.sealed 修饰符是干什么的?

    答:

    sealed 修饰符表示密封

    用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥

    用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员

    通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱

    恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example06
    {
        class Program
        {
            class A
            {
                public virtual void F()
                {
                    Console.WriteLine("A.F");
                }
                public virtual void G()
                {
                    Console.WriteLine("A.G");
                }
            }
            class B : A
            {
                public sealed override void F()
                {
                    Console.WriteLine("B.F");
                }
                public override void G()
                {
                    Console.WriteLine("B.G");
                }
            }
            class C : B
            {
                public override void G()
                {
                    Console.WriteLine("C.G");
                }
            }
            static void Main(string[] args)
            {
                new A().F();
                new A().G();
                new B().F();
                new B().G();
                new C().F();
                new C().G();
     
                Console.ReadLine();
            }
        }
    }
    结果:
    类 B 在继承类 A 时可以重写两个虚函数,如图所示:

     

    由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能重写一个函数,如图所示:

     

    控制台输出结果,类 C 的方法 F 只能是输出 类B 中对该方法的实现:

    A.F
    A.G
    B.F
    B.G
    B.F
    C.G


    7.override 和 overload 的区别?

    答:

    override 表示重写,用于继承类对基类中虚成员的实现

    overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example07
    {
        class Program
        {
            class BaseClass
            {
                public virtual void F()
                {
                    Console.WriteLine("BaseClass.F");
                }
            }
            class DeriveClass : BaseClass
            {
                public override void F()
                {
                    base.F();
                    Console.WriteLine("DeriveClass.F");
                }
                public void Add(int Left, int Right)
                {
                    Console.WriteLine("Add for Int: {0}", Left + Right);
                }
                public void Add(double Left, double Right)
                {
                    Console.WriteLine("Add for int: {0}", Left + Right);
                }
            }
            static void Main(string[] args)
            {
                DeriveClass tmpObj = new DeriveClass();
                tmpObj.F();
                tmpObj.Add(1, 2);
                tmpObj.Add(1.1, 2.2);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    BaseClass.F
    DeriveClass.F
    Add for Int: 3
    Add for int: 3.3


    8.什么是索引指示器?

    答:

    实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int

    简单来说,其本质就是一个含参数属性

    示例:


    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example08
    {
        public class Point
        {
            private double x, y;
            public Point(double X, double Y)
            {
                x = X;
                y = Y;
            }
            //重写ToString方法方便输出
            public override string ToString()
            {
                return String.Format("X: {0} , Y: {1}", x, y);
            }
        }
        public class Points
        {
            Point[] points;
            public Points(Point[] Points)
            {
                points = Points;
            }
            public int PointNumber
            {
                get
                {
                    return points.Length;
                }
            }   
            //实现索引访问器
            public Point this[int Index]
            {
                get
                {
                    return points[Index];
                }
            }
        }
     
        //感谢watson hua(http://huazhihao.cnblogs.com/)的指点
        //索引指示器的实质是含参属性,参数并不只限于int
        class WeatherOfWeek
        {
            public string this[int Index]
            {
                get
                {
                    //注意case段使用return直接返回所以不需要break
                    switch (Index)
                    {
                        case 0:
                            {
                                return "Today is cloudy!";
                            }
                        case 5:
                            {
                                return "Today is thundershower!";
                            }
                        default:
                            {
                                return "Today is fine!";
                            }
                    }
                }
            }
            public string this[string Day]
            {
                get
                {
                    string TodayWeather = null;
                    //switch的标准写法
                    switch (Day)
                    {
                        case "Sunday":
                            {
                                TodayWeather = "Today is cloudy!";
                                break;
                            }
                        case "Friday":
                            {
                                TodayWeather = "Today is thundershower!";
                                break;
                            }
                        default:
                            {
                                TodayWeather = "Today is fine!";
                                break;
                            }
                    }
                    return TodayWeather;
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Point[] tmpPoints = new Point[10];
                for (int i = 0; i < tmpPoints.Length; i++)
                {
                    tmpPoints[i] = new Point(i, Math.Sin(i));
                }
     
                Points tmpObj = new Points(tmpPoints);
                for (int i = 0; i < tmpObj.PointNumber; i++)
                {
                    Console.WriteLine(tmpObj[i]);
                }
     
     
                string[] Week = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Staurday"};
                WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();
                for (int i = 0; i < 6; i++)
                {
                    Console.WriteLine(tmpWeatherOfWeek[i]);
                }
                foreach (string tmpDay in Week)
                {
                    Console.WriteLine(tmpWeatherOfWeek[tmpDay]);
                }
     
                Console.ReadLine();
            }
        }
    }
    结果:
    X: 0 , Y: 0
    X: 1 , Y: 0.841470984807897
    X: 2 , Y: 0.909297426825682
    X: 3 , Y: 0.141120008059867
    X: 4 , Y: -0.756802495307928
    X: 5 , Y: -0.958924274663138
    X: 6 , Y: -0.279415498198926
    X: 7 , Y: 0.656986598718789
    X: 8 , Y: 0.989358246623382
    X: 9 , Y: 0.412118485241757
    Today is cloudy!
    Today is fine!
    Today is fine!
    Today is fine!
    Today is fine!
    Today is thundershower!
    Today is cloudy!
    Today is fine!
    Today is fine!
    Today is fine!
    Today is fine!
    Today is thundershower!
    Today is fine!

     

    9.new 修饰符是起什么作用?

    答:

    new 修饰符与 new 操作符是两个概念

    new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型

    new 修饰符只能用于继承类,一般用于弥补基类设计的不足

    new 修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example09
    {
        class BaseClass
        {
            //基类设计者声明了一个PI的公共变量,方便进行运算
            public static double PI = 3.1415;
        }
        class DervieClass : BaseClass
        {
            //继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显示隐藏基类中的声明
            public new static double PI = 3.1415926;
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(BaseClass.PI);
                Console.WriteLine(DervieClass.PI);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    3.1415
    3.1415926


    10.this 关键字的含义?

    答:

    this 是一个保留字,仅限于构造函数和方法成员中使用

    在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用

    this 保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化

    在 C# 系统中,this 实际上是一个常量,所以不能使用 this++ 这样的运算

    this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example10
    {
        class Class1
        {
            private double c;
            private string value;
     
            public double C
            {
                get
                {
                    return c;
                }
            }
            public Class1(double c)
            {
                //限定同名的隐藏成员
                this.c = c;
            }
            public Class1(Class1 value)
            {
                //用对象本身实例化自己没有意义
                if (this != value)
                {
                    c = value.C;
                }
            }
            public override string ToString()
            {
                //将对象本身做为参数
                return string.Format("{0} Celsius = {1} Fahrenheit", c, UnitTransClass.C2F(this));
            }
     
            //由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成员变量更快,结论:区别不大。。。
            public string Test1()
            {
                long vTickCount = Environment.TickCount;
                for (int i = 0; i < 10000000; i++)
                    this.value = i.ToString();
                return string.Format("Have this.: {0} MSEL", Environment.TickCount - vTickCount);
            }
            public string Test2()
            {
                long vTickCount = Environment.TickCount;
                for (int i = 0; i < 10000000; i++)
                    value = i.ToString();
                return string.Format("Don't have this.: {0} MSEL", Environment.TickCount - vTickCount);
            }
        }
        class UnitTransClass
        {
            public static double C2F(Class1 value)
            {
                //摄氏到华氏的转换公式
                return 1.8 * value.C + 32;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Class1 tmpObj = new Class1(37.5);
     
                Console.WriteLine(tmpObj);
     
                Console.WriteLine(tmpObj.Test1());
                Console.WriteLine(tmpObj.Test2());
     
                Console.ReadLine();
            }
        }
    }
    结果:
    37.5 Celsius = 99.5 Fahrenheit
    Have this.: 4375 MSEL
    Don't have this.: 4406 MSEL


    11.可以使用抽象函数重写基类中的虚函数吗?

    答:

    可以,但需使用 new 修饰符显式声明,表示隐藏了基类中该函数的实现

    示例:

        class BaseClass
        {
            public virtual void F()
            {
                Console.WriteLine("BaseClass.F");
            }
        }
        abstract class  DeriveClass : BaseClass
        {
            public new abstract void F();
        }

    12.密封类可以有虚函数吗?

    答:

    可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数

    示例:

        class BaseClass
        {
            public virtual void F()
            {
                Console.WriteLine("BaseClass.F");
            }
        }
        sealed class DeriveClass : BaseClass
        {
            //基类中的虚函数F被隐式的转化为非虚函数
     
            //密封类中不能再声明新的虚函数G
            //public virtual void G()
            //{
            //    Console.WriteLine("DeriveClass.G");
            //}
        }

    13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有 get 和 set 两个呢?

    答:

    如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。如果基类中有 get 和 set 两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器


    14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?

    答:

    abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用


    15.接口可以包含哪些成员?

    答:

    接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员

     

    16.类和结构的区别?

    答:
    类:

    类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存

    类有构造和析构函数

    类可以继承和被继承

    结构:

    结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。

    结构没有构造函数,但可以添加。结构没有析构函数

    结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

     

    示例:

    根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。

    如:Geoemtry(GIS 里的一个概论,在 OGC 标准里有定义) 最好使用类,而 Geometry 中点的成员最好使用结构

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example16
    {
        interface IPoint
        {
            double X
            {
                get;
                set;
            }
            double Y
            {
                get;
                set;
            }
            double Z
            {
                get;
                set;
            }
        }
        //结构也可以从接口继承
        struct Point: IPoint
        {
            private double x, y, z;
            //结构也可以增加构造函数
            public Point(double X, double Y, double Z)
            {
                this.x = X;
                this.y = Y;
                this.z = Z;
            }
            public double X
            {
                get { return x; }
                set { x = value; }
            }
            public double Y
            {
                get { return x; }
                set { x = value; }
            }
            public double Z
            {
                get { return x; }
                set { x = value; }
            }
        }
        //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作
        class PointGeometry
        {
            private Point value;
           
            public PointGeometry(double X, double Y, double Z)
            {
                value = new Point(X, Y, Z);
            }
            public PointGeometry(Point value)
            {
                //结构的赋值将分配新的内存
                this.value = value;
            }
            public double X
            {
                get { return value.X; }
                set { this.value.X = value; }
            }
            public double Y
            {
                get { return value.Y; }
                set { this.value.Y = value; }
            }
            public double Z
           {
                get { return value.Z; }
                set { this.value.Z = value; }
            }
            public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth)
            {
                return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);
            }
            public override string ToString()
            {
                return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Point tmpPoint = new Point(1, 2, 3);
     
                PointGeometry tmpPG1 = new PointGeometry(tmpPoint);
                PointGeometry tmpPG2 = new PointGeometry(tmpPoint);
                tmpPG2.X = 4;
                tmpPG2.Y = 5;
                tmpPG2.Z = 6;
     
                //由于结构是值类型,tmpPG1 和 tmpPG2 的坐标并不一样
                Console.WriteLine(tmpPG1);
                Console.WriteLine(tmpPG2);
     
                //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3
                PointGeometry tmpPG3 = tmpPG1;
                tmpPG1.X = 7;
                tmpPG1.Y = 8;
                tmpPG1.Z = 9;
                Console.WriteLine(tmpPG1);
                Console.WriteLine(tmpPG3);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    X: 1, Y: 2, Z: 3
    X: 4, Y: 5, Z: 6
    X: 7, Y: 8, Z: 9
    X: 7, Y: 8, Z: 9


    17.接口的多继承会带来哪些问题?

    答:

    C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性(这也正是 C# 中类取消了多继承的原因之一),这时在实现时最好使用显式的声明

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example17
    {
        class Program
        {
            //一个完整的接口声明示例
            interface IExample
            {
                //属性
                string P
                {
                    get;
                    set;
                }
                //方法
                string F(int Value);
                //事件
                event EventHandler E;
                //索引指示器
                string this[int Index]
                {
                    get;
                    set;
                }
            }
            interface IA
            {
                int Count { get; set;}
            }
            interface IB
            {
                int Count();
            }
            //IC接口从IA和IB多重继承
            interface IC : IA, IB
            {
            }
            class C : IC
            {
                private int count = 100;
                //显式声明实现IA接口中的Count属性
                int IA.Count
                {
                    get { return 100; }
                    set { count = value; }
                }
                //显式声明实现IB接口中的Count方法
                int IB.Count()
                {
                    return count * count;
                }
            }
            static void Main(string[] args)
            {
                C tmpObj = new C();
     
                //调用时也要显式转换
                Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);
                Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
     
                Console.ReadLine();
            }
        }
    }
    结果:
    Count property: 100
    Count function: 10000


    18.抽象类和接口的区别?

    答:

    抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义

    抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性

    分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”

    为外部提供调用或功能需要扩充时优先使用接口


    19.别名指示符是什么?

    答:

    通过别名指示符我们可以为某个类型起一个别名

    主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间

    别名指示符只在一个单元文件内起作用

    示例:

    Class1.cs:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01
    {
        class Class1
        {
            public override string ToString()
            {
                return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1";
            }
        }
    }
    Class2.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02
    {
        class Class1
        {
            public override string ToString()
            {
                return "com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1";
            }
        }
    }
    主单元(Program.cs):

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    //使用别名指示符解决同名类型的冲突
    using Lib01Class1 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01.Class1;
    using Lib02Class2 = com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02.Class1;
     
    namespace Example19
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lib01Class1 tmpObj1 = new Lib01Class1();
                Lib02Class2 tmpObj2 = new Lib02Class2();
     
                Console.WriteLine(tmpObj1);
                Console.WriteLine(tmpObj2);
     
                Console.ReadLine();
            }
        }
    }
    结果:
    com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib01's Class1
    com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib02's Class1

     

    20.如何释放非托管资源?

    答:

     .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象

    最简单的办法,可以通过实现protected void Finalize()(析构函数会在编译时变成这个东东)来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法,如果是则调用它。但,据说这样会降低效率。。。

    有一种更好的,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,而不是傻傻的等着GC来释放我们的对象(何况效率又那么低)

    System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,就省得我们自己再声明一个接口了

    另外补充一句,这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有大些的实例(象 GIS 中的Geometry),为了优化程序性能,你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们

    示例:

    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Example20
    {
        class Program
        {
            class Class1 : IDisposable
            {
                //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
                ~Class1()
                {
                    Dispose(false);
                }
     
                //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
                void IDisposable.Dispose()
                {
                    Dispose(true);
                }
     
                //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
                protected virtual void ReleaseUnmanageResources()
                {
                    //Do something...
                }
     
                //私有函数用以释放非托管资源
                private void Dispose(bool disposing)
                {
                    ReleaseUnmanageResources();
     
                    //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
                    //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦
                    if (disposing)
                    {
                        GC.SuppressFinalize(this);
                    }
                }
            }
            static void Main(string[] args)
            {
                //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
                Class1 tmpObj1 = new Class1();
     
                //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
                //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
                //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
                Class1 tmpObj2 = new Class1();
         &

  • 测试十四种方法{笔记}

    2007-06-26 22:30:11

    软件测试是指使用人工或者自动的手段来运行或测定某个软件产品系统的过程,其目的是在于检验是否满足规定的需求或者弄清预期的结果与实际结果的区别。本文主要描述软件测试的类型。

    1 数据和数据库完整性测试

    数据与数据库完整测试是指测试关系型数据库完整性原则以及数据合理性测试。
    数据库完整性原即:
    主码完整性:主码不能为空;
    外码完整性:外码必须等于对应的主码或者为空。
    数据合理性指数据在数据库中的类型,长度,索引等是否建的比较合理。
    在项目名称中,数据库和数据库进程应作为一个子系统来进行测试。在测试这些子系统时,不应将测试对象的用户界面用作数据的接口。对于数据库管理系统 (DBMS),还需要进行深入的研究,以确定可以支1持测试的工具和技术。

    比如,有两张表:部门和员工。部门中有部门编号,部门名称,部门经理等字段,主码为部门编号;员工表中有员工编号,员工所属部门编号,员工名称,员工类型等字段,主码为员工编号,外码为员工所属部门编号,对应部门表。如果在某条部门记录中部门编号或员工记录员工编号为空,他就违反主码完整性原则。如果某个员工所属部门的编号为##,但是##在部门编号中确找不到,这就违反外码完整性原则。
    员工类型如下定义:0:职工,1:职员,2:实习生。但数据类型为Int,我们都知道Int占有4个字节,如果定义成char(1).就比原来节约空间。


    2 白盒测试

    白盒测试是基于代码的测试,测试人员通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理在程序员开发中来实现。白盒测试分为动态白盒测试和静态白盒测试
    2.1 静态白盒测试
    利用眼睛,浏览代码,凭借经验,找出代码中的错误或者代码中不符合书写规范的地方。比如,代码规范中规定,函数必须为动宾结构。而黑盒测试发现一个函数定义如下:
    Function NameGet(){
    ….
    }
    这是属于不符合开发规范的错误。
    有这样一段代码:
    if (i<0) & (i>=0)

    这段代码交集为整个数轴,IF语句没有必要
    I=0;
    while(I>100){
    J=J+100;
    T=J*PI;
    }
    在循环体内没有I的增加,bug产生。

    2.2 动态白盒测试
    利用开发工具中的调式工具进行测试。比如一段代码有4个分支,输入4组不同的测试数据使4组分支都可以走通而且结果必须正确。
    看一段代码
    if(I<0){
    P1
    }else{
    P2
    }
    在调试中输入I=-1,P1程序段通过, P2程序段未通过,属于动态黑盒测试的缺陷

    3.功能测试

    功能测试指测试软件各个功能模块是否正确,逻辑是否正确。
    对测试对象的功能测试应侧重于所有可直接追踪到用例或业务功能和业务规则的测试需求。这种测试的目标是核实数据的接受、处理和检索是否正确,以及业务规则的实施是否恰当。此类测试基于黑盒技术,该技术通过图形用户界面 (GUI) 与应用程序进行交互,并对交互的输出或结果进行分析,以此来核实应用程序及其内部进程。功能测试的主要参考为类似于功能说明书之类的文档。
    比如一个对电子商务系统,前台用户浏览商品-放入购物车-进入结账台,后台处理订单,配货,付款,发货,这一系列流程必须正确无误的走通,不能存在任何的错误。

    4.UI测试

    UI测试指测试用户界面的风格是否满足客户要求,文字是否正确,页面美工是否好看,文字,图片组合是否完美,背景是否美观,操作是否友好等等
    用户界面 (UI) 测试用于核实用户与软件之间的交互。UI 测试的目标是确保用户界面会通过测试对象的功能来为用户提供相应的访问或浏览功能。另外,UI 测试还可确保 UI 中的对象按照预期的方式运行,并符合公司或行业的标准。包括用户友好性,人性化,易操作性测试。UI测试比较主观,与测试人员的喜好有关
    比如:页面基调颜色刺眼;用户登入页面比较难于找到,文字中出现错别字,页面图片范围太广等都属于UI测试中的缺陷,但是这些缺陷都不太严重。

    5.性能测试

    性能测试主要测试软件测试的性能,包括负载测试,强度测试,数据库容量测试,基准测试以及基准测试
    5.1负载测试
    负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。
    在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如,响应时间、事务处理速率和其他与时间相关的方面。
    比如,在B/S结构中用户并发量测试就是属于负载测试的用户,可以使用webload工具,模拟上百人客户同时访问网站,看系统响应时间,处理速度如何?
    5.2强度测试
    强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。这类测试往往可以书写系统要求的软硬件水平要求。
    实施和执行此类测试的目的是找出因资源不足或资源争用而导致的错误。如果内存或磁盘空间不足,测试对象就可能会表现出一些在正常条件下并不明显的缺陷。而其他缺陷则可能由于争用共享资源(如数据库锁或网络带宽)而造成的。强度测试还可用于确定测试对象能够处理的最大工作量。
    比如:一个系统在内存366M下可以正常运行,但是降低到258M下不可以运行,告诉内存不足,这个系统对内存的要求就是366M。
    5.3数据库容量测试
    数据库容量测试指通过存储过程往数据库表中插入一定数量的数据,看看相关页面是否能够及时显示数据。
    数据库容量测试使测试对象处理大量的数据,以确定是否达到了将使软件发生故障的极限。容量测试还将确定测试对象在给定时间内能够持续处理的最大负载或工作量。例如,如果测试对象正在为生成一份报表而处理一组数据库记录,那么容量测试就会使用一个大型的测试数据库,检验该软件是否正常运行并生成了正确的报表。做这种测试通常通过书写存储过程向数据库某个表中插入一定数量的记录,计算相关页面的调用时间。
    比如,在电子商务系统中,通过insert customer 往user表中插入10 000数据,看其是否可以正常显示顾客信息列表页面,如果要求达到最多可以处理100 000个客户,但是顾客信息列表页面不能够在规定的时间内显示出来,就需要调整程序中的SQL查询语句;如果在规定的时间内显示出来,可以将用户数分别提高到20 000 , 50 000, 100 000进行测试。
    5.4基准测试
    基准测试与已知现有的系统进行比较,主要检验是否与类似的产品具有竞争性的一种测试。
    如果你要开发一套财务系统软件并且你已经获得用友财务系统的性能等数据,你可以测试你这套系统,看看哪些地方比用友财务系统好,哪些地方差?以便改进自己的系统,也可为产品广告提供数据。
    5.5竞争测试
    软件竞争使用各种资源(数据纪录,内存等),看他与其他相关系统对资源的争夺能力。比如:一台机器上即安装您的财务系统,又安装用友财务系统。当CPU占有率下降后,看看是否能够强过用友财务系统,而是自己的系统能够正常运行?

    6. 安全性和访问控制测试

    安全性和访问控制测试侧重于安全性的两个关键方面:
    应用程序级别的安全性,包括对数据或业务功能的访问
    系统级别的安全性,包括对系统的登录或远程访问。
    6.1应用程序级别的安全性
    可确保:在预期的安全性情况下,主角只能访问特定的功能或用例,或者只能访问有限的数据。例如,可能会允许所有人输入数据,创建新账户,但只有管理员才能删除这些数据或账户。如果具有数据级别的安全性,测试就可确保“用户类型一”能够看到所有客户消息(包括财务数据),而“用户二”只能看见同一客户的统计数据。
    比如B/S系统,不通过登入页面,直接输入URL,看其是否能够进入系统?
    6.2系统级别的安全性
    可确保只有具备系统访问权限的用户才能访问应用程序,而且只能通过相应的网关来访问。
    比如输入管理员账户,检查其密码是否容易猜取,或者可以从数据库中获得?

    7.故障转移和恢复测试

    故障转移和恢复测试指当主机软硬件发生灾难时候,备份机器是否能够正常启动,使系统是否可以正常运行,这对于电信,银行等领域的软件是十分重要的。
    故障转移和恢复测试可确保测试对象能成功完成故障转移,并能从导致意外数据损失或数据完整性破坏的各种硬件、软件或网络故障中恢复。
    故障转移测试可确保:对于必须持续运行的系统,一旦发生故障,备用系统就将不失时机地“顶替”发生故障的系统,以避免丢失任何数据或事务。
    恢复测试是一种对抗性的测试过程。在这种测试中,将把应用程序或系统置于极端的条件下(或者是模拟的极端条件下),以产生故障(例如设备输入/输出 (I/O) 故障或无效的数据库指针和关健字)。然后调用恢复进程并监测和检查应用程序和系统,核实应用程序或系统和数据已得到了正确的恢复。一定要注意主备定时备份
    比如电信系统,突然主机程序发生死机,备份机器是否能够启动,使系统能够正常运行,从而不影响用户打电话?

    8.配置测试

    又叫兼容性测试。配置测试核实测试对象在不同的软件和硬件配置中的运行情况。在大多数生产环境中,客户机工作站、网络连接和数据库服务器的具体硬件规格会有所不同。客户机工作站可能会安装不同的软件例如,应用程序、驱动程序等而且在任何时候,都可能运行许多不同的软件组合,从而占用不同的资源。(如浏览器版本,操作系统版本等)
    下面列出主要配置测试
    8.1浏览器兼容性
    测试软件在不同产商的浏览器下是否能够正确显示与运行;
    比如测试IE,Natscape浏览器下是否可以运行这套软件?
    8.2操作系统兼容性
    测试软件在不同操作系统下是否能够正确显示与运行;
    比如测试WINDOWS98,WINDOWS 2000,WINDOWS XP,LINU, UNIX下是否可以运行这套软件?
    8.3硬件兼容性
    测试与硬件密切相关的软件产品与其他硬件产品的兼容性,比如该软件是少在并口设备中的,测试同时使用其他并口设备,系统是否可以正确使用.
    比如在INTER,舒龙CPU芯片下系统是否能够正常运行?
    这样的测试必须建立测试实验室,在各种环境下进行测试。

    9.安装测试

    安装测试有两个目的。第一个目的是确保该软件在正常情况和异常情况的不同条件下: 例如,进行首次安装、升级、完整的或自定义的安装_都能进行安装。异常情况包括磁盘空间不足、缺少目录创建权限等。第二个目的是核实软件在安装后可立即正常运行。这通常是指运行大量为功能测试制定的测试。
    安装测试包括测试安装代码以及安装手册。安装手册提供如何进行安装,安装代码提供安装一些程序能够运行的基础数据。

    10.多语种测试

    又称本地化测试,是指为各个地方开发产品的测试,如英文版,中文版等等,包括程序是否能够正常运行,界面是否符合当地习俗,快捷键是否正常起作用等等,特别测试在A语言环境下运行B语言软件(比如在英文win98下试图运行中文版的程序),出现现象是否正常。
    本地化测试还要考虑:
    l 当语言从A翻译到B,字符长度变化是否影响页面效果。比如中文软件中有个按键叫“看广告”,翻译到英文版本中为 “View advertisement”可能影响页面的美观程度
    l 要考虑同一单词在各个国家的不同意思,比如football在英文中为足球,而美国人使用中可能理解为美式橄榄球。
    l 要考虑各个国家的民族习惯,比如龙个美国中被理解邪恶的象征,但翻译到中国,中国人认为为吉祥的象征。

    11.文字测试

    文字测试测试软件中是否拼写正确,是否易懂,不存在二义性,没有语法错误;文字与内容是否有出入等等,包括图片文字。
    比如:“比如,请输入正确的证件号码!”何谓正确的证件号码,证件可以为身份证,驾驶证,也可为军官证,如果改为“请输入正确的身份证号码!”用户就比较容易理解了。

    12.分辨率测试

    测试在不同分辨率下,界面的美观程度,分为800*600,1024*768,1152*864,1280*768,1280*1024,1200*1600大小字体下测试。一个好的软件要有一个极佳的分辨率,而在其他分辨率下也都能可以运行。

    13发布测试

    主要在产品发布前对一些附带产品,比如说明书,广告稿等进行测试

    13.1说明书测试
    主要为语言检查,功能检查,图片检查
    语言检查:检查说明书语言是否正确,用词是否易于理解;
    功能检查:功能是否描述完全,或者描述了并没有的功能等;
    图片检查::检查图片是否正确
    13.2宣传材料测试
    主要测试产品中的附带的宣传材料中的语言,描述功能,图片
    13.3帮助文件测试
    帮助文件是否正确,易懂,是否人性化。最好能够提供检索功能。
    13.4广告用语
    产品出公司前的广告材料文字,功能,图片,人性化的检查

    14 文档审核测试

    文档审核测试目前越来越引起人们的重视,软件质量不是检查出来的,而是融进软件开发中来。前置软件测试发越来越受到重视。请看一个资料:

    文档审核测试主要包括需求文档测试,设计文档测试,为前置软件测试测试中的一部分。

    14.1需求文档测试

    主要测试需求中是否存在逻辑矛盾以及需求在技术上是否可以实现;

    14.2设计文档测试

    测试设计是否符合全部需求以及设计是否合理。

    总结

    据美国软件质量安全中心2000年对美国一百家知名的软件厂商统计,得出这样一个结论:软件缺陷在开发前期发现比在开发后期发现资金,人力上节约90%;软件缺陷在推向市场前发现比在推出后发现资金,人力上节约90%。所以说软件的缺陷应该尽早发现。不是所有的软件都要进行任何类型的软件测试的,可以根据产品的具体情况进行组装测试不同的类型。

401/212>
Open Toolbar