发布新日志

  • 白盒测试基本概念(转)

    2009-03-02 13:51:43

    白盒测试基本概念

    白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作
    h]6G"u G'F;\9a _%J85282  这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
    WiA%rN)V$q85282  采用什么方法对软件进行测试呢?常用的软件测试方法有两大类:静态测试方法和动态测试方法。其中软件的静态测试不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试;而软件的动态测试是通过输入一组预先按照一定的测试准则构造的实例数据来动态运行程序,而达到发现程序错误的过程。
    GWa7p5c85282  白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
    L ]g$e2H'\$N/|dKx85282  白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。51Testing软件测试网.r[W7w#n\"nE
      六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。
    NY1A!L){h g;Hf85282  "白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。51Testing软件测试网Ab)[T&l+}/GD,B4J
      如何挑选白盒测试工具
    +x3aN4X&p P K85282  白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、工业控制软件等等。白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、嵌入式软件的测试、测试的可视化等。51Testing软件测试网6t"Y3~Ak;T8zsZ.TyH
      对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析与语法分析、静态错误分析、动态检测等。但是对于不同的开发语言,测试工具实现的方式和内容差别是较大的。目前测试工具主要支持的开发语言包括:标准C、C++、 Visual C++、Java、Visual J++等。
    ;t9cutP1K85282  代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆盖。
    :d's%o*C+W&VP:~p V85282  ·语句覆盖 为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执行一次。语句覆盖是很弱的逻辑覆盖。51Testing软件测试网-z;tB dp(E
      ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或者说使得程序中的每一个取“真” 分支和取“假”分支至少经历一次,因此判定覆盖又称为分支覆盖。
    Q7cqNe.t85282  ·条件覆盖 在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
    3?%d%cpX#u:X85282  ·多条件覆盖 多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖的。51Testing软件测试网:Wo!SC?V
      ·修正条件判定覆盖修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、or)连接的布尔条件,每个条件对于判定的结果值是独立的。
    |6n?8pX4pV~85282  不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试工具价格是极其昂贵的。
    w0ptT5nM5lzGbE85282  嵌入式软件的测试:对于嵌入式软件的测试,我们还需要一方面进一步考虑测试工具对于嵌入式操作系统的支持能力,例如DOS、Vxworks、Neculeus、LinuxWindows CE等;另一方面还需要考虑测试工具对于硬件平台的支持能力,包括是否支持所有64/32/16位CPU 和 MCU,是否可以支持 PCI/VME/CPCI 总线。51Testing软件测试网`&?sG)wY
      测试的可视化:白盒测试是工作量巨大并且枯燥的工作,可视化的设计对于测试来说是十分重要的。在选购白盒测试工具时,应当考虑该款测试工具的可视化是否良好,例如:测试过程中是否可以显示覆盖率的函数分布图和上升趋势图,是否使用不同的颜色区分已执行和未执行的代码段显示分配内存情况实时图表等,这些对于测试效率和测试质量的提高是具有很大的作用的。
    i1y&`HTm85282  白盒测试之基本路径测试法
    6xdXj(Y|j85282  白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
    4y,|@?)SxeE1?t:mX85282  其中运用最为广泛的是基本路径测试法。
    &}[*R X;JVb85282  基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。51Testing软件测试网 BT,]"O)sl
      设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。51Testing软件测试网 p$M6aQR8K$]
      在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下4个步骤和一个工具方法:51Testing软件测试网F|c.|pH6x
      1. 程序的控制流图:描述程序控制流的一种图示方法。
    7C ]2C1Ln4c85282  2. 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
    2Y;O4XUn.^o85282  3. 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。
    E*vPfb B1Q85282  4. 准备测试用例:确保基本路径集中的每一条路径的执行。51Testing软件测试网 N\\!{ M+y
      工具方法:51Testing软件测试网&N9O6Nc Z
      图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。
    e]/T$t2E"D85282  程序的控制流图:描述程序控制流的一种图示方法。
    4gkN+JK#P)^-r O85282  圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句
    Sf3~tkAt85282  流图只有二种图形符号:
    :h9J/f;I-cm8B%p&g85282  图中的每一个圆称为流图的结点,代表一条或多条语句。51Testing软件测试网I ? mN3wp!c
      流图中的箭头称为边或连接,代表控制流51Testing软件测试网x%O Ip.} Zm)e
      任何过程设计都要被翻译成控制流图。51Testing软件测试网GnI:Z(rb0t.Q
      如何根据程序流程图画出控制流程图?51Testing软件测试网'r`$C`$@ lr$w
      在将程序流程图简化成控制流图时,应注意:51Testing软件测试网6G;W,h3l7KA G(f
      在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
    x H.D)U"|(z Q5?+l&|v85282  边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。
    .@V b:Of c `vJ85282  基本路径测试法的步骤:
    9xn/s8@s85282  第一步:画出控制流图51Testing软件测试网'ESiYg|q
      流程图用来描述程序控制结构。可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。在流图中,每一个圆,称为流图的结点,代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:if-else-then结构)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。51Testing软件测试网 cT#ve#m2c2I1v
      第二步:计算圈复杂度51Testing软件测试网C(k"Wc,A M
      圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。51Testing软件测试网? SL:A'RV$U$H
      有以下三种方法计算圈复杂度:51Testing软件测试网"k#WIa)K
      流图中区域的数量对应于环型的复杂性;
    9Ax\+t,VnB$X85282  给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;51Testing软件测试网6b0p@O `r
      给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。51Testing软件测试网 ~{&zP7_3W-]&DmM
      第三步:导出测试用例 根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。)
    *D g.w W$C,F85282  路径1:4-1451Testing软件测试网7inE7G]/a
      路径2:4-6-7-14
    `U)t Gk:uz85282  路径3:4-6-8-10-13-4-14
    n6?Q\o9O]+|85282  路径4:4-6-8-11-13-4-14
    pw+h9Bqy85282  根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
    T9d6e6N/F85282  白盒测试三步法
    Ws^qB.n\@85282  1) 根据代码的功能,人工设计测试用例进行基本功能测试51Testing软件测试网4g;FN zc
      2) 统计白盒覆盖率,为未覆盖的白盒单位设计测试用例,实现完整的白盒覆盖,比较理想的覆盖率是实现100%语句、条件、分支、路径覆盖;51Testing软件测试网/O^/[4Z!`
      3) 自动生成大量的测试用例,捕捉"程序员未处理某些特殊输入"形成的错误。51Testing软件测试网 vL"Sg!jF_J,M^
      第1步的测试用例通常是现成的,因为详细设计文档会规定程序的基本功能,没有文档的,程序员在编程时也要想清楚程序的功能,这些基本功能就是基本测试用例;51Testing软件测试网'^Lnbun
      第2步是在第1步的基础上,检查未覆盖的白盒单位,由于未覆盖的逻辑单位通常对应未测试的等价类,因此第2步可以找出第1步所遗漏的测试用例;51Testing软件测试网/B&Hi [4kfk
      第3步用自动动态测试弥补第2步的固有缺陷。51Testing软件测试网)n.V1wml-C Sd
      "三步法"尽量避免重复工作,白盒方法和黑盒方法相结合,人工方法和自动方法相补充,如果第2步的覆盖率比较理想,那么基本上可以保证找出所有等价类。在开发过程允许的限度内,"三步法"已接近极限,当得起"彻底测试"四个字。

    黑盒测试与白盒测试区别

      黑盒测试51Testing软件测试网&p#fq {x"o {6X
      黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因—果图、错误推测等,主要用于软件确认测试。 “黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。51Testing软件测试网V"_1P%L6E;wl X7d
      白盒测试51Testing软件测试网+Ux1e"?"F3T.o#\W3_4O
      白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
    Ns"E w"t;u85282  “白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。
    1y(e p!jB'`"mi t85282  软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:
    "VJ+k i0W3I|DSo[85282  – 对程序模块的所有独立的执行路径至少测试一次;51Testing软件测试网(A%y/O)J,gI
      – 对所有的逻辑判定,取 “ 真 ” 与取 “ 假 ” 的两种情况都至少测试一次;51Testing软件测试网 xa.Lh.t
      – 在循环的边界和运行界限内执行循环体;51Testing软件测试网pe}C,`0F:q#oO ^Q
      – 测试内部数据结构的有效性,等。51Testing软件测试网)ag~6c:Z.A
      具体包含的逻辑覆盖有: – 语句覆盖 – 判定覆盖 – 条件覆盖 – 判定-条件覆盖 – 条件组合覆盖 – 路径覆盖。
    :n"v(T a9x4OV4P85282  白盒测试技术 (White Box Testing) :深入到代码一级的测试,使用这种技术发现问题最早,效果也是最好的。该技术主要的特征是测试对象进入了代码内部,根据开发人员对代码和对程序的熟悉程度,对有需要的部分进行在软件编码阶段,开发人员根据自己对代码的理解和接触所进行的软件测试叫做白盒测试。这一阶段测试以软件开发人员为主,在 JAVA 平台使用 Xunit 系列工具进行测试, Xunit 测试工具是类一级的测试工具对每一个类和该类的方法进行测试。51Testing软件测试网 i%x\%Yz[g
      黑盒测试技术( Black Box Testing ):黑盒测试的内容主要有以下几个方面,但是主要还是功能部分。主要是覆盖全部的功能,可以结合兼容,性能测试等方面进行,根据软件需求,设计文档,模拟客户场景随系统进行实际的测试,这种测试技术是使用最多的测试技术涵盖了测试的方方面面,可以考虑以下方面51Testing软件测试网dk\7H(qv+E~
      c正确性 (Correctness) :计算结果,命名等方面。51Testing软件测试网k:D;K'r$e,| bF
      d可用性 (Usability) :是否可以满足软件的需求说明。
    XO4A?\3w_6mU85282  e边界条件 (Boundary Condition) :输入部分的边界值,就是使用一般书中说的等价类划分,试试最大最小和非法数据等等。51Testing软件测试网0D#`fk%j"G4d]5}f8p
      f性能 (Performance) :正常使用的时间内系统完成一个任务需要的时间,多人同时使用的时候响应时间在可以接受范围内。 J2EE 技术实现的系统在性能方面更是需要照顾的,一般原则是 3 秒以下接受, 3-5 秒可以接受, 5 秒以上就影响易用性了。如果在测试过程中发现性能问题,修复起来是非常艰难的,因为这常常意味着程序的算法不好,结构不好,或者设计有问题。因此在产品开发的开始阶段,就要考虑到软件的性能问题
    0X ?-v%z{4}85282  g压力测试 (Stress) :多用户情况可以考虑使用压力测试工具,建议将压力和性能测试结合起来进行。如果有负载平衡的话还要在服务器端打开监测工具 , 查看服务器 CPU 使用率,内存占用情况,如果有必要可以模拟大量数据输入,对硬盘的影响等等信息。如果有必要的话必须进行性能优化 ( 软硬件都可以 ) 。这里的压力测试针对的是某几项功能。51Testing软件测试网Tit2|"d3l[Z^$Z k
      h错误恢复 (Error Recovery) :错误处理,页面数据验证,包括突然间断电,输入脏数据等。51Testing软件测试网qGN6L3r
      i安全性测试 (Security) :这个领域正在研究中,防火墙、补丁包、杀毒软件等的就不必说了,不过可以考虑。破坏性测试时任意看了一些资料后得知 , 这里面设计到的知识 \ 内容可以写本书了 , 不是一两句可以说清的,特别是一些商务网站,或者跟钱有关,或者和公司秘密有关的 web 更是需要这方面的测试,在外国有一种专门干这一行的人叫安全顾问,可以审核代码,提出安全建议,出现紧急事件时的处理办法等,在国内没有听说哪里有专门搞安全技术测试的内容。51Testing软件测试网S(P/[4n];m
      j 兼容性 (Compatibility) :不同浏览器,不同应用程序版本在实现功能时的表现不同的上网方式,如果你测试的是一个公共网站的话。
  • 黑盒测试 PK 白盒测试(转)

    2009-03-02 13:48:38

    黑盒测试 PK 白盒测试

    常用黑盒测试用例设计方法51Testing软件测试网dL7C3[-[-WM?TN

    $t.Q\nx85282等价类划分法
    I:_3ES7jU0ve85282边界值分析法
    5m D1Q7K3r%?*pV85282判定表法
    t [;H I-JyW/V/rN85282因果图法
    hC$pv'Z n2QT+y85282正交试验法
    (CE/p*T$hyD9dZ/O85282状态迁移图法51Testing软件测试网"\!m&U.vp"H~HR ]YW
    流程分析法51Testing软件测试网]RK(aE"uF2g*e
    输入域测试法
    MF'f7qy#h8r/?$Q85282输出域覆盖法
    0}.Yj#Sn"SD85282异常分析法
    ^AqG9w DC85282错误猜测法

    ;\\*r.Q-b8528251Testing软件测试网T v*? XE2B

    常用白盒测试用例设计方法51Testing软件测试网H g!vO,|'M#L

    51Testing软件测试网a3]`w.Ch9G

    语句覆盖法51Testing软件测试网:CB3V0k m+}n
    分支覆盖法
    &Cd3~vGISk85282条件覆盖法
    '`(?]$q/?'e8j85282组合条件覆盖法51Testing软件测试网?)~(yt4I]m1z8m[
    分支条件覆盖法
    0En3]:Rp'N-ax85282路径覆盖法
    &SzU9eW S85282基本路径覆盖法

    B x7|rj/s85282

    (Sbu y%z?85282黑盒测试法与白盒测试方法的比较51Testing软件测试网 NO7_QC.u8vL)X

    8V:Y*Py4}jq$a.a85282黑盒测试是从用户的观点出发,从输入数据与输出数据的对应关系,也就是根据程序的外部特性进行的测试,而不考虑内部结构及工作情况;黑盒测试技术注重于软件的信息域(取值范围),通过划分程序的输入和输出域来确定测试用例;若外部特性本身有问题或规格说明的规定有误,则应用黑盒测试方法是不能发现问题的.反之,白盒测试只根据程序的内部结构进行测试,测试用例的设计要保证测试时所有的语句至少执行一次,而且要检查所有的逻辑条件;如果程序的结构本身有问题,比如说程序逻辑有错误或有遗漏,那也是无法发现的.51Testing软件测试网 }&Uk CZ#SG!Tf

    51Testing软件测试网&v4p4S j7C FrY"r

    黑盒测试和白盒测试各有自己的优缺点,可以构成互补的关系,在规划测试方案时,我们需要将黑盒和白盒测试结合起来进行测试用例的设计.

    5Jt4OX:Gn:u}k8528251Testing软件测试网"o!w,sJ?

     

    el jF~/c4P85282

  • 黑盒测试、白盒测试和灰盒测试的基本概念(转)

    2009-03-02 13:32:37

    黑盒测试、白盒测试和灰盒测试的基本概念

    1.黑盒测试
     
    黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。
         
    黑盒测试方法主要有等价类划分、边值分析、因果图、错误推测等,主要用于软件确认测试。黑盒法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。黑盒法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

    2.白盒测试
      白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
      白盒法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。白盒法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。

    3.灰盒测试
        
    灰盒测试,确实是介于二者之间的,可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样的一种灰盒的方法。
    灰盒测试结合了白盒测试盒黑盒测试的要素.它考虑了用户端、特定的系统知识和操作环境。它在系统组件的协同性环境中评价应用软件的设计。
      
    灰盒测试由方法和工具组成,这些方法和工具取材于应用程序的内部知识盒与之交互的环境,能够用于黑盒测试以增强测试效率、错误发现和错误分析的效率。
         
    灰盒测试涉及输入和输出,但使用关于代码和程序操作等通常在测试人员视野之外的信息设计测试。

     

    黑盒白盒、动态静态测试之间的关系

    它们只是一个测试的不同分类角度而已,同一个测试,既有可能属于黑盒测试,也有可能属于测试;既有可能属于静态测试,也有可能属于白盒测试。而且它们之间还有包括交叉的关系,总结以下4句话:

    • 黑盒测试有可能是动态测试(运行程序,只看输入和输出),也有可能是静态测试(不运行程序,只是查看界面)
    • 白盒测试有可能是动态测试(运行程序,并分析代码结构),也有可能是静态测试(不运行程序,只是静态查看代码)
    • 动态测试有可能是黑盒测试(运行程序,只看输入和输出),也有可能是白盒测试(运行程序,并分析代码结构)
    • 静态测试有可能是黑盒测试(不运行程序,只是查看界面),也有可能是白盒测试(不运行程序,只是静态查看代码)


     

  • 白盒测试之基本路径测试法(转)

    2009-03-02 13:22:56

    白盒测试之基本路径测试法

    白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。51Testing软件测试网5OAw)L W P o"Y

    4F]mJJc)H85282  其中运用最为广泛的是基本路径测试法。

    $V?jw-xw`*Jj Jb85282

    7k~"i,[Q!U Q85282  基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。51Testing软件测试网)r lZ!h:|;~| eG

    j3^3k)y$p:N%b85282  设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。

    g uq*Gt?$@s85282

    wSQr\"O A)l2[y%n85282  在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下4个步骤和一个工具方法:51Testing软件测试网 Epk5g&_Yl

    51Testing软件测试网3k$O`.Z:J'}4d B

      1. 程序的控制流图:描述程序控制流的一种图示方法。51Testing软件测试网6Q kHEd+w:mS

    51Testing软件测试网ORx9K(l

      2. 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。

    "g)c0A5B&ETx)@/m85282

    },K4A"]-Z5o85282  3. 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果

    1?4Ta&D$U85282

    t8oBZ1rxJ\du85282  4. 准备测试用例:确保基本路径集中的每一条路径的执行。

    #_1y,s } W`VF85282

    z-z3PqfE+c85282  工具方法:51Testing软件测试网'eU"Yx`&eW!kU

    .^_7u{y*R$|%b/\N6Y85282  图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。51Testing软件测试网&WbA'Ft&T-YI

    O} U i,u85282  程序的控制流图:描述程序控制流的一种图示方法。

    3^,v3B(jJ1Bh85282

    P9I+|1Z-K#M,Swom R!~85282  圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句

    K|)SUi @_*|85282

    iK@XHWi8528251Testing软件测试网fP[vD Np

      流图只有二种图形符号:51Testing软件测试网:_$?&P^/z7\e

    51Testing软件测试网%g fmXvVC.C^w

      图中的每一个圆称为流图的结点,代表一条或多条语句。

    y {5m"x8WX'h85282

    q$hv G R2\85282  流图中的箭头称为边或连接,代表控制流

    [K{s1P/J[8A85282

    .G!ffB#^85282  任何过程设计都要被翻译成控制流图。

    *y4Fgfpj8528251Testing软件测试网s2KU6m5}~~f

      如何根据程序流程图画出控制流程图?

    |N~v| AE2t2p8528251Testing软件测试网Cd2Ju fb*C-l2f(K

      在将程序流程图简化成控制流图时,应注意:

    Br7x7ya8528251Testing软件测试网wzV9f*E2j@5M+^

      n 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。

    6ehZ-s;EE8528251Testing软件测试网0y Hun1}q{5Ku

      n 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。51Testing软件测试网7N2O s1R[&Y%l{*r

    4I0K/p&A!{-Ci85282  如下页图所示

    +g `1u0az*E.w:p85282

    'M6KCd;UObT+r%f |85282

    n 如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, NAND, NOR) 连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。51Testing软件测试网s%u1aB_cBE

    51Testing软件测试网 _K)f2Be,[{

      例如:51Testing软件测试网 y[~/q8^#Aw;\j0n

    t)F-XZUO |wXZkD"r85282  1 if a or b

    g`6t\1of85282

    3_F7tN|)wh+[}85282  2 x51Testing软件测试网/U#H2^"Ea6B+V.h

    51Testing软件测试网H{Jg l}X$W6^

      3 else51Testing软件测试网9a3ToW%N5N

    hat T ty;[_-~85282  4 y51Testing软件测试网4Dk)g@)V2wIF$D

    5yWfE&JkC85282  对应的逻辑为:51Testing软件测试网/p6CO&Ei2B&s

    51Testing软件测试网M"h&CgP Ee#jZ

    l#r(B1c`\ Z)e85282  独立路径:至少沿一条新的边移动的路径51Testing软件测试网@&c*PA9nCk x"Ns+is

    eGC K*}-}I.\,oq85282

    o 第一步:画出控制流图51Testing软件测试网:Q1Vdu\C`

    51Testing软件测试网!g"F8sU v

      流程图用来描述程序控制结构。可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。在流图中,每一个圆,称为流图的结点,代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:if-else-then结构)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。

    \6H KI9V:d$D'a85282

    51Testing软件测试网 D;D|z Hh? h

    51Testing软件测试网Nu {aU1K9t1W

      画出其程序流程图和对应的控制流图如下51Testing软件测试网JV2m{0X;X/h U Z(W

    51Testing软件测试网,hD][/{v^3FiCb/Kt,D

    )n$B'GK n:v85282  o 第二步:计算圈复杂度51Testing软件测试网8{.P%{0c'd

    .{2HxL4{W;J85282  圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。

    ];UG6TD8EVr)r+c85282

    {6T,CI4K]4z:R3x85282  有以下三种方法计算圈复杂度:

    j U&n s5Az+_v8528251Testing软件测试网d L \\7Ek

      流图中区域的数量对应于环型的复杂性;

    h%dW6g,u4dI8528251Testing软件测试网!J.t#w6UJ:xyz

      给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;

    O,A4u$V(J*rd85282

    ZW/rB,B)f lO85282  给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。

    _ Yt&}P2x C85282

    51Testing软件测试网5kH h#{@l pd @2y

    o 第三步:导出测试用例51Testing软件测试网)NkIyuV z

    QVAfwq^i\N85282  根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。)51Testing软件测试网V ^ Q,\7i#A+_

    51Testing软件测试网 z m[jy+J#o

      ü 路径1:4-14

    c,_bL|:Uy~8528251Testing软件测试网-DDkM/@ o*Z)|Rn

      ü 路径2:4-6-7-14

    hMH*p$g5w8528251Testing软件测试网,d:VTV#s

      ü 路径3:4-6-8-10-13-4-1451Testing软件测试网.u,HhD-h|\y

    %KEF.I.? E4HR2^85282  ü 路径4:4-6-8-11-13-4-14

    YW8d6n6Ag4B85282

    XQ(e9^ Ix{s85282  根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。51Testing软件测试网d,AnM,DGC/r3p

    5|&R!l]:? ok85282  o 第四步:准备测试用例

    Y ABI%_8528251Testing软件测试网^I:\@:c#`

      为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:51Testing软件测试网Z!e;f d RKm d

    51Testing软件测试网@_4B/IE4G9E"o

    举例说明:51Testing软件测试网_7v E}Q~V;M N*vi

    ;@9Tf*{.u]z85282  例:下例程序流程图描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。

    i.EQg Zb85282

    `J(r"]8y8E(Y"y85282

    9H||-J u]85282  步骤1:导出过程的流图。

    :dNk4chxqt85282

    kTK3A%Jc2[8528251Testing软件测试网"{ {)h(M C@8x

      步骤2:确定环形复杂性度量V(G):51Testing软件测试网 }l |&U"Q T)k

    l{p8KiL,I85282  1)V(G)= 6 (个区域)

    A8CQ ?%Pn4r8528251Testing软件测试网i6BL ?1cb r v|

      2)V(G)=E–N+2=16–12+2=6

    ;ix#O-TI@2gp85282

    {f&i'}A85282  其中E为流图中的边数,N为结点数;

    @"M;q/Vvx85282

    1h3MILS(I4X!P85282  3)V(G)=P+1=5+1=651Testing软件测试网Vm/D8~"r/Z+rn8V/X

    51Testing软件测试网f i7o6D j!Xc"F*\

      其中P为谓词结点的个数。在流图中,结点2、3、5、6、9是谓词结点。51Testing软件测试网q,WL T D

    51Testing软件测试网AK Y)V @N$}g

      步骤3:确定基本路径集合(即独立路径集合)。于是可确定6条独立的路径:

    ;s k-F/tFt6ai8528251Testing软件测试网r:`7j/V^T&C1IA1D

      路径1:1-2-9-10-1251Testing软件测试网ie*sTw#g5goG

    "y7Za}}1m5n0s85282  路径2:1-2-9-11-12

    QF0\:F[5Q2j.J5Il8528251Testing软件测试网7XJq0Hws

      路径3:1-2-3-9-10-12

    Flg1Jl4f{#P7s85282

    Hz I qD#hw2y8j'?85282  路径4:1-2-3-4-5-8-2…

    -?u? T0V| jr$Y85282

    -]5vh3z,_1k!S#g85282  路径5:1-2-3-4-5-6-8-2…51Testing软件测试网XU0c5C1|5e

    'f SM|v%fx85282  路径6:1-2-3-4-5-6-7-8-2…

    5K\O SIIx uF8528251Testing软件测试网]'mTt%?/\"^

      步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。51Testing软件测试网p;U`9v M

    l1v%^&cT8zs)^9@C$m85282  1)路径1(1-2-9-10-12)的测试用例:51Testing软件测试网 b3y#Qe"H4Z8h

    51Testing软件测试网8H^&N@0OS(E

      score[k]=有效分数值,当k < i ;

    X {5Mf*[;j'g7f"K8528251Testing软件测试网 vs)UL.s#l#y

      score[i]=–1, 2≤i≤50;51Testing软件测试网|a-HG l:lm

    51Testing软件测试网t(r:uv}8|do

      期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。

    !hV0`SF4^85282

    ;c.jay4Lch85282  2)路径2(1-2-9-11-12)的测试用例:51Testing软件测试网B\ }0H3`$W4n

    51Testing软件测试网 WKY!]bc1ao

      score[ 1 ]= – 1 ;

    'L7U1fX.c5o3wO*N"\s8528251Testing软件测试网(V ot}c.yb:[

      期望的结果:average = – 1 ,其他量保持初值。

    r_{k-YV0sb85282

    .w_w6pW Z+VS85282  3)路径3(1-2-3-9-10-12)的测试用例:

    'G8Jf@P^85282

    J{4`-P;B5Nz Z)`B{85282  输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数;51Testing软件测试网%} T p9jW5Z r

    0L8Jh v j6y85282  期望结果:n1=50、且算出正确的总分和平均分。

    E:Z;jnY"FP5i85282

    4`(dN0P/E _)x85282  4)路径4(1-2-3-4-5-8-2…)的测试用例:51Testing软件测试网F.kk&Y7d0DSi#l

    `"I$m+_w-{.R'_9T H.o85282  score[i]=有效分数,当i<50;

    3`7}atB w85282

    1]MEN0?u&`85282  score[k]<0, k< i ;

    iy js#@85282

    8z4wM(ho.T85282  期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average

    ,`6I}/a{ V85282

    :p"d,t$p!j-G{85282  score[i]=有效分数, 当i<50;51Testing软件测试网"Qr2n6s z-UF i_Yg

    51Testing软件测试网Z$A } |0g7c7JZ,Q

      score[k]>100, k< i ;

    Lfo-S#HbS85282

    W+] Q5z f$?85282  期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。51Testing软件测试网){+`~H)| r$np

    51Testing软件测试网V Sd;R%?`

      6)路径6(1-2-3-4-5-6-7-8-2…)的测试用例:51Testing软件测试网x g5L'dJ \'_3~

    51Testing软件测试网x(\})n-d RY

      score[i]=有效分数, 当i<50;

    @f}+t7V9@85282

    L:O6Zd F*\85282  期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。51Testing软件测试网J$pNSKCL\

    Hm I`2B85282  注意事项:

    {X'Fgccv85282

    !j&U5N;q;a85282  必须注意,一些独立的路径,往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。51Testing软件测试网 LpX(N!P Pn

    ^&g ET7fXoV85282  方法工具:图形矩阵51Testing软件测试网%_\`2O5M3e H8S

    q-sI V6{'m'n&x85282  o 导出控制流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图形矩阵(graph matrix)的数据结构很有用。51Testing软件测试网ntN4L#~9t$vB

    J"`)Af SIS85282  利用图形矩阵可以实现自动地确定一个基本路径集。一个图形矩阵是一个方阵,其行/列数控制流图中的结点数,每行和每列依次对应到一个被标识的结点,矩阵元素对应到结点间的连接(即边)。在图中,控制流图的每一个结点都用数字加以标识,每一条边都用字母加以标识。如果在控制流图中第i个结点到第j个结点有一个名为x的边相连接,则在对应的图形矩阵中第i行/第j列有一个非空的元素x。

    "H$I GzS8k7h85282

    O"J5t2GB L+XjK85282  对每个矩阵项加入连接权值(link weight),图矩阵就可以用于在测试中评估程序的控制结构,连接权值为控制流提供了另外的信息。最简单情况下,连接权值是 1(存在连接)或0(不存在连接),但是,连接权值可以赋予更有趣的属性:51Testing软件测试网O$Hy-q1@

    51Testing软件测试网Y;|(l*p:{%s

      执行连接(边)的概率。51Testing软件测试网3Y6T&Ol9r"U8A#f

    51Testing软件测试网#JG_Gn;D$e

      穿越连接的处理时间。

    /RZX-j!UP6Q\8528251Testing软件测试网&N)Hz.KD2Q+l

      穿越连接时所需的内存

    Z:gN1n[ R8528251Testing软件测试网bA8Xrg9l#p~c

      穿越连接时所需的资源51Testing软件测试网MN2C*oN2r!e

    FiFRTa$Y85282  根据上面的方法对例4画出图形矩阵如下:

    S U*}DnU%^P#Dq,B85282

    51Testing软件测试网!l_0e g:Ixne-I

    51Testing软件测试网 ~'Ju&w\!K

      连接权为“1”表示存在一个连接,在图中如果一行有两个或更多的元素“1”,则这行所代表的结点一定是一个判定结点,通过连接矩阵中有两个以上(包括两个)元素为“1”的个数,就可以得到确定该图圈复杂度的另一种算法。

    ^Spc \85282
  • 常用嵌入式软件白盒测试工具介绍

    2009-03-02 13:15:11

    常用嵌入式软件白盒测试工具介绍(转)

    一、 VcTester

    生产厂商
    深圳市领测科技有限公司
    简介
      VcTester由深圳市领测科技有限公司自主研发,专业服务于嵌入式白盒测试领域的测试工具,它遵循第4代白盒测试方法(4GWM,The 4th Generation White-box-testing Methodology),为有效实施针对C语言的单元测试、集成测试与协议测试,提供系统化的测试解决方案。VcTester仅支持VC平台下C源代码的白盒测试, 主要应用于通信设备、嵌入式手持终端、医疗器械等实时嵌入式产品的源码级测试。
    功能特色
    VcTester共享版本的功能特色如下:
    1. 脚本化测试驱动
      VcTester使用CSE脚本语言编写测试用例,CSE语言风格与C语言接近,简单易用,很容易上手。编写CSE脚本可读取全局变量、给变量赋值、调用函数等。
    2. 脚本桩
      被测目标机运行后,VcTester允许用户定义一个脚本函数,给被测C函数打桩,使运行中脚本函数替代C函数。脚本桩函数中可编写特定的测试处理,或返回特定数值用于测试。
    3. 在线测试
      运行目标测试程序后,在线设计用例、运行用例,并根据测试结果改进或添加用例,持续在线的进行测试。VcTester这一特性使单元测试过程更加简捷明了,所见即所得,操作过程更富人性化。
    4. 即时调测
      VcTester配合VC中的调试程序,可支持目标代码单步调试,用户可借助VC设置断点,进行单步跟踪,同时,在测试用例设计过程中,测试驱动与脚本桩都可以选中部分或全部来执行。被测代码调试与测试脚本调试都是在线进行,可以即时的交叉着调试。
    5. 测试工程管理
      支持直观的树状测试用例管理,支持单用例、单测试集,或多用例、多测试集批量执行,支持命令行启动全工程自动测试。
      VcTester共享版定位于个体测试应用,商用版则定位于企业级应用,为适应团队运作及产品质量保证活动而增加相应功能,商用版具有如下特色:
    1. 支持符合第4代白盒测试方法的测试评估体系
      商用版提供LICC与LDCC两种代码覆盖率统计,对测试设计程度也提供评估,评估结果可以在线、直观的方式显示,还支持测试报告自动生成。共享版本没有这些功能。
    2. 调测一体,支持将调试操作自动转化成测试脚本
      商用版的检视器支持调试操作转脚本,该功能可以促进大家养成自发测试的习惯,摆脱不自觉的被动测试状态,检视器还支持更强大的脚本桩功能,如条件桩、PreCheck与PostCheck定义等。共享版没有这些功能。
    3. 提供集成化的工作平台,可大幅提高开发效率
      商用版的源码与测试用例在同一个IDE平台编辑、维护,以相同形式同时支持测试脚本与源码的一体化调试,集成界面支持设置断点,进行单步跟踪。共享版本没有单步调试功能。
      VcTester提供出色的IDE编辑器,编辑功能强大,支持提示输入、全文查找与替换、函数调用关系分析,定义与引用跳转、在线查看各行调用覆盖情况。共享版本没有函数调用关系分析与在线查看调用覆盖的功能。
      共享版本与商用版本都支持外部工具集成,如工程构建集成、与版本机自动CheckIn与CheckOut集成。
    4. 支持完善的测试消息构造与解析
      商用版提供用户数据UDT编辑器,可快速构造测试数据。共享版无此功能。商用版还提供通用消息编辑器、消息解析器,可以自定义消息模板。该功能特别适合通信协议测试,其消息解析器与编辑器还可以免费集成到用户产品或相关IT工具上,借助本功能,用户可以将VcTester工具延伸到协议测试、功能测试等领域。共享版本不提供这些功能。
    5. 支持测试设计重构
      当被测代码有大幅调整,经过一次或多次重构时,商用版支持快捷的测试设计重构,该功能可确保持续集成的操作过程不因代码重构而断链。共享版没有这个功能。
      商用版较完整的支持“第4代白盒测试方法”所要求的功能,共享版则有不少欠缺。另外,商用版的测试脚本完全兼容共享版的脚本,用户可以拿共享版评估或试用,在购得商用版本使用权后,所有用例都能无缝的升级到商用版。
    价格
    共享版免费,商用版本价格参见其官方网站http://www.eztester.com
    相关网站
    http://www.eztester.com
    获取方式
    网上下载地址:http://www.eztester.com
    二、 CodeTest

    生产厂商
    METROWERKS
    简介
      CODETEST是全球第一台专为嵌入式系统软件测试而设计的工具套件,CODETEST为追踪嵌入式应用程序,分析软件性能,测试软件的覆盖率以及存储体的动态分配等提供了一个实时在线的高效率解决方案。CODETEST还是一个可共享的网络工具,它将给整个开发和测试团队带来高品质的测试手段。
    功能特色
      基本的CODETEST 系统包括以下四个模块:
    1. 性能分析
      CODETEST 能够同时对多达32000个函数进行非采样性测试,精确计算出每个函数或任务(基于RTOS下)的执行时间或间隔,并能够列出其最大和最小的执行时间。对于每两个函数或任务之间的调用也能够计数,从而确认出其中失败的调用。CODETEST的性能分析功能也能够为嵌入式应用程序的优化提供依据,使软件工程师可以有针对性地优化某些关键性地函数或模块,以及改善整个软件地总体性能。
    2. 测试覆盖分析
      CODETEST提供程序总体概况,函数级代码以及源级覆盖趋势等多种模式来观测软件地覆盖情况。由于CODETEST是一种完全地交互式工具,测试者可以在对系统进行操作地同时追踪覆盖情况。
      CODETEST覆盖率信息包括程序实际执行的所有内容,而不是采样的结果,它以不同颜色区分运行和未运行的代码,CODETEST可以跟踪超过一百万个分支点,特别适用于测试大型嵌入式软件。
    CODETEST还能够生成一个融合多种测试结果地综合性报告,以使测试者看到整套测试地总体效果。
    3. 动态存储器分配分析
      在CODETEST诞生之前,动态地存储器分配情况是难以追踪观测的。CODETEST的分析能够显示有多少字节的存储器被分配给了程序的哪一个函数。这样就不难发现那些函数占用了较多的存储空间,那些函数没有释放相应的存储空间。测试者甚至还可以观察到存储体分配情况随着程序运行动态的增加和减少,即CODETEST可以统计出所有的内存的分配情况。随着程序的运行,CODETEST能够指出存储体分配的错误,测试者可以同时看到其对应的源程序内容。
    4. 执行追踪分析(TRACE)
      CODETEST可以按源程序,控制流以及高级模式来追踪嵌入式软件。最大追踪深度可达150万条源级程序,其中高级追踪模式显示的是RTOS的事件和函数的进入退出,给测试者一个程序流程的大框图;控制流追踪增加了可执行函数中每一条分支语句的显示;源级追踪则又增加了对被执行的全部语句的显示。在以上三种模式下,均会显示详细的内存分配情况,包括在那个代码文件的那一行,那一个函数调用了内存的分配或释放函数,被分配的内存的大小和指针,被释放的内存的指针,出现的内存错误。
    价格
    市场价每套约30万人民币
    相关网站
    不详
    获取方式
    国内深圳市华唐科技有限公司代理
    三、 RTRT(Rational Test RealTime)
    生产厂商
    IBM Rational
    简介
      IBM Rational Test RealTime帮助开发人员创建测试脚本、执行测试用例和生成测试报告,并提供对被测代码进行静态分析和运行时分析功能。利用该工具,开发人员可以大大提高测试的效率。
    功能特色
    1. 代码静态分析,功能测试和运行时分析相集成。
    2. 代码编辑、测试和调试相集成。
    3. Test RealTime通过分析源代码,自动生成测试驱动(Test Driver)和桩(Test Stub)模版。开发人员只需要在该测试脚本的基础上指定测试输入数据、期望输出数据以及打桩函数的逻辑。
    4. 测试执行后自动生成测试报告和各种运行时报告。测试报告展示通过或失败的测试用例,而运行时分析报告包括代码覆盖分析报告,内存分析报告、性能分析报告和执行追踪报告。
    5. 通过Target Deployment Port技术同时支持开发机和目标机的测试。
    价格
    市场价约 8万人民币
    相关网站
    http://www.ibm.com/cn
    获取方式
    不详
    四、 CppUnit

    生产厂商
    开源测试工具
    简介
      CppUnit是一个用C++语言实现的单元测试框架,属于XUnit系列中的一员。它的第一个版本是Michael Feathers由JUnit移植而来,目前的版本为1.10.2,源代码可通过网址http://sourceforge.net/projects/cppunit下载得到。该库目前受到GNU LGPL(Lesser General Public License)的保护。
    功能特色
    1. 提供测试用例设计框架
    2. 提供测试时常用的公共函数比如setUp ()、tearDown()、CPPUNIT_ASSERT等
    3. 用被测代码C++/C编写测试代码
    4. 将测试报告写入Log文件
    价格
    开源工具免费获取
    相关网站
    http://sourceforge.net/projects/cppunit
    获取方式
    网上下载地址:http://sourceforge.net/projects/cppunit
    五、 Cantata++

    生产厂商
    IPL
    简介
      Cantata/Cantata++是面向源代码的测试分析工具,贯穿于整个软件开发过程,包括代码评审、单元测试、集成测试、系统测试、及软件维护等阶段。
    功能特色
    1. 静态分析
      允许用户加强代码的标准,评估软件的复杂度和可维护性。
    2. 动态测试
      验证软件需求,为测试的说明、执行、归档、重用和重复动态测试提供一个形式上的框架。通过测试产生一个完整的诊断和质量确认的报告。提供大量的覆盖率分析:语句覆盖、条件分支覆盖、数据值覆盖、MC/DC和用户自定义标准。
    3. 软件执行
      测试程序是否满足需求
    4. 数据检查
      检查用户定义的类型
    5. 测试脚本
      根据用户定义的Test Case Definition自动生成
    6. 自动打桩
      使用桩模块模拟被测模块的函数调用。用户可以传递参数给桩模块,并设置桩模块的返回参数
    7. 时间工具
      检测软件的执行时间
    8. Cantata支持C,Cantata++支持C++
    价格
    不详
    相关网站
    不详
    获取方式
    不详
    六、 C++Test

    生产厂商
    Parasoft
    简介
      C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。
    功能特色
    1. 即时测试类/函数
    2. 支持极端编程模式下的代码测试
    3. 自动建立类/函数的测试驱动程序和桩调用
    4. 自动建立和执行类/函数的测试用例
    5. 提供快速加入和执行说明和功能性测试的框架
    6. 执行自动回归测试
    7. 执行部件测试(COM)
    价格
    不详
    相关网站
    http://www.parasoft.com
    获取方式
    不详
    七、 PureCoverage

    生产厂商
    Rational
    简介
      PureCoverage是一个面向VC, VB或者Java开发的测试覆盖程度检测
    工具, 它可以自动检测你的测试完整性和那些无法达到的部分. 作为一个质
    量控制工程, 可以使用PureCoverage在每一个测试阶段生产详尽的测试
    覆盖程度报告.
    功能特色
    1. 即时代码测试百分比显示
    2. 未测试, 测试不完整的函数, 过程或者方法的状态表示
    3. 在源代码中定位未测试的特定代码行
    4. 为执行效率最大化定制数据采集
    5. 为所需要的焦点细节定制显示方式
    6. 从一个程序的多个执行合成数据覆盖度
    7. 和其他团队成员共享覆盖数据或者产生报表
    8. 在开发环境当中使用PureCoverage集成实施检测代码覆盖程度(Visual Stadio, VB5+)
    价格
    不详
    相关网站
    不详
    获取方式
    不详
    八、 VectorCast

    生产厂商
    Vector Software
    简介
      VectorCAST产品扫描你的Ada, C/C++和嵌入式C++ (EC++)源代码,自动生成测试代码来为主机和嵌入式环境构造可执行的测试架构。使用VectorCAST测试系统,你的部件仿真模型可以经常保持更新。只需要几分钟的时间,它就可以建造起一个独立单个软件部件所需的测试环境。它还提供构造和运行测试范例和生成提供关于实际结果与预测结果之间的统计信息所需的报告的部件.
    功能特色
    VectorCAST 由下面6个集成的部件组成:
    1. 环境生成器
    2. 测试范例生成器
    3. 运行控制器
    4. 报告生成器
    5. 动态分析-代码覆盖率
    6. 静态分析-代码完整性和基础路径
    价格
    不详
    相关网站
    不详
    获取方式
    不详
    九、 Logiscope

    生产厂商
    Telelogic
    简介
      Telelogic Logiscope? 是一种软件质量保证 (QA) 工具,它可以通过自动进行代码检查和对容易出错的模块的鉴定与检测来帮助扩大测试范围,从而达到保证质量和完成软件测试的目的。可自定义的软件测试功能可帮助您在软件开发过程中及早发现缺陷,这样您就可以做到按时交付,将费用控制在预算内,同时又可以提高软件质量。
    功能特色
    1. 软件质量分析
    2. 代码规范性检测
    3. 测试覆盖率统计
    4. Logiscope可以对多种语言实现的代码进行分析,比如C、C++、Java、Ada等等.
    价格
    不详
    相关网站
    http://www.telelogic.com.cn
    获取方式
    北京奥索汉泰科技有限公司代理

  • 为何要进行白盒测试(转)

    2009-03-02 12:58:37

    为何要进行白盒测试

    软件白盒测试是一个与黑盒测试相对的概念,是指测试者针对可见代码进行的一种测试。白盒测试通常再划分为单元测试、集成测试两大类,但依据不同的流程,对白盒测试细分的标准也不尽一致,比如在IBM的IPD流程之下,白盒测试可能划分为如下几类:模块单元测试、模块集成测试、模块系统测试、渐增Build集成测试、系统集成测试等。而在XP实践中,单元测试与集成测试之间的界限并不明显,统称为渐增迭代测试。51Testing软件测试网 k2VU:L#Js;R

      一、从一个比喻开始51Testing软件测试网oE9X)|$hA,~*NN`t

    51Testing软件测试网?ZbKYY-o^NZ

      为什么要做白盒测试?这个问题比较复杂,我们先从一个比喻开始讲起。51Testing软件测试网Rl,bd3fi7T9R.UV

    51Testing软件测试网`` Y6Q#n]

      假设有一台的面包机,从上面倒入面粉与水,开动机器后从下面出来的就是烤好了的面包,这个机器的功能比较单一,接口很清晰,输入是面粉与水,输出是面包。现在假定这个面包机多年未用,内部都生锈了,现在要清洗它,类似于我们开发的软件,软件有Bug,那得通过测试来清理。
    6Q:@"B8\/u+rPJ85282         
    51Testing软件测试网!I%w9V'nOlpC

    bV-I"C Fx-\m85282  那如何更快速的清洗这台面包机呢?有两种洗法,一是拿水从上往下灌,这是系统测试的方法。另一种是拆开来洗,拆开机 器后,拿抺布沾点清洁剂,把各零件的坑坑槽槽擦洗一遍,然后组装回来,再用水从上往下冲一遍,拆开来洗是白盒方法,组装回来用水冲是黑盒方式,相当于白盒 测试之后再追加一次系统测试。51Testing软件测试网-P"\8Z.`;[\

    /wNng^AQ1{ ~6G85282  无疑,上面第二种方法是正确的,我们的前提是:清洗多年未用的面包机,铁锈够多,如果洗不干净,造出的面包都是致癌物质。当然,清洗面包机还只能算简单劳动,清理软件中的Bug要复杂得多,一个if语句有两条分支,一个while循环判断也是两条分支,还有break、continue、return等,想想看,一个1万行规模的软件能有多少个分支!一个分支就是一条坑坑槽槽,而且软件Bug还具备动态特性,不是静止的明摆在哪儿。

    6y8D9W1d]B`8528251Testing软件测试网i{'rp.y6J` DL

      所以,软件的白盒测试不可或缺,因为遗留Bug的影响很大,就像面包机没洗净留铁锈会致癌,还因为软件系统远比面包机复杂,不拆开来怎么能洗干净!51Testing软件测试网-Z;s"h1Y1zco

    _ b0x!p$i85282  二、白盒测试是高效测试51Testing软件测试网Bp~)L7[I

    51Testing软件测试网me;n5x!W~;n`

      尽管白盒测试如此重要,为什么还有许多企业不愿做白盒测试,有一个很重要的原因是:认为白盒测试太低效,不值得去做。51Testing软件测试网l!h$sz0w,e2|

    %fxxup]-R7R85282  实际上这种观点有许多误解成分,首先,决策者评估各阶段测试的有效性,仅以发现问题的数量为依据,这好比锈蚀斑斑的面包机,第一次冲水下去,看到大量浊水流出就很有成就感,其实这只是表象,思维方式有不足:把发现问题与解决问题割裂开来了。

    4N ?4oF$TC85282

    (V"d,K`0k2c w,J2dG85282  我们测试的目标是按既定质量标准稳定推进产品研发进度,只做系统测试的结果是:第一次冲水,很有成效,第二次冲水, 还能冲出点铁锈,第三次就没什么效果了。采用该手段并不能有效的达成既定质量目标。其次,研发质量改善,不只发现问题,还要定位问题、解决问题。白盒测试 是拆开来洗,发现、定位与解决问题不仅是彻底的,也是直接的,效率非常高,所以,单以发现问题数评估一个测试过程是否有效不尽准确,我们应该综合评估一个问题从被发现,到定位、解决,以及针对它完成回归测试的总效率。51Testing软件测试网#f:E8b:h H,U/rHx9O)i

    51Testing软件测试网2Sh+a/\ ~b*qX:@2Y

    下图来源于Capers Jones与McGraw-Hill的“Applied Software Measurement”文章,从该统计数据可看出,针对一个功能点的测试,若将问题发现、定位与解决都计算进去,单元测试效率最高,是集成测试的2倍,是系统测试的3倍。51Testing软件测试网G^_S7k
              
    51Testing软件测试网'g5@(_&p Z0Eb

    !XwcdP/^P85282  认为白盒测试低效的另一个误解是,决策者并未认清一个bug若遗留到下一阶段须多付出多少代价。经验数据表明,编码阶段的一个问题遗留到验收测试去解决,所须费用将增加5倍,如下图,一个问题越遗留到后面阶段解决,付出代价就越高,而且是成倍递增关系。51Testing软件测试网^ Y)J m"M;|j2e

    51Testing软件测试网qlQC#f/i'U6f Sw2w

    ~+nz!?Y'B }:~.xvQ0f+?8528251Testing软件测试网)Y5TXM6\vg;L4xo'c

    Mt X y@:DP:K85282

    Xt&E z%Dy ox85282  所以,越早测试就越能节约成本,白盒测试作为早期测试,跳过不做是得不偿失的。

    Pv+\ yTP"yr{4n8528251Testing软件测试网*c[VO{N

      依据上述原因,我们评估白盒测试效率时,通常将发现问题总数乘上一个系数K,以此为据再与其它测试方段的发现问题效率做对比,来权衡白盒测试值不值得去做。系数K取值与产品形态相关,按照实际经验,系数K取值区间为1.5~2.5,产品越复杂,出现问题越不容易解决的,K值要往大调。

    $Q!I8oRXJ$b3r5dzE85282

    FL'B"~jN(PZb p85282  三、白盒测试能彻底解决编码阶段引入的问题

    0G bA X3\+M CX4O8w85282

    6z2w9Rat5_7u1F5l {85282  前面我们分析了白盒测试是高效的测试,值得一做,下面我们要接着说明白盒测试必须要做,不可或缺。51Testing软件测试网-d6pV7wq

    &~z#kOiP[X85282先看一个案例,在某交换机产品的系统测试中,发现ISDN话机拨打某新业务号码时,在特定线路上,若一位一位的拨至18位,不会有问题,但如果先拨完号码再成组发送,会导致系统死机。这是一个导致死机的致命问题,最后定位出问题所在:呼叫处理的某段代码判断有误,本应小于18的判断,错写成小于等于18。

    $sc-}X0q!Og!i85282

    Y:P e!UL85282  这个问题本该在单元测试去发现,由于单元测试没做,问题就遗留到系统测试,庆幸的是没把它遗留到网上,否则问题就大 了。我们从另一个角度去反思,这个问题是特定线路下的特定终端,按特定方式拔打特定业务才暴露,在系统测试好不容易把它揪出来,但类似的其它问题呢?如何 保证在系统测试阶段都能测得出来?51Testing软件测试网FEt^` ]-S{)Rj+G~p

    51Testing软件测试网T/e"i a9_9b zJ

      不同阶段的测试发现问题的特点各不相同,比如:单元测试阶段,容易发现逻辑问题、边界条件(如上例“小于18” 的错误)、变量未初始化、内存越界等问题,而集成测试容易发现接口错误、任务配合问题等,系统测试容易发现业务流程问题、界面操作问题等。如果某阶段的测 试没做,把问题遗留后面阶段,又如何能保证查错的彻底性。比如使用非法内存,出问题是否表现出来是随机的,如果操作非法内存当前被系统还认为是有效的,系统并不死机,但某些情况下,操作非法内存会死机,而另一些情况,非法内存操作将不期望变化的变量改写了,会导致其它莫名其妙的问题。类似这样的问题,在白 盒测试阶段很容易发现,也容易定位解决,但遗留系统测试阶段,就很难去发现、去定位。

    v^4Ye V8528251Testing软件测试网)x,E5q? |:Ch

      在V模型中,软件开发过程与测试行为具有不同层次的对应关系,如下图:51Testing软件测试网@YF2f}k
           51Testing软件测试网Q9ob[ZwN

    G0t6_7Kp3_+w ZY8g85282  单元测试针对编码阶段引入的问题,集成测试与功能测试针对软件设计中引入的问题,验收测试针对需求与规格。单元测试不要或缺的重要原因是:编码阶段引入的问题占很高比例,不进行单元测试就难以保证系统最终的稳定性。51Testing软件测试网.{~-T8Ep5x2}?

    51Testing软件测试网OJ @4hQ;k:ZZ\ IX"E"A

    我们再来看一个实际案例:有两个产品形态接近的项目,A项目正式实施单元测试与集成测试,另一个项目B项目没正式做白盒测试(简单的拿调试当测试)。最后项目结束时对研发全过程的全部问题进行缺陷分析,如下图:51Testing软件测试网3RSe v.JDoH*L
           51Testing软件测试网p9CJn.bb$y|

    rF2Q"sR$z5pgX`*SE8528251Testing软件测试网6L$NME'so ]Kk

    `0D;N-z K?{ _~!L*|85282            A项目的缺陷类型分析
    &a'Y1b$Qj pd*X4Q5u8V85282        
    (CNIu.A k6[#i85282           B项目的缺陷类型分析

    e8I&L6L ~mN8528251Testing软件测试网1?["W6d6qgp0@;M

      A项目的所有问题中,应该发现问题的阶段是白盒测试(单元测试与集成测试)的占50%,而B项目所有问题中,应在白盒测试阶段发现的仅占33%,另外,A项目发现逻辑错误占13%,而B项目只占8%。由这个统计数据表明,不做白盒测试必然导致大量问题漏测。 51Testing软件测试网/Y"a^$l)U6N

    51Testing软件测试网"^c9Y,o$Bof:m

      四、白盒测试要做到什么程度才算合适51Testing软件测试网'f1J1}(y#L"lM

    51Testing软件测试网iiv}B

      既然白盒测试不可或缺,那么,白盒测试应做到什么程度才算合适呢?具体来说,白盒测试与黑盒测试应维持什么样的比例才算合适?51Testing软件测试网.S,Ii[A9n

    51Testing软件测试网T_ dt%i7j

      一般而言,白盒测试做多做少与产品形态有关,如果产品更多的具备软件平台特性,白盒测试应占总测试的80%以上,甚至接近100%,而如果产品具备复杂的业务操作,有大量GUI界面,黑盒测试的份量应该更重些。根据经验,对于大多数嵌入式产品,白盒方式展开测试(包括代码走读)应占总测试投入的一半以上,白盒测试发现的问题数也应超过总问题数的一半。51Testing软件测试网5i!sf:b@

    51Testing软件测试网cvtW5[j

      由于产品的形态不一样,很难定一个标准说某产品必须做百分之多少白盒测试,但依据历史经验,我们还可以进行定量分析的。比如,收集某产品的某历史版本在开发与维护中发生的所有问题,对这些问题进行正交缺陷分析(Orthogonal Defect Classification,ODC),把“问题根源对象”属于概要设计、详细设计与编码的问题整理出来,这些都是属于白盒测试应发现的问题,统计这些问题占总问题数的比例,大致就是白盒测试应投入的比例。

    8M4J4z9lz4{4k]gT8528251Testing软件测试网h(s IQ,Y Lp+X

      通过正交缺陷分析,还能推论历史版本各阶段测试的遗留缺陷率,根据“发现问题的活动”,能统计出与“问题根源对象”不相匹配的问题数,这些各阶段不匹配问题的比例就是该阶段的漏测率。51Testing软件测试网*C)L2H[+Y.^T,lui

    MSG2d dH8E85282  参考文献:

    lM5_2B'mL4MTX85282

    p5uNd8m%`$K85282  1. IPL, "Why Bother to Unit Test? "51Testing软件测试网2{U)`w4[:G8b

    ;m(N$^t-}5\g0H;z85282  2. Wayne Chan, 《第4代白盒测试方法介绍》51Testing软件测试网1ic ~M"j_~

    -EE(EVTa"gJg^85282  3. Yang Gu, fromIBM, "Adopting ODC to improve software quality: A case study"

    jr(Z8HKY1F85282

  • 关于白盒测试(转)

    2009-03-02 12:49:29

    关于白盒测试

     白盒测试,也称为结构化测试、基于代码的测试,是一种测试用例设计方法,它从程序的控制结构导出测试用例。用白盒测试产生的测试用例能够:

      1)保证一个模块中的所有独立路径至少被使用一次;

      2)对所有逻辑值均需测试true和false;

      3)在上下边界及可操作范围内运行所有循环;

      4)检查内部数据结构以确保其有效性。

      “我们应该更注重于保证程序需求的实现,为什么要花费时间和精力来担心(和测试)逻辑细节?”答案在于软件自身的缺陷:

      · 逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。当我们设计和实现主流之外的功能、条件或控制时,错误往往开始出现在我们工作中。日常处理往往被很好地了解,而“特殊情况”的处理则难于发现。

      · 我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,这意味着我们关于控制流和数据流的一些无意识的假设可能导致设计错误,只有路径测试才能发现这些错误。

      · 笔误是随机的。当一个程序被翻译为程序设计语言源代码时,有可能产生某些笔误,很多将被语法检查机制发现,但是,其他的会在测试开始时才会被发现。笔误出现在主流上和不明显的逻辑路径上的机率是一样的。

      正如Beizer所说的:“错误潜伏在角落里,聚集在边界上”,而白盒测试更可能发现它

      国内很少公司花很大的精力去做白盒测试,一般在单元测试过程中,白盒测试全是由开发人员来完成,商业软件所使用到的技术主要是黑盒测试技术,这是其特点所决定的。还有少量的白盒技术,但在实际中很少有公司愿意投入人力来作。

      白盒测试的方法:

      1.确定软件中的模块(数据计算、校验模块、功能模块)

      2.在每一个模块中用常用的覆盖率覆盖方法计算所有满足的路径(覆盖率方法有很多,看软件要求程度,比如航空、医疗软件要求严格,使用Do-178B的MC/DC覆盖率标准)

      3.设计测试用例,满足覆盖要求(注:想满足所有路径都覆盖是不可能的,花费也随之上升,没有公司愿意这么做,不现实)。

      在经费和时间不足的情况下,应采取对关键点的白盒测试,就是针对重要环节的测试,然后用黑盒测试做补充,目前国内大多数公司采用:先对软件进行黑盒测试,然后查看覆盖率再对未覆盖的代码进行白盒测试,这样做可以节省时间和花费,当然缺点也有,毕竟黑盒测试不能代替白盒测试,即使在正确的输入下得到正确的输出也未必是所设想的路径。

      来看一个实际案例:有两个产品形态接近的项目,A项目正式实施单元测试与集成测试,另一个项目B项目没正式做白盒测试(简单的拿调试当测试)。最后项目结束时对研发全过程的全部问题进行缺陷分析。

      A. 项目的缺陷类型分析

      B. 项目的缺陷类型分析

      A项目的所有问题中,应该发现问题的阶段是白盒测试(单元测试与集成测试)的占50%,而B项目所有问题中,应在白盒测试阶段发现的仅占33%,另外,A项目发现逻辑错误占13%,而B项目只占8%。由这个统计数据表明,不做白盒测试必然导致大量问题漏测。

      白盒测试要做到什么程度才算合适

      既然白盒测试不可或缺,那么,白盒测试应做到什么程度才算合适呢?具体来说,白盒测试与黑盒测试应维持什么样的比例才算合适?

      一般而言,白盒测试做多做少与产品形态有关,如果产品更多的具备软件平台特性,白盒测试应占总测试的80%以上,甚至接近100%,而如果产品具备复杂的业务操作,有大量GUI界面,黑盒测试的份量应该更重些。根据经验,对于大多数嵌入式产品,白盒方式展开测试(包括代码走读)应占总测试投入的一半以上,白盒测试发现的问题数也应超过总问题数的一半。

      由于产品的形态不一样,很难定一个标准说某产品必须做百分之多少白盒测试,但依据历史经验,我们还可以进行定量分析的。比如,收集某产品的某历史版本在开发与维护中发生的所有问题,对这些问题进行正交缺陷分析(Orthogonal Defect Classification,ODC),把“问题根源对象”属于概要设计、详细设计与编码的问题整理出来,这些都是属于白盒测试应发现的问题,统计这些问题占总问题数的比例,大致就是白盒测试应投入的比例。

      通过正交缺陷分析,还能推论历史版本各阶段测试的遗留缺陷率,根据“发现问题的活动”,能统计出与“问题根源对象”不相匹配的问题数,这些各阶段不匹配问题的比例就是该阶段的漏测率。


     

  • 白盒测试实例1~10(转)

    2009-03-02 11:25:47

    白盒测试实例之一——需求说明

    三角形的问题在很多软件测试的书籍中都出现过,问题虽小,五脏俱全,是个很不错的软件测试的教学例子。本文借助这个例子结合教学经验,从更高的视角来探讨需求分析、软件设计、软件开发与软件测试之间的关系与作用。

      题目:根据下面给出的三角形的需求完成程序并完成测试:

      一、输入条件:

      1、 条件1:a+b>c

      2、 条件2:a+c>b

      3、 条件3:b+c>a

      4、 条件4:0<a<200

      5、 条件5:0<b<200

      6、 条件6:0<c<200

      7、 条件7:a==b

      8、 条件8:a==c

      9、 条件9:b==c

      10、条件10:a2+b2==c2

      11、条件11:a2+ c2== b2

      12、条件12:c2+b2== a2

      二、输出结果:

      1、不能组成三角形

      2、等边三角形

      3、等腰三角形

      4、直角三角形

      5、一般三角形

      6、某些边不满足限制

    白盒测试实例之二——答案

    很多初学者一看到这个需求(详见白盒测试实例之一——需求说明收藏),都觉得很简单,然后立刻就开始动手写代码了,这并不是一个很好的习惯。如果你的第一直觉也是这样的,不妨耐心看到文章的最后。

      大部分人的思路:

      1、首先建立一个main函数, main函数第一件事是提示用户输入三角形的三边,然后获取用户的输入(假设用户的输入都是整数的情况),用C语言来写,这一步基本上不是问题(printf和scanf),但是要求用java来写的话,很多学生就马上遇到问题了,java5.0及之前的版本不容易获取用户的输入。

      点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用图形化界面来做输入,就得全部写过代码。

      2、业务处理流程的思路用流程图表示如下:

      

      3、C语言代码:

         1. #include<stdio.h>
         2. void main()
         3. {
         4.     int a, b, c;
         5.     printf("please enter three integer:");
         6.     scanf("%d%d%d", &a, &b, &c);
         7.     if(0<a && a<200 && 0<b && b<200 && 0<c && c<200)
         8.     {
         9.         if(a+b>c && a+c>b && c+b>a)
        10.         {
        11.             if(a==b && b==c && a==c)   //这里可以省掉一个判断
        12.             {
        13.                 printf("1是等边三角形");
        14.             }
        15.             else
        16.             {
        17.                 if(a==b || b==c || a==c)
        18.                 {
        19.                     printf("2是等腰三角形");
        20.                 }
        21.                 else
        22.                 {
        23.                     if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)
        24.                     {
        25.                         printf("3是直角三角形");
        26.                     }
        27.                     else
        28.                     {
        29.                         printf("4是一般三角形");
        30.                     }
        31.                 }
        32.             }
        33.         }
        34.         else
        35.         {
        36.             printf("5不能组成三角形");
        37.         }
        38.     }
        39.     else
        40.     {
        41.         printf("6某些边不满足限制");
        42.     }
        43. }

      点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用web或图形化界面来做输入,就得全部写过代码。

    相关阅读:

    白盒测试实例之一——需求说明收藏

    白盒测试技术——方法与实践篇

    白盒测试技术——白盒测试理论篇

    如何编写单元测试用例(白盒测试)

    白盒测试中的六种覆盖方法

    白盒测试实例之三——需求分析

    关键字:白盒测试、需求分析

      需求分析是后续工作的基石,如果分析思路有问题,后续工作可能就会走向不正确的方向,比如:代码重用性差、难于测试、难于扩展和难于维护等。反而,如果需求分析做的好,对设计、开发和测试来说,都可能是很大的帮助。

      看到题目给出的条件达12个之多,粗粗一看,好像很复杂,但仔细分析之后,发现可以把它们分成4组来讨论:

      1、 条件1:a+b>c; 条件2:a+c>b; 条件3:b+c>a

      这三个表达式有什么特点呢?实际上它们的逻辑是一样的:两个数之和大于第三个数。那么,前面程序的写法就存在逻辑重复的地方,应该把这个逻辑提取到一个函数中。

      2、 条件4:0<a<200; 条件5:0<b<200; 条件6:0<c<200

      这三个表达式也是同一个逻辑:判断一个数的范围是否在(0, 200)区间内,也应该把这个逻辑提取到一个函数中,去掉重复的逻辑,提高代码的可重用性。

      可重用性的好处:比如,现在用户的需求改为了三条边的取值范围要改为[100,400],那么,按前面的思路来说,需要改3个地方,而现在只需要在一个函数里改1个地方,这就是代码重用的好处。

      3、条件7:a==b; 条件8:a==c; 条件9:b==c

      这三个表达式的逻辑:判断两个数是否相等。也应该把它提取到一个函数中。

      我们进一步来分析一下判断是否是等边三角形或等腰三角形的条件:

      (1)前面程序的判断是从最直观的方式(a==b && b==c && a==c)(实际上只需要两个表达式成立即可)三条边都相等来判定是等边三角形;(a==b || b==c || a==c)只有两条边相等来判定是等腰三角形。

      (2)转变一下思路:给定三个整数,然后用一个函数来判断这三个整数有几个相等,返回相等的个数,如果返回值等于3,那么它是等边三角形,如果返回值是2,那么它是等腰三角形,否则,它是一般三角形(如果不是直角三角形的话)。

      4、条件10:a2+b2==c2 条件11:a2+ c2== b2 条件12:c2+b2== a2

      这三个条件的处理方式有两种:

      (1)跟前面三组分析一样,把相同的逻辑提取到一个函数中,然后三次调用。

      (2)根据直角三角形的特点:斜边是最长的,所以我们可以事先写一个函数来找到最长的边,然后把它赋值给c,这样处理之后,只需要一次调用判定(a2+b2==c2)的函数了。

    相关阅读:

    白盒测试实例之二——答案

    白盒测试实例之一——需求说明

    白盒测试实例之四——程序设计

    关键字:白盒测试

      程序设计对于软件的质量和软件实施过程的难易程度起着至关重要的作用。好的设计,即使聘用没什么经验的开发人员都很容易产生出高质量的代码出来;而差的设计,即使是经验很丰富的开发人员也很容易产生缺陷,特别是可重用性、可测试性、可维护性、可扩展性等方面的缺陷。

      经过以上的分析,下面来看一下如何设计。在下图中,每个方框都使用一个函数来实现,为了跟用户界面分开,最顶上的函数不要写在main函数中。

      把思路用流程图的方式表达出来,不用停留在脑袋里:

      

      具体的函数的调用关系图:

      

      复杂模块triangleType的流程图:

      

    相关阅读:

    白盒测试实例之三——需求分析

    白盒测试实例之二——答案

    白盒测试实例之一——需求说明

    白盒测试实例之五——编码

    1、Triangle.h

      1. /*

      2. * Copyright (c) 2008, 胡添发(hutianfa@163.com)

      3. *

      4. * 三角形类型判断

      5. *

      6. */

      7.

      8. #include<stdio.h>

      9. #include<String.h>

      10.

      11. /*

      12. * 判断一个整数是否在(0, 200)区间内

      13. * 返回值:true-否; false-是

      14. */

      15. bool isOutOfRange(int i);

      16.

      17. /*

      18. * 判断三条边是否合法(即:判断三条边都在合法的范围内)

      19. * 返回值:true-是; false-否

      20. */

      21. bool isLegal(int a, int b, int c);

      22.

      23. /*

      24. * 判断两条边之和是否大于第三边

      25. * 返回值:true-是; false-否

      26. */

      27. bool isSumBiger(int a, int b, int c);

      28.

      29. /*

      30. * 判断三条边是否能够组成三角形

      31. * 返回值:true-是; false-否

      32. */

      33. bool isTriangle(int a, int b, int c);

      34.

      35. /*

      36. * 判断两条边是否相等

      37. * 返回值:true-是; false-否

      38. */

      39. bool isEquals(int a, int b);

      40.

      41. /*

      42. * 求三角形有几条边相等

      43. * 返回值:相等边的数量

      44. */

      45. int howManyEquals(int a, int b, int c);

      46.

      47. /*

      48. * 判断是否满足两边平方之和是否等于第三边的平方

      49. *

      50. */

      51. bool isPowerSumEquals(int a, int b, int c);

      52.

      53. /*

      54. * 判断第一个数是否比第二个数大

      55. */

      56. bool isGreaterThan(int a, int b);

      57.

      58. /*

      59. * 判断是否是直角三角形

      60. *

      61. */

      62. bool isRightRriangle(int a, int b, int c);

      63.

      64. /*

      65. * 判断三角形的类型,返回值:

      66. * 1、不能组成三角形

      67. * 2、等边三角形

      68. * 3、等腰三角形

      69. * 4、直角三角形

      70. * 5、一般三角形

      71. * 6、某些边不满足限制

      72. */

      73. int triangleType(int a, int b, int c);

    白盒测试实例之六——单元测试的步骤

     白盒测试黑盒测试的过程和方法是有一些区别的。

      单元测试的步骤:

      1、 理解需求和设计

      理解设计是很重要的,特别是要搞清楚被测试模块在整个软件中所处的位置,这对测试的内容将会有很大的影响。需要记住的一个原则就是:好的设计,各模块只负责完成自己的事情,层次与分工是很明确的。在单元测试的时候,可以不用测试不属于被测试模块所负责的功能,以减少测试用例的冗余,集成测试的时候会有机会测试到的。

      举例:

      1. /*

      2.

      3. * 判断三条边是否能够组成三角形

      4.

      5. * 返回值:true-是; false-否

      6.

      7. */

      8.

      9. bool isTriangle(int a, int b, int c);

      测试该函数的时候,只需要测试三条边(在合法的取值范围内的整数)是否能够满足两边之和是否大于第三边的功能,而不需要测试三条边是否在合法的范围(0, 200)之间的整数,因为调用该函数之前,一定要先通过下面函数的检查,要是检查不通过,就不会执行isTriangle函数。

      1. /*

      2.

      3. * 判断三条边是否合法(即:判断三条边都在合法的范围内)

      4.

      5. * 返回值:true-是; false-否

      6.

      7. */

      8.

      9. bool isLegal(int a, int b, int c);

      所以,单元测试主要是关注本单元的内部逻辑,而不用关注整个业务的逻辑,因为会有别的模块去完成相关的功能。

    白盒测试实例之七——单元测试的尝试

    关键字:白盒测试 单元测试 软件测试

      以测试isOutOfRange函数为例,首先知道该函数在整个软件架构中处于最底层(叶子),所以对它进行测试并不需要写桩模块,只需要写驱动模块。要注意的问题是:对于测试结果是否通过测试不要使用printf方式打印被测试函数的返回结果值,否则就需要人工去检查结果了。

      使用边界值的方法可以得到5个测试用例,写的驱动模块代码如下:

      TestTriangle.cpp:

      1. /*

      2. * Copyright (c) 2008, 胡添发(hutianfa@163.com)

      3. *

      4. * 单元测试与集成测试

      5. *

      6. */

      7. #include "Triangle.h"

      8. /*

      9. * 测试isOutOfRange函数,使用边界值的方法(0,1,5,199,200)

      10. *

      11. */

      12. void testIsOutOfRange_try()

      13. {

      14. if(isOutOfRange(0) == true)

      15. {

      16. printf("pass!\n");

      17. }

      18. else

      19. {

      20. printf("fail!\n");

      21. }

      22.

      23. if(isOutOfRange(1) == false)

      24. {

      25. printf("pass!\n");

      26. }

      27. else

      28. {

      29. printf("fail!\n");

      30. }

      31.

      32. }

      33.

      34.

      35. void main()

      36. {

      37. testIsOutOfRange_try();

      38. }

      小知识:做单元测试的时候,一般不直接在main函数中写所有的测试代码,否则的话,main函数将会非常庞大。正确的做法:针对每个函数分别创建一个或若干个(函数比较复杂时)测试函数,测试函数的名称习惯以test开头。

      写到这里发现重复的代码太多了,而且如果测试用例数量很多的话,对于测试结果的检查也将是很大的工作量。在测试有错误的时候,这样的单元测试结果也很难获得更多关于错误的信息。

      解决问题的途径可以采用cppUnit单元测试框架。不过这里为了让学生能够对单元测试和单元测试框架有进一步的理解,我决定自己写一个类似cppUnit的简单的测试框架。

    相关阅读:

    白盒测试实例之六——单元测试的步骤

    白盒测试实例之五——编码

    白盒测试实例之四——程序设计

    白盒测试实例之三——需求分析

    白盒测试实例之二——答案

    白盒测试实例之一——需求说明

    白盒测试实例之八——构建自己的单元测试框架(上)

    关键字:单元测试白盒测试

      在上一讲“单元测试的尝试”里我们遇到了几个问题:

      1、代码重复的问题太多

      2、测试结果需要人工去检查

      3、对测试的总体信息也无从得知

      本讲将构建一个简单的单元测试框架来解决以上的问题:

      1、代码重复的问题太多

      这个问题很容易解决,只需要把判断预期结果和实际结果的逻辑提取到某个函数中即可。从整个代码来看,有两种类型的结果的函数:

      (1)返回布尔型

      (2)返回整数

      因此,需要两个类型的判断预期结果和实际结果是否相符的函数:

      1. /*

      2. * 判断是否取值为真

      3. */

      4. void assertTrue(char *msg, bool actual)

      5. {

      6. if(actual)

      7. {

      8. printf(".");

      9. }

      10. else

      11. {

      12. printf("F");

      13. }

      14. }

      15.

      16. /*

      17. * 判断预期结果和实际结果是否相符

      18. */

      19. void assertEquals(char *msg, int expect, int actual)

      20. {

      21. if(expect == actual)

      22. {

      23. printf(".");

      24. }

      25. else

      26. {

      27. printf("F");

      28. }

      29. }

      小知识:XUnit系列的框架的习惯使用assert*的命名来定义判断函数,对于通过的测试习惯打印一个“.”号,而对于失败的测试习惯打印一个“F”。

      2、测试结果需要人工去检查

      对于测试结果不要使用printf方式打印被测试函数的返回结果值就可以避免这个问题。

      3、对测试的总体信息也无从得知

      除了问题1的解决办法里使用“.”表示测试通过和“F”表示测试失败可以提高对测试结果的信息的直观性之外,做单元测试的人还希望能够得到以下的信息:

      (1)执行的测试用例总数、通过的数量和失败的数量

      (2)测试执行的时间

      (3)如果测试用例执行失败了,希望知道是哪个测试用例失败,从而去分析失败的原因。

    白盒测试实例之九——构建自己的单元测试框架(下)

    完整的源代码如下:

      1、UnitTest.h

      1. /*

      2.  * Copyright (c) 2008, 胡添发

      3.  *

      4.  * 简单的单元测试框架

      5.  *

      6.  */

      7.

      8. #include<stdio.h>

      9. #include<string.h>

      10. #include<time.h>

      11. #include<stdlib.h>

      12.

      13. /*

      14.  * VC中没有sleep函数,自己写一个

      15.  * wait单位是毫秒

      16.  */

      17. extern void sleep(clock_t wait);

      18.

      19.

      20. /*

      21.  * 判断是否取值为真

      22.  */

      23. void assertTrue(char *msg, bool actual);

      24.

      25. /*

      26.  * 判断预期结果和实际结果是否相符

      27.  */

      28. void assertEquals(char *msg, int expect, int actual);

      29.

      30. /*

      31.  * 初始化测试,开始计时

      32.  */

      33. void init();

      34.

      35. /*

      36.  * 结束测试,结束计时,打印报告

      37.  */

      38. void end();

    白盒测试实例之十——集成测试的概念

    一、桩模块和驱动模块(以C语言为例):

      很多人对桩模块和驱动模块的概念会搞不清楚,下面先介绍这两个概念:

      模块结构实例图:

      

      假设现在项目组把任务分给了7个人,每个人负责实现一个模块。你负责的是B模块,你很优秀,第一个完成了编码工作,现在需要开展单元测试工作,先分析结构图:

      1、由于B模块不是最顶层模块,所以它一定不包含main函数(A模块包含main函数),也就不能独立运行。

      2、B模块调用了D模块和E模块,而目前D模块和E模块都还没有开发好,那么想让B模块通过编译器的编译也是不可能的。

      那么怎样才能测试B模块呢?需要做:

      1、写两个模块Sd和Se分别代替D模块和E模块(函数名、返回值、传递的参数相同),这样B模块就可以通过编译了。Sd模块和Se模块就是桩模块。

      2、写一个模块Da用来代替A模块,里面包含main函数,可以在main函数中调用B模块,让B模块运行起来。Da模块就是驱动模块。

      知识点:

      桩模块的使命除了使得程序能够编译通过之外,还需要模拟返回被代替的模块的各种可能返回值(什么时候返回什么值需要根据测试用例的情况来决定)。

      驱动模块的使命就是根据测试用例的设计去调用被测试模块,并且判断被测试模块的返回值是否与测试用例的预期结果相符。

      二、集成测试策略:

      1、 非增式集成测试

      各个单元模块经过单元测试之后,一次性组装成完整的系统。

      优点:集成过程很简单。

      缺点:出现集成问题时,查找问题比较麻烦,而且测试容易遗漏。

      范例:

      

      2、 增式集成测试

      (1)自顶向下

      A、 纵向优先

      从最顶层开始测试,需要写桩模块。测试的顺序:从跟节点开始,每次顺着某枝干到该枝干的叶子节点添加一个节点到已测试好的子系统中,接着再加入另一枝干的节点,直到所有节点集成到系统中。

      B、 横向优先

      跟纵向优先的区别在于:每次并不是顺着枝干走到叶子,而是逐一加入它的直属子节点。

      纵向优先的范例:

      

      (2)自底向上

      每次从叶子节点开始测试,测试过的节点摘掉,然后把树上的叶子节点摘下来加入到已经测试好的子系统之中。优点:不需要写桩模块,但需要写驱动模块。

      范例:

      

    相关阅读:




     

  • 为何进行白盒测试 从“清洗面包机”讲起(转)

    2009-03-02 11:17:36

    为何进行白盒测试 从“清洗面包机”讲起

    软件白盒测试是一个与黑盒测试相对的概念,是指测试者针对可见代码进行的一种测试。白盒测试通常再划分为单元测试、集成测试两大类,但依据不同的流程,对白盒测试细分的标准也不尽一致,比如在IBM的IPD流程之下,白盒测试可能划分为如下几类:模块单元测试、模块集成测试、模块系统测试、渐增Build集成测试、系统集成测试等。而在XP实践中,单元测试与集成测试之间的界限并不明显,统称为渐增迭代测试。

      一、从一个比喻开始

      为什么要做白盒测试?这个问题比较复杂,我们先从一个比喻开始讲起。

      假设有一台的面包机,从上面倒入面粉与水,开动机器后从下面出来的就是烤好了的面包,这个机器的功能比较单一,接口很清晰,输入是面粉与水,输出是面包。现在假定这个面包机多年未用,内部都生锈了,现在要清洗它,类似于我们开发的软件,软件有Bug,那得通过测试来清理。
      
      那如何更快速的清洗这台面包机呢?有两种洗法,一是拿水从上往下灌,这是系统测试的方法。另一种是拆开来洗,拆开机 器后,拿抺布沾点清洁剂,把各零件的坑坑槽槽擦洗一遍,然后组装回来,再用水从上往下冲一遍,拆开来洗是白盒方法,组装回来用水冲是黑盒方式,相当于白盒 测试之后再追加一次系统测试。

      无疑,上面第二种方法是正确的,我们的前提是:清洗多年未用的面包机,铁锈够多,如果洗不干净,造出的面包都是致癌物质。当然,清洗面包机还只能算简单劳动,清理软件中的Bug要复杂得多,一个if语句有两条分支,一个while循环判断也是两条分支,还有break、continue、return等,想想看,一个1万行规模的软件能有多少个分支!一个分支就是一条坑坑槽槽,而且软件Bug还具备动态特性,不是静止的明摆在哪儿。

      所以,软件的白盒测试不可或缺,因为遗留Bug的影响很大,就像面包机没洗净留铁锈会致癌,还因为软件系统远比面包机复杂,不拆开来怎么能洗干净!

      二、白盒测试是高效测试

      尽管白盒测试如此重要,为什么还有许多企业不愿做白盒测试,有一个很重要的原因是:认为白盒测试太低效,不值得去做。

      实际上这种观点有许多误解成分,首先,决策者评估各阶段测试的有效性,仅以发现问题的数量为依据,这好比锈蚀斑斑的面包机,第一次冲水下去,看到大量浊水流出就很有成就感,其实这只是表象,思维方式有不足:把发现问题与解决问题割裂开来了。

      我们测试的目标是按既定质量标准稳定推进产品研发进度,只做系统测试的结果是:第一次冲水,很有成效,第二次冲水, 还能冲出点铁锈,第三次就没什么效果了。采用该手段并不能有效的达成既定质量目标。其次,研发质量改善,不只发现问题,还要定位问题、解决问题。白盒测试 是拆开来洗,发现、定位与解决问题不仅是彻底的,也是直接的,效率非常高,所以,单以发现问题数评估一个测试过程是否有效不尽准确,我们应该综合评估一个问题从被发现,到定位、解决,以及针对它完成回归测试的总效率。

      下图来源于Capers Jones与McGraw-Hill的“Applied Software Measurement”文章,从该统计数据可看出,针对一个功能点的测试,若将问题发现、定位与解决都计算进去,单元测试效率最高,是集成测试的2倍,是系统测试的3倍。

        认为白盒测试低效的另一个误解是,决策者并未认清一个bug若遗留到下一阶段须多付出多少代价。经验数据表明,编码阶段的一个问题遗留到验收测试去解决,所须费用将增加5倍,如下图,一个问题越遗留到后面阶段解决,付出代价就越高,而且是成倍递增关系。

      所以,越早测试就越能节约成本,白盒测试作为早期测试,跳过不做是得不偿失的。

      依据上述原因,我们评估白盒测试效率时,通常将发现问题总数乘上一个系数K,以此为据再与其它测试方段的发现问题效率做对比,来权衡白盒测试值不值得去做。系数K取值与产品形态相关,按照实际经验,系数K取值区间为1.5~2.5,产品越复杂,出现问题越不容易解决的,K值要往大调。

      三、白盒测试能彻底解决编码阶段引入的问题

      前面我们分析了白盒测试是高效的测试,值得一做,下面我们要接着说明白盒测试必须要做,不可或缺。

      先看一个案例,在某交换机产品的系统测试中,发现ISDN话机拨打某新业务号码时,在特定线路上,若一位一位的拨至18位,不会有问题,但如果先拨完号码再成组发送,会导致系统死机。这是一个导致死机的致命问题,最后定位出问题所在:呼叫处理的某段代码判断有误,本应小于18的判断,错写成小于等于18。

         这个问题本该在单元测试去发现,由于单元测试没做,问题就遗留到系统测试,庆幸的是没把它遗留到网上,否则问题就大 了。我们从另一个角度去反思,这个问题是特定线路下的特定终端,按特定方式拔打特定业务才暴露,在系统测试好不容易把它揪出来,但类似的其它问题呢?如何 保证在系统测试阶段都能测得出来?

      不同阶段的测试发现问题的特点各不相同,比如:单元测试阶段,容易发现逻辑问题、边界条件(如上例“小于18” 的错误)、变量未初始化、内存越界等问题,而集成测试容易发现接口错误、任务配合问题等,系统测试容易发现业务流程问题、界面操作问题等。如果某阶段的测 试没做,把问题遗留后面阶段,又如何能保证查错的彻底性。比如使用非法内存,出问题是否表现出来是随机的,如果操作非法内存当前被系统还认为是有效的,系统并不死机,但某些情况下,操作非法内存会死机,而另一些情况,非法内存操作将不期望变化的变量改写了,会导致其它莫名其妙的问题。类似这样的问题,在白盒测试阶段很容易发现,也容易定位解决,但遗留系统测试阶段,就很难去发现、去定位。

        单元测试针对编码阶段引入的问题,集成测试与功能测试针对软件设计中引入的问题,验收测试针对需求与规格。单元测试不要或缺的重要原因是:编码阶段引入的问题占很高比例,不进行单元测试就难以保证系统最终的稳定性。

      我们再来看一个实际案例:有两个产品形态接近的项目,A项目正式实施单元测试与集成测试,另一个项目B项目没正式做白盒测试(简单的拿调试当测试)。

    A项目的所有问题中,应该发现问题的阶段是白盒测试(单元测试与集成测试)的占50%,而B项目所有问题中,应在白盒测试阶段发现的仅占33%,另外,A项目发现逻辑错误占13%,而B项目只占8%。由这个统计数据表明,不做白盒测试必然导致大量问题漏测。

      四、白盒测试要做到什么程度才算合适

      既然白盒测试不可或缺,那么,白盒测试应做到什么程度才算合适呢?具体来说,白盒测试与黑盒测试应维持什么样的比例才算合适?

      一般而言,白盒测试做多做少与产品形态有关,如果产品更多的具备软件平台特性,白盒测试应占总测试的80%以上,甚至接近100%,而如果产品具备复杂的业务操作,有大量GUI界面,黑盒测试的份量应该更重些。根据经验,对于大多数嵌入式产品,白盒方式展开测试(包括代码走读)应占总测试投入的一半以上,白盒测试发现的问题数也应超过总问题数的一半。

      由于产品的形态不一样,很难定一个标准说某产品必须做百分之多少白盒测试,但依据历史经验,我们还可以进行定量分析的。比如,收集某产品的某历史版本在开发与维护中发生的所有问题,对这些问题进行正交缺陷分析(Orthogonal Defect Classification,ODC),把“问题根源对象”属于概要设计、详细设计与编码的问题整理出来,这些都是属于白盒测试应发现的问题,统计这些问题占总问题数的比例,大致就是白盒测试应投入的比例。

      通过正交缺陷分析,还能推论历史版本各阶段测试的遗留缺陷率,根据“发现问题的活动”,能统计出与“问题根源对象”不相匹配的问题数,这些各阶段不匹配问题的比例就是该阶段的漏测率。

  • 如何编写单元测试用例(白盒测试)(转)

    2009-03-02 11:14:52

    如何编写单元测试用例(白盒测试)

    前段时间公司进行有关测试的培训,集成测试,性能测试,压力测试说了很多。由于本人还处于Coder阶段,只是对单元测试有了些了解。写下来怕以后自己忘记了。都是些自己的看法,不一定准确,欢迎高手指教。

    一、 单元测试的概念

            单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。
            测试的覆盖种类
            1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
            2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。
            3.条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。
            4.判定——条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次,并且每个可能的判断结果也至少执行一次。
            5.条件组合测试:设计足够的测试用例,运行所测程序,使程序中每个判断的所有条件取值组合至少执行一次。
            6.路径测试:设计足够的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
            用例的设计方案主要的有下面几种:条件测试,基本路径测试,循环测试。通过上面的方法可以实现测试用例对程序的逻辑覆盖,和路径覆盖。

    二、开始测试前的准备
            
            在开始测试时,要先声明一下,无论你设计多少测试用例,无论你的测试方案多么完美,都不可能完全100%的发现所有BUG,我们所需要做的是用最少的资源,做最多测试检查,寻找一个平衡点保证程序的正确性。穷举测试是不可能的。   所以现在进行单元测试我选用的是现在一般用的比较多的基本路径测试法。

    三、开始测试

           基本路径测试法:设计出的测试用例要保证每一个基本独立路径至少要执行一次。

            函数说明 :当i_flag=0;返回       i_count + 100
                                    否则当  i_flag=1;返回   i_ temp + 10
                                    否则    返回   i_temp + 20


            输入参数:int i_count , int i_flag
            输出参数: int  i_temp; 
            
          
            代码:
             

     1  int Test(int i_count, int i_flag)
     2         {
     3             int i_temp = 0;
     4             while (i_count>0)
     5             {
     6                 if (0 == i_flag)
     7                 {
     8                     i_temp = i_count + 100;
     9                     break;
    10                 }
    11                 else
    12                 {
    13                     if (1 == i_flag)
    14                     {
    15                         i_temp = i_temp + 10;
    16                     }
    17                     else
    18                     {
    19                         i_temp = i_temp + 20;
    20                     }
    21                 }
    22                 i_count--;
    23             }
    24             return i_temp;
    25         }



            1.画出程序控制流程图
            
        图例:
      

    事例程序流程图:

        

                圈中的数字代表的是语句的行号,也许有人问为什么选4,6,13,8......作为结点,第2行,第3行为什么不是结点,因为选择结点是有规律的。让我们看程序中;第2行,第3行是按顺序执行下来的。直到第4行才出现了循环操作。而2,3行没有什么判断,选择等分支操作,所以我们把2,3,4全部合并成一个结点。其他的也是照这个规则合并,然后就有了上面的流程图。

                2.计算圈复杂度
                
                有了图以后我们要知道到底我们有写多少个测试用例,才能满足基本路径测试。
                这里有有了一个新概念——圈复杂度
                圈复杂度是一种为程序逻辑复杂性提供定量测试的软件度量。将该度量用于计算程序的基本独立路径数目。为确保所有语句至少执行一次的测试数量的上界。
                公式圈复杂度V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量。
                公式圈复杂度V(G)=P+1 ,P是流图G中判定结点的数量。
                通俗的说圈负责度就是判断单元是不是复杂,是不是好测试的标准。一般来说如果圈复杂度如果大于20就表示这个单元的可测试性不好,太复杂(也许有人觉得无所谓,但是如果你们公司实行了CMMI5的话,对这个是有规定的)。
                从图中我们可以看到,
                V(G)=10条边-8结点+2=4
                V(G)=3个判定结点+1=4
                上图的圈复杂图是4。这个结果对我们来说有什么意义呢?它表示我们只要最多4个测试用例就可以达到基本路径覆盖。

                3.导出程序基本路径。
                
                现在我们知道了起码要写4个测试用例,但是怎么设计这4个测试用例?
                导出程序基本路径,根据程序基本路径设计测试用例子。

                 程序基本路径:基本独立路径就是从程序的开始结点到结束可以选择任何的路径遍历,但是每条路径至少应该包含一条已定义路径不曾用到的边。(看起来不好理解,让我们看例子)。
                 让我们看上面的流程图:从结点4到24有几条路径呢?
                 1 B(4,24)
                 2 C,E,J(4,6,8,24)
                 3 C,D,F,H,A,B(4,6,13,15,22,4,24)
                 4 C,D,G,I,A,B(4,6,13,19,22,4,24)
                 还有吗??
                 5 C,D,C,I,A,C,E,J(4,6,13,19,22,4,6,8,24)算吗?
                不算,为什么?因为上面的4条路径已经包括了所有的边。第5条路径已经不包含没有用过的边了。所有的路径都遍历过了。
                好了,现在我们有了4条基本独立路径根据独立路径我们可以设计测试用例。

                1 B(4,24)
                输入数据:i_count=0,或者是i_count<0的某一个值。
                预期结果:i_temp=0.

                 2 C,E,J(4,6,8,24)
                输入数据:i_count =1; i_flag=0 
                预期结果:i_temp=101.

                 3 C,D,F,H,A,B(4,6,13,15,22,4,24)
                输入数据:i_count =1; i_flag=1 
                预期结果:i_temp=10.


                 4 C,D,G,I,A,B(4,6,13,19,22,4,24)
                 输入数据:i_count =1; i_flag=2     
                 预期结果:i_temp=22.
                
                这里的输入数据是由路径和程序推论出来的。而要注意的是预期结果是从函数说明中导出,不能根据程序结构中导出。
                
                为什么这么说?
                让我们看程序中的第3行。
                int i_temp=0;假如开发人员一不小心写错了,变成了int i_temp=1;根据程序导出的预期结果就会是一个错误的值,但是单元测试不出来问题
                那单元测试就失去了意义。

                有人也许会问这么简单的函数就有4个测试用例,如果还复杂一些的怎么办?上面的测试用例还可以简化吗?答案是可以。
                我们来看 路径    1 B(4,24)和   4 C,D,G,I,A,B(4,6,13,19,22,4,24),路径1是路径4的真子集,     所以1是可以不必要的。上图的圈复杂度是4。这个结果对我们来说有什么意义呢?它表示我们只要最多4个测试用例就可以达到基本路径覆盖。所以说圈复杂度标示是最多的测试用例个数,不是一定要4个测试用例才可以。不过有一点要申明的是测试用例越简化代表你的测试越少,这样程序的安全性就越低了。

    四、完成测试
                
                接下来根据测试用例使用工具测试NUNIT,VS2005都可以。
                接下来根据测试结果编写测试报告,测试人,时间,结果,用例,是否通过,格式网上一大把,每个公司的格式也不一样就不说了。


     

  • 白盒测试(转)

    2009-03-02 11:09:59

    白盒测试

        我大胆的推广下二八原则,国内软件测试的现状是百分之八十以上的测试人员在做黑盒测试工作,不到百分之二十的测试人员做过白盒子测试工作。这不到百分之二十的测试人员许多又是在与开发人员共同完成的白盒测试工作。白盒测试也正在越来越受重视,前景也越来越好。虽然未必做白盒测试,但是白盒子测试用例的设计方法是需要软件测试人员掌握的,许多公司笔试,还有软测试考试的时候都会有白盒测试用例设计的题目出现。(我的意思不是为了应付考试而掌握哈,即使你现在没做白盒的测试,也要时刻为做白盒测试而准备着。)

      在软件测试一书中,白盒测试是这样定义的:软件测试人员可以访问程序员的代码,并通过检查代码来协助测试---可以看盒子里面。

      白盒子测试也分静态和动态两种:


      静态白盒测试是在不执行的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时也称为结构分析。进行静态白盒子测试的首要原因就是尽早发现软件缺陷,以找出动态黑盒子测试难以揭示或遇到的软件缺陷;另一个好处是为接受该软件测试的黑盒测试员的测试案例提供思路,他们不必了解代码细节,但是根据审查备注,可以确定似乎有问题或者存在软件缺陷的特性范围。动态白盒测试是指利用查看代码功能和实现方式得到的信息来确定哪些要测试,哪些不要测试,如何开展测试。

      动态白盒测试的另一个常用名称是结构化测试,因为软件测试员可以查看并使用代码的内部结构,从而设计和执行测试。 动态白盒测试包括四部分:
        1.
    直接测试底层功能、过程、子程序和库。即应用程序接口(API
        2.
    以完整程序的方式从顶层测试软件,但是要根据对软件运行的了解调整测试案例。
        3.
    从软件获得读取变量和状态信息的访问权,以便确定测试与预期结果是否相符,同时,强制软件以正常测试难以实现的方式运行。
        4.
    估算执行测试时命中的代码量和具体代码,然后调整测试,去掉多余的,补充遗漏的。

      静态的白盒测试我没做过,在此就不叙述了。和黑盒测试一样,动态白盒测试也是按部就班的来,首先写测试计划,然后设计测试用例,再次执行用例,写测试报告,最后写测试总结。我做过的白盒测试,驱动程序都是开发人员做好了的,我只是按每个类里的每个函数设计测试用例,测试函数返回值。(许多内部保护类都是无法测试的。)下面我说说用例的设计。

      白盒测试有六种用例有六种覆盖的方法分别是:

      1.语句覆盖。这个是起码要做到的覆盖了,程序里的每条可执行的语句都要至少执行一次。这个设计起来比较简单,用例数据很直观的就能看出来。但是语句里的判定,分支等就没什么意义了。可以说这样的测试是最低的要求了。
      2.判定覆盖。每个判断的真假分支至少执行一次,就是真要至少取一次,假要至少取一次。这个设计起来也不难,覆盖率要比语句覆盖高近乎一倍,但是也在判定语句中也会遗漏许多路径,因为每个条件的取值是不在考虑范围内的。
      3.条件覆盖。和判定覆盖思路一样,只是把重点从判定移动到条件上来了,每个判定中的每个条件可能至少满足一次,也就是每个条件至少要取一次真的,再取一次假的。同样它也会遗漏许多路径,条件取真假并不能满足判定也取到真假两次。
      4.判定条件覆盖。既然上面的判定和条件多是片面的,那么这个两个覆盖相结合是呼之欲出判定条件覆盖。它要求判断中的每个条件所有可能至少出现一次,并且每个判定本身的判定结果也要出现一次。不要以为这样就行了,要看看条件,条件和判定不一样,判定取真假就覆盖了判定,可是条件取真假两次完全不能满足条件的各种组合。所以才有了5~
      5.条件组合覆盖。每个判定中条件的各种可能组合至少满足一次。条件各种可能都出现了,必然把判定给覆盖了,它覆盖了上面的4个哦,可是用例数量大大增加了!看项目情况定吧。
      6.路径覆盖。概念比较好理解,把所有可能路径至少都走一遍,但是用例数量可想而知了。

      方法是固定的,掌握方法不能只记概念,实践!实践出真知!下面举个实际的例子。

      这是我以前做的测试试卷一里的题

    对下面给出的程序控制图,分别以各种不同的测试方法写出最少的测试用例。

    1:
    语句覆盖
    要点:每个可执行语句至少执行一次.
    A=5 B=6 X=2
    ace,可将语句全覆盖


    2:
    判定覆盖
    要点:每个判断的真假分支至少执行一次
    有两个判定,设计两真两假就达到判定覆盖条件
    假假分支:ace A=5 B=6 X=2 f1f2
    真真分之:abd A=2 B=5 X=3 t2t2(小写表示判断真假),大写表示条件真假
    )


    3:
    条件覆盖
    要点:每个判定中的每个条件可能至少满足一次
    题中有两个判定,每个判定里两个条件,也就是四个条件.
    四个条件分别去真假两种可能,只要在用例中出现条件四种真和四种假就可以
        A<5
    取真T1,取假F1
    如上B=5     T2     F2
        A=2     T3     F3
        X>2     T4     F4
    F
    1F2F3F4 A=5 B=6 X=2
    ace
    T1T2T3T4 A=2 B=5 X=3
    abd
    A B A X
    四个条件的真假都取到了,条件覆盖完成了,也可以用T1F2F3T4
    F1T2T3F4
    来设计,只要TNFN都出现就可以,但是要注意F1T3不能同时出现,因为A<5不成立,A=2一定不成立,以下几种方法也要考虑这个条件,还要注意如果路径走aceacd的时候X的值会有变化)

    4:
    判定条件覆盖
    要点:判断中的每个条件所有可能至少出现一次,并且每个判定本身的判定结果也要出现一次.
    判定条件覆盖就是把判定覆盖和条件覆盖要考虑的东西合在一起考虑
    两个判定的真假要分别出现,四个条件的真假也要分别出现.
    此题是巧合,判定覆盖可以和条件覆盖设计一样的用例
    F1F2F3F4 A=5 B=6 X=2
    ace f1f2
    T1T2T3T4 A=2 B=5 X=3
    abd t1t2
    完全满足了判定条件覆盖~

    5:
    条件组合覆盖
    要点:每个判定中条件的各种可能组合至少满足一次
    这个稍微复杂一点先搞第一个判定中的条件,先把这两个条件组合在一起,两个条件,分别真假有四种组合方式:
    (1)A<5 B=5 T1T2
    (2)A<5 B!=5 T1F2
    (3)A>=5 B=5 F1T2
    (4)A>=5 B!=5 F1F2
    第二个判断
    (5)A=2 X>2 T3T4
    (6)A=2 X<=2 t3f4
    (7)A!=2 X>2 F3T4
    (8)A!=2 X<=2 F3F4

    把 第一个判断中四个条件和第2个判断中四个条件组合
    其中(3)(4)不能和(5)(6)组合因为A>=5就不能有A=2
    来组合下吧
    (1)(5)
    T1T2T3T4    A=2 B=5 X=3abd        
    (2)(6):  T1F2T3F4    A=2 B=6 X=2  
    acd
    (3)(7):  F1T2F3F4    A=3 B=5 X=2
    abe
    (4)(8):  F1F2F3F4    A=5 B=6 X=2
    ace   

    居然覆盖四条路径了(纯属巧合)一般的情况下条件组合是不能保证路径全被覆盖的。

    6
    :路径覆盖
    所有路径:一眼就能看出有四条路径,分别是ace abd abe acd
    在这里偷点工,因为条件组合里恰巧覆盖里路径,就不再写用例了。


     

  • 黑盒测试与白盒测试(转)

    2009-03-02 11:03:38

    黑盒测试与白盒测试

    单元测试的测试数据可以用两个基本的方法系统地构建。第一个是规格说明测试,这个技术也称为黑盒测试,行为测试,数据驱动测试,功能测试以及输入/输出驱动测试。在这个方法中,不考虑代码本身,在拟制测试用例中使用的仅有的信息是规格说明文档。另一个极端是代码测试,它在选择测试用例时不理会规格说明文档。这个技术也称为玻璃盒测试,白盒测试,结构测试,逻辑驱动测试以及面向路径测试。
        
    规格说明测试的可行性:
            考虑下面的例子。假定某个数据处理产品的规格说明指出,必须包含5类佣金和7类折扣。仅测试佣金和折扣的每个可能的组合就需要35个测试用例,说佣金和折扣是在两个完全独立的模块中,因而可以独立测试是没有用的,因为在黑盒测试中将产品当作黑盒对待,它的内部结构因此是完全无关的。因此,彻底的规格说明测试在实际中是不可能的,因为它的组合方式会爆炸式的增长。

    代码测试的可行性:
            代码测试最常见的形式要求对模块通过的每条路径最少执行一次。试验产品中全部路径是不可靠的,因为存在这样的产品,某些数据试验一个给定路径将检测到错误,而不同的数据试验同一个路径将不会检出错误。然而,面向路径的测试是有效的,因为它没有固有地将可能揭示错误的测试数据的选择排除在外。

            因为组合爆炸,彻底的规格说明测试或彻底的代码测试都是不可行的。为此,在使用将尽可能多揭示错误的技术的同时,也承认没有方法保证已经检测出全部错误,一个继续下去的合理的办法是首先使用黑盒测试用例,然后使用玻璃盒测试开发额外的测试用例。

    黑盒单元测试技术
            彻底的黑盒测试通常要求成百上千亿的测试用例,因此测试的技巧是设计一个较小,可管理的测试用例集,是检测出一个错误的机会最大,同时通过让相同的错误由多个测试用例检出从而使浪费一个测试用例的机会最小。一个这样的黑盒技术是结合了边界值分析的等价测试。

    1. 等价测试和边界值测试
            假定一个数据库产品的规格说明指出,该产品必须能够处理任何从1到16383个记录,如果该产品能够处理34个记录和14870个记录,那么它在比如说 8252个记录时工作良好的可能性很大。因此,该产品能够处理的记录数的规定范围可以定义三个等价类:比1个记录小,从1到16383个记录和多于 16383个记录。
            一个成功的测试用例能检测出先前未检测到的错误,为了使发现这一的错误的机会最大,一个高效的技术是边界值分析。
            综上,因此,测试这个数据库产品的时候,应选择7个测试用例:
    1> 0个记录:等价类1的成员,临近边界值。
    2> 1个记录:边界值。
    3> 2个记录:临近边界值。
    4> 723个记录:等价类2的成员。
    5> 16382个记录:临近边界值。
    6> 16383个记录:边界值。
    7> 16384个记录:等价类3的成员,临近边界值。

            等价测试的过程概括如下:
    对于输入和输出规格说明
    对于每个范围(L,U):
    选择5个测试用例:小于L,等于L,比L大但比U小,等于U以及大于U。
    对于每个集合S:
    选择2个测试用例:一个S的元素和一个非S的元素。
    对于每个精确值P:
    选择2个测试用例:P和其他任何值。

    2. 功能测试
            一个可选的黑盒测试形式是根据模块的功能选择测试数据。在功能测试中,要区别每个功能项或在模块中实现的功能。

    玻璃盒单元测试技术:
            在玻璃盒测试技术中,基于代码的检查,而不是规格说明的检查来选择测试用例。有一些不同形式的玻璃盒测试,包括语句,分支以及路径覆盖。

    1. 结构测试:语句,分支和路径覆盖
            最简单形式的玻璃盒测试是语句覆盖,即运行一系列测试用例,在运行期间每个语句最少执行一次。这个方法的缺点是不能保证对分支的所有输出都充分地测试。
            语句覆盖的一个改进是分支覆盖,即运行一系列,确保所有的分支最少测试一次。
            像语句或分支覆盖的技术成为结构测试。
            功能最强大的结构测试的形式是路径覆盖,即测试所有的路径。

    2. 复杂性度量
            质量保证观点提供另一个玻璃盒单元测试的方法。假定一个管理者被告知代码模块m1比代码模块m2更复杂,且不管术语复杂是如何准确定义的,管理者直觉上相信m1可能比m2有更多的错误。沿着这条思路,计算机科学家已经开发出一些软件复杂性度量,以帮助确定哪个代码模块更可能有错误。如果发现一个代码模块的复杂度不合理的高,管理者可能直接要求对它重新设计和重新实现,与试图调试一个有错的代码模块相比,可能从头开始的代价更小,速度更快。

  • 黑盒测试比白盒测试更难,技术要求更高?(转)

    2009-03-02 11:01:02

    黑盒测试比白盒测试更难,技术要求更高?

    转载出自51Testing论坛cleverman发表的主贴,转载请保留作者及出处。

    进入论坛讨论此话题:http://bbs.51testing.com/thread-132717-1-1.html

      几个月前我还在谈论黑盒测试不一定比白盒测试技术含量低,现在我却可以比较肯定地说,黑盒测试比白盒测试更难,技术要求更高。道理其实非常简单,黑盒,白盒测试的本质区别在于源代码的访问权利,白盒测试具有这种权利,因此也就具有更多的资源和信息进行测试,当然事情就会变得容易很多,而黑盒测试由于不能看到源代码,就使得对于白盒测试人员发现的bug,你要花更多的时间,并且具有更高的技术才有可能发现。

      我做黑盒测试已经4年多了,是一个地地道道的黑盒测试人员,可是我具有源代码访问的权利,也就是说,虽然我是做黑盒测试的,但是我所拥有的信息并不比白盒测试人员少。随着我黑盒测试经验和技术的提高,我突然发现我已经完全依赖与源代码提供的信息了,如果没有源代码,我的黑盒测试的工作将会变得复杂很多,困难很多,甚者无法实现。这也让我有了一个强烈的感觉,就是黑盒测试比白盒测试更难。

      在Symantec出版的一本书《TheArtofSoftwareSecurityTest》里边就有这个说法。这本书我觉得一般般,但是里边体现着这个道理,就是,“对于白盒测试,一个公司可以组成一个测试队伍来进行,而对于黑盒测试,可能就很少有公司有这个能力了,只能去外边聘请专业的公司来作,这个成本是很高的,但是是值得的”。

      经常听到有人抱怨“我在公司是做黑盒测试的,没什么技术含量,我的目标就是转到白盒测试”,我一直觉得这个说法是可以质疑的,也希望看了我的这篇文章以后,不要再出现这种声音,更不要再拿它当成自己不去提高测试技术的一个冠冕堂皇的借口了。

      为什么我们大多数人,包括以前我自己都会认为黑盒测试比白盒测试的技术含量低呢?那是因为,我们绝大多数人都是在做低端黑盒测试的。很早以前我就曾想过,黑客都是通过黑盒测试的方法来寻找安全漏洞的,我们怎么能说黑盒测试技术含量低呢?随着自己的水平向黑客的方向接近,自己也越来越有更深,更丰富的理解和体会了。

      如果我们把刚进入黑盒测试领域的新人的技术打分为0,而黑客的技术打分为5的话,那么根据技术水平我有这样一个列表:

      0.测试新手

      1.黑盒手工测试

      2.黑盒自动化测试

      3.具有白盒测试能力

      4.安全测试

      5.黑客

      大家注意,很多人把自己的测试技术的提高依赖于公司,依赖于team,依赖于project,这是不对的。我本人在公司的工作内容不过就是黑盒自动化测试,可是这并不影响我可以向更高的方向发展,现在internet这么发达,什么资料不能找到呢?各种各样的计算机书籍,网上各种各样的计算机技术交流探讨的论坛,博客等等。很多人觉得跳槽,换个工作自己就能更好的发展测试技术,这也是有误区的。说句实话,个人发展本质上还是个人的问题,并不是公司的问题,或者你的lead,你的manager的问题,一个公司既然要你了,就说明你自己的能力和水平跟公司对你的要求还是比较接近的,公司对你已经有一个期望值了,也就是说你能胜任这份工作了,而再往上的发展并不属于公司对你的期望了,绝大多数的情况还是要靠个人的。因此,我个人认为,无论在任何的工作环境,工作内容的情况,你都是有技术提高余地的,但是这事情要由你自己来drive,而不要太多地依赖外部环境。我从小到大的学习,主要是靠自学,我很少能集中精力地去听完老师的一堂课。包括现在,我很多training都是没听完就走人了,或者有些签个到就溜。我的这个性格造就了我很独立的学习能力,自己为自己规划学习,不知道对大家是否有借鉴作用。

      话说回来,因为大家对0,1,2级别应该都是比较熟悉的,我想谈谈3,4,5级别。

      3.作为一个黑盒测试人员,没有人会要求你不具备白盒测试能力,如果你有源代码访问的权利,那很好,你完全可以利用这个优势,把通过查看源代码得到的信息应用到你的黑盒测试中去。如果你没有源代码访问的能力,这也并不能阻碍你在这个领域进行探索和实践。如果你的项目是Java,.NET这种,你可以反编译,如果你的项目是C,C++这种,你可以反汇编。总而言之,所谓具有白盒测试能力的意思是,发现一个bug能够定位到代码里,是什么代码,为什么产生这个bug?可以进行代码级的测试用例的设计。一般来说,这个级别的要求是具备良好的代码读写的能力。

      4.安全测试与白盒测试的根本区别在于安全意识,黑客的思维。有一本书《WritingSecureCode》里面提到“你可以培训一个人具有测试安全feature的能力,你很难培训一个人具有黑客的思维方式,如果你发现了这样一个人,你就Hire他”。在这个级别的人要具有良好的安全意识,知道各种各样的攻击方式,当发现一个bug的时候要就有安全方面的判断,比如“是否一个安全漏洞”,“是否能够被黑客利用”,“严重程度如何”,等等。同样,自己的测试内容里要包含大量的安全测试用例。

      5.黑客级别要求就更高了。对于安全测试来说,只是分析到“是否能够被黑客利用”,而黑客就要分析“如何利用”以及写出攻击代码进行攻击。至少对我而言,他们要具备非常熟练的汇编编程能力。

      以前我认为,要想进行安全测试,或者说做高端测试,多年的开发经验必不可少,实践证明也未必。同理,要想进行高端测试,你也未必要先转向白盒测试。从我个人的经历来说,只要你自己有心,只要你自己用心,你总能发展和提高的,外部环境固然重要,但是起决定因素的还是自己。安全测试完全不属于我的工作内容与职责,可是在一个月的时间里,我已经连续发现4个安全漏洞了。如果你在工作中也能够发现你项目的安全漏洞,公司还能如何不重视你?

  • 白盒测试方法(pdf文档)

    2009-03-02 10:56:12

    白盒测试方法(pdf)

    http://www.51testing.com/html/24/n-8524.html

    实施白盒测试的几个误区

    http://www.51testing.com/html/70/n-64370.html

    如何选择嵌入式白盒测试工具

    http://www.51testing.com/html/77/n-64377.html

    白盒测试

    http://www.51testing.com/html/14/n-64914.html

    白盒测试缺陷报告

    http://www.51testing.com/html/86/n-73586.html

     

     

     

  • “白盒”静动测试两齐全(转)

    2009-03-02 10:53:58

    “白盒”静动测试两齐全

       在通常情况下,嵌入式软件测试一般采取黑盒测试与白盒测试相结合的方法。其中,白盒测试一般分为静态测试与动态测试。静态测试不实际运行软件,主要是对软件的编程格式、结构等方面进行评估,而动态测试需要在Host环境或Target环境中实际运行软件,并使用设计的测试用例去探测软件漏洞。
      静态测试
      静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
      代码检查 代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。
      在实际使用中,代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计和编码缺陷;代码检查看到的是问题本身而非征兆。但是代码检查非常耗费时间,而且代码检查需要知识和经验的积累。代码检查应在编译和动态测试之前进行,在检查前,应准备好需求描述文档、程序设计文档、程序的源代码清单、代码编码标准和代码缺陷检查表等。
      静态结构分析 静态结构分析主要是以图形的方式表现程序的内部结构,例如函数调用关系图、函数内部控制流图。其中,函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系;控制流图显示一个函数的逻辑结构,它由许多节点组成,一个节点代表一条语句或数条语句,连接结点的叫边,边表示节点间的控制流向。
      代码质量度量 ISO/IEC 9126国际标准所定义的软件质量包括六个方面:功能性、可靠性、易用性、效率、可维护性和可移植性。软件的质量是软件属性的各种标准度量的组合。
      针对软件的可维护性,目前业界主要存在三种度量参数:Line复杂度、Halstead复杂度和McCabe复杂度。其中Line复杂度以代码的行数作为计算的基准。Halstead以程序中使用到的运算符与运算元数量作为计数目标(直接测量指标),然后可以据以计算出程序容量、工作量等。McCabe复杂度一般称为圈复杂度(Cyclomatic complexity),它将软件的流程图转化为有向图,然后以图论来衡量软件的质量。McCabe复杂度包括圈复杂度、基本复杂度、模块设计复杂度、设计复杂度和集成复杂度。
      动态测试
      动态测试包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。
      功能确认与接口测试 这部分的测试包括各个单元功能的正确执行、单元间的接口,包括:单元接口、局部数据结构、重要的执行路径、错误处理的路径和影响上述几点的边界条件等内容。
      覆盖率分析 覆盖率分析主要对代码的执行路径覆盖范围进行评估,语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、修正条件/判定覆盖、基本路径覆盖都是从不同要求出发,为设计测试用例提出依据的。
      性能分析 代码运行缓慢是开发过程中一个重要问题。一个应用程序运行速度较慢,程序员不容易找到是在哪里出现了问题?如果不能解决应用程序的性能问题,将降低并极大地影响应用程序的质量,于是查找和修改性能瓶颈成为调整整个代码性能的关键。目前性能分析工具大致分为纯软件的测试工具、纯硬件的测试工具(如逻辑分析仪和仿真器等)和软硬件结合的测试工具三类。
      内存分析 内存泄漏会导致系统运行的崩溃,尤其对于嵌入式系统这种资源比较匮乏、应用非常广泛,而且往往又处于重要部位的,将可能导致无法预料的重大损失。通过测量内存使用情况,我们可以了解程序内存分配的真实情况,发现对内存的不正常使用,在问题出现前发现征兆,在系统崩溃前发现内存泄露错误;发现内存分配错误,并精确显示发生错误时的上下文情况,指出发生错误的原由。
      连接方式
      在嵌入式软件测试中,测试系统Host与被测试系统Target的连接有两种方式:直接连接和通过仿真器连接。直接连接是Host与Target通过串口、并口或网口直接连接。
      白盒测试
      部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
      “白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序;第二,穷举路径测试不可能查出程序中因遗漏路径而出错;第三,穷举路径测试可能发现不了一些与数据相关的错误。
      注意:
      由于白盒测试则只根据程序的内部结构进行测试,而不考虑外部特性,如果程序结构本身有问题,比如说程序逻辑有错误或是有遗漏,那是无法发现的。

  • 如何挑选白盒测试工具(转)

    2009-03-02 10:51:44

    如何挑选白盒测试工具

    白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、
    工业控制软件等等。白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、
    嵌入式软件的测试、测试的可视化等。

      对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析
    与语法分析、静态错误分析、动态检测等。但是对于不同的开发语言,测试工具实现的方式和
    内容差别是较大的。目前测试工具主要支持的开发语言包括:标准C、C++、Visual C++、
    Java、Visual J++等。

      代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖
    标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆
    盖。

      ·语句覆盖 为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆
    盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执
    行一次。语句覆盖是很弱的逻辑覆盖。

      ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的
    含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,
    或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为
    分支覆盖。

      ·条件覆盖 在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻
    底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:
    构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。

      ·多条件覆盖 多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得
    每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足
    判定覆盖、条件覆盖和条件判定组合覆盖的。

      ·修正条件判定覆盖 修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制
    定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这
    个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两
    个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定
    到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、
    or)连接的布尔条件,每个条件对于判定的结果值是独立的。

      不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试
    工具价格是极其昂贵的。

      嵌入式软件的测试:对于嵌入式软件的测试,我们还需要一方面进一步考虑测试工具对于
    嵌入式操作系统的支持能力,例如DOS、Vxworks、Neculeus、Linux和Windows CE等;另一方
    面还需要考虑测试工具对于硬件平台的支持能力,包括是否支持所有64/32/16位CPU 和 MCU,
    是否可以支持 PCI/VME/CPCI 总线。

      测试的可视化:白盒测试是工作量巨大并且枯燥的工作,可视化的设计对于测试来说是十
    分重要的。在选购白盒测试工具时,应当考虑该款测试工具的可视化是否良好,例如:测试过
    程中是否可以显示覆盖率的函数分布图和上升趋势图,是否使用不同的颜色区分已执行和未执
    行的代码段显示分配内存情况实时图表等,这些对于测试效率和测试质量的提高是具有很大的
    作用的。 (B6)

      用户观点

      为了更直接地了解IT测试的应用情况,记者在2005年IT测试技术研讨会的现场采访了9名
    与会人员,而他们对IT测试的看法可以分为三类。

      第一类:有想法,要多了解信息

      这种想法在很多中小企业中存在,他们已经意识到了IT测试的重要性,但是限于各种条
    件,现在还处于收集信息的阶段。部分用户代表希望有价格便宜的第三方测试机构来帮助自己
    进行测试。

      北京青云航空仪表公司 黄迪生

      我们目前比较需要网络测试和软件测试的设备。但因为此前对测试技术和产品不太熟悉,
    目前更多地是想了解一下最新的技术和产品。我们希望厂商能有一些具体的演示和应用案例。

      北京京能热点股份有限公司信息中心 夏骥

      在此前的IT项目中,我们还没有使用过专门的测试工具软件和设备。但我们对新的测试工
    具软件和设备比较感兴趣,目前我们正在做网络改造,所以想先了解一下这方面的产品和技
    术。

      某小型软件企业创始人

      公司目前的产品主要面向交通行业,例如公交系统的控制方面。公司自己成立了专门的软
    件测试部门,以对产品进行测试。目前,还没有把产品进行外包测试的想法。

      北京图易得系统工程技术有限公司总经理 叶涛

      我们公司所开发的软件产品主要面向畜牧业、农业等行业的信息化建设。目前,由于应用
    到项目的程序并不是特别庞大,所以相应的软件产品的规模也有一定的限度,在这种情况下软
    件测试主要还是由自己进行。公司组建了专门的测试部以进行测试。

      对于软件产品的测试,我们也非常重视,只不过由于规模问题,我们还没有达到更进一步
    的测试需求。

      中国五矿化工进出口商会信息部副主任 刘京娴

      我们作为直接的产品使用者考虑,成本是一个很重要的因素。实际我们最近希望能够进行
    网络测试,因为我们现在常常遇到网络故障,但又找不到原因。如果以后有专业的第三方测试
    提供价格合理的测试项目,我们会考虑选用。

      第二类:使用过工具,但是价格等因素限制了进一步使用

      这类用户基本都是一些专业的IT公司,他们对测试工具有明显的渴求,但是现在的条件限
    制了应用。

      中科辅龙计算机技术有限公司技术管理部经理 林志丹

      我们用过一些网络测试和软件测试的工具软件,有一些感觉。网络测试和软件测试都是工
    具软件,它们面临同样的问题,就是专业性强,用户少,而厂商为了盈利就不得不将价格定得
    较高;其次是这类软件大多比较难以上手,需要专门的培训,但这样的培训却往往不是免费
    的。例如Rational相信就不是人人都用得起,用得好。业界是否可以采用一些新思路,将这类
    工具软件采用服务或者租借的形式向用户提供呢?

      长城软件系统集成公司许哲源

      我们平时所做的测试基本上都是功能测试。20个人以下的可以从网上免费下载。

      在开发成本可以承受的情况下,项目团队当然愿意选择性价比高的测试工具。

      第三类:对测试非常了解,同时经常使用IT测试工具

      这些用户每年都会投入一定的费用用于产品运维和新产品购买,他们对于IT测试的认识也
    是最为深入的。

      点击科技产品测试部部长 陶锋

      让测试工具发挥作用的关键在于人,这里一个团队的领导至关重要,而项目中每个人的水
    平也决定了测试工具能否真正发挥作用。例如IBM的测试工具,要想使用起来,要求每个成员
    至少有两年的使用经验。这对人员专业技能的要求很高。在测试阶段发现错误可以让这个软件
    更加健壮。

      选择第三方咨询机构,可以避免客户对开发方的测试报告产生质疑。从某种程度上讲,第
    三方咨询的介入保证了软件开发能够公正客观顺利地进行。理想的状态是测试贯穿整个项目开
    发过程.只有这样才能真正让测试成为提高软件质量的利器。

      总之,工欲善其事,必先利其器。好的开发工具可以让软件开发事半功倍,好的测试工具
    可以起到同样的效果。

      北京信息安全测评中心测试实验室主任助理 刘海峰

      我们作为第三方测试机构,主要提供信息安全方面的测试,平时主要使用的都是网络测试
    工具,软件测试接触不太多。我们每年都会有专门的费用用于工具的运维,同时也会购买一些
    需要的新产品。

      我们单位2000年成立,主要面向北京市的党政机关服务,去年正式进入市场,在这几年明
    显能够感觉到市场在慢慢增长。同时由于政府的法律法规以及一些项目实施流程,让大家意识
    到测试的重要性,逐渐为测试拨出专项的费用。

     

  • 白盒测试-《软件测试艺术》读书笔记(17)(转)

    2009-03-02 10:49:23

    白盒测试-《软件测试艺术》

    先谈及、概括一下白盒测试
      

      白盒测试,所关注的是:测试用例执行的程度或覆盖程序逻辑结构(源代码)的程度。因此,也可以认为是逻辑覆盖测试。具体方法有五个,按其逻辑覆盖的从弱到强依次列出:
     
      • 语句覆盖(面): 将程序中的每条语句至少执行一次,但实现不太可能,该准则有很大的不足,以至于它通常没有什么用处
      • 判定/分支覆盖(线): 必须编写足够的测试用例,使得每一个判断都至少有一个为真和为假的输出结果。即:每条分支路径都必须至少遍历一次。换句话说:所有判断的每个可能结果都至少执行一次,以及将程序或子程序的每个入口点都至少执行一次。需要指出的是:该准则满足语言覆盖准则。
      • 条件覆盖(点):  编写足够的测试用例以确保将一个判断中的每个条件的所有可能的结果至少执行一次。
      • 判定/条件覆盖(点线结合): 设计出足够的测试用例,将一个判断中的每个条件的所有可能结果至少执行一次,将每个判断的所有可能结果至少执行一次,将每个入口点都至少调用一次。需明确一点,该准则有一个极大的缺点:尽管看上去所有条件的所有结果似乎都执行到了,但由于某些特定的条件会屏蔽掉其他的条件,通常并不能全部都执行到。例如:该准则并不一定会发现逻辑表达式中的错误(与、或)。  
      • 多重条件覆盖(点线组合):
          编写足够多的测试用例,将每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。需要说明的是,满足多重条件覆盖准则的测试用例集,同样满足判定覆盖准则、条件覆盖准则以及判定/条件覆盖准则。需明确的是:在存在循环的情况下,多重条件覆盖准则所需要的测试用例的数量通常会远远小于其路径的数量。
      文尾,作者小结了一下。
      • 包含每个判断只存在一种条件的程序,最简单的测试准则就是:设计出足够数量的测试用例,将每个判断的所有结果都至少执行一次;将所有的程序入口都至少调用一次,以确保全部的语句都至少执行一次。
      • 包含多重条件判断的程序,最简单的测试准则是:设计出足够数量的测试用例,将每个判断的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。
  • 白盒测试中的六种覆盖方法(转)

    2009-03-02 10:39:52

    白盒测试中的六种覆盖方法

    摘要:白盒测试作为测试人员常用的一种测试方法,越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的测试对象,使用适合的方法进行测试。因为对于不同复杂度的代码逻辑,可以衍生出许多种执行路径,只有适当的测试方法,才能帮助我们从代码的迷雾森林中找到正确的方向。本文介绍六种白盒子测试方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

    白盒测试的概述

      由于逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。由于我们经常相信某逻辑路径不可能被执行, 而事实上,它可能在正常的情况下被执行。由于代码中的笔误是随机且无法杜绝的,因此我们要进行白盒测试。

      白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。

      白盒的测试用例需要做到:

    ·保证一个模块中的所有独立路径至少 被使用一次
    ·对所有逻辑值均需测试 true 和 false
    ·在上下边界及可操作范围内运行所有循环
    ·检查内部数据结构以确保其有效性

      白盒测试的目的:通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。

      白盒测试的特点:依据软件设计说明书进行测试、对程序内部细节的严密检验、针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。

      白盒测试的实施步骤:

    1.测试计划阶段:根据需求说明书,制定测试进度。
    2.测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。
    3.测试执行阶段:输入测试用例,得到测试结果。
    4.测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。

      白盒测试的方法:总体上分为静态方法和动态方法两大类。

      静态分析是一种不通过执行程序而进行测试的技术。静态分析的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。

      动态分析的主要特点是当软件系统在模拟的或真实的环境中执行之前、之中和之后 , 对软件系统行为的分析。动态分析包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。在动态分析技术中,最重要的技术是路径和分支测试。下面要介绍的六种覆盖测试方法属于动态分析方法。

      白盒测试的优缺点

      1. 优点

    ·迫使测试人员去仔细思考软件的实现
    ·可以检测代码中的每条分支和路径
    ·揭示隐藏在代码中的错误
    ·对代码的测试比较彻底
    ·最优化

      2. 缺点

    ·昂贵
    ·无法检测代码中遗漏的路径和数据敏感性错误
    ·不验证规格的正确性

    六种覆盖方法

      首先为了下文的举例描述方便,这里先给出一张程序流程图。(本文以1995年软件设计师考试的一道考试题目为例,图中红色字母代表程序执行路径)。

      1、语句覆盖

      1)主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。

      2)用例设计:(如果此时将A路径上的语句1—〉T去掉,那么用例如下)

       X  Y  路径
     1  50  50  OBDE
     2  90  70  OBCE

      3)优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。

      4)缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在本例中去掉了语句1—〉T去掉,那么就少了一条测试路径。在if结构中若源代码没有给出else后面的执行分支,那么语句覆盖测试就不会考虑这种情况。但是我们不能排除这种以外的分支不会被执行,而往往这种错误会经常出现。再如,在Do-While结构中,语句覆盖执行其中某一个条件分支。那么显然,语句覆盖对于多分支的逻辑运算是无法全面反映的,它只在乎运行一次,而不考虑其他情况。

      2、判定覆盖

      1)主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。

      2)用例设计:

       X  Y  路径
     1  90  90  OAE
     2  50  50  OBDE
     3  90  70  OBCE

      3)优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。

      4)缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

      3、条件覆盖

      1)主要特点:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。

      2)用例设计:

       X  Y  路径
     1  90  70 OBC
     2 40   OBD

      3)优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。

      4)缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

      4、判定/条件覆盖

      1)主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。

      2)用例设计:

       X  Y  路径
     1  90  90  OAE
     2  50  50  OBDE
     3  90  70  OBCE
     4  70  90  OBCE

      3)优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。

      4)缺点:判定/条件覆盖准则的缺点是未考虑条件的组合情况。

      5、组合覆盖

      1)主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

      2)用例设计:

       X  Y  路径
     1  90  90  OAE
     2  90  70  OBCE
     3  90  30  OBDE
     4  70  90  OBCE
     5  30  90  OBDE
     6  70  70  OBDE
     7  50  50  OBDE

      3)优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。

      4)缺点:线性地增加了测试用例的数量。

      6、路径覆盖

      1)主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。

      2)用例设计:

       X  Y  路径
     1  90  90  OAE
     2  50  50  OBDE
     3  90  70  OBCE
     4  70  90  OBCE

      3)优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。

      4)缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的,如:
      If  (!A)B++;
      If  (!A)D--;

      这两个语句实际只包括了2条执行路径,即A为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。

    总结

      白盒测试是一种被广泛使用的逻辑测试方法,是由程序内部逻辑驱动的一种单元测试方法。只有对程序内部十分了解才能进行适度有效的白盒测试。但是贯穿在程序内部的逻辑存在着不确定性和无穷性,尤其对于大规模复杂软件。因此我们不能穷举所有的逻辑路径,即使穷举也未必会带来好运(穷举不能查出程序逻辑规则错误,不能查出数据相关错误,不能查出程序遗漏的路径)。

      那么正确使用白盒测试,就要先从代码分析入手,根据不同的代码逻辑规则、语句执行情况,选用适合的覆盖方法。任何一个高效的测试用例,都是针对具体测试场景的。逻辑测试不是片面的测试正确的结果或是测试错误的结果,而是尽可能全面地覆盖每一个逻辑路径。

  • 白盒测试及如何挑选白盒测试工具(转)

    2009-03-02 10:25:18

    白盒测试
    {L&G,F:e _&r-h G85282

    I$g*~mOk^y85282
    -m*EMR F*a)Ifw85282
    Z&\b$` bV;n8O1v85282      白盒测试(White-box Testing,又称逻辑驱动测试,结构测试)是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试又称为结构测试和逻辑驱动测试。51Testing软件测试网Q\ Daya
    51Testing软件测试网O"S5VwK0S&F;x
          白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。51Testing软件测试网1x(@4GS8^u;u

    "y B/LYU]?85282      六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。51Testing软件测试网Gq(s&M|{1K-CcY

    ~|7sk/GU0e+^x85282  白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
    z l|(cTEO85282
    ,[;lJ?A n2d#DL$v#U85282  "白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。51Testing软件测试网!K{YzHgxk)j

    o`0hs/n)j/v85282如何挑选白盒测试工具
    4h1o`1ti3Q W"r"V[85282 51Testing软件测试网[ [s~I z-T(f Ck
          白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、工业控制软件等等。白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、嵌入式软件的测试、测试的可视化等。51Testing软件测试网!GJ6I l U tf7L

    pz2q Z t? o85282  对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析与语法分析、静态错误分析、动态检测等。但是对于不同的开发语言,测试工具实现的方式和内容差别是较大的。目前测试工具主要支持的开发语言包括:标准C、C++、 Visual C++、Java、Visual J++等。
    Wg~Z1d9k)c1{1U8528251Testing软件测试网 zN+`0I(GH2\1?;`
      代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆盖。
    V{n-_6v85282
    )U_W2g k\N4H'E85282  ·语句覆盖 为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执行一次。语句覆盖是很弱的逻辑覆盖。
    pG~-u(B"mdn6V85282
    2L g)N0iEX b w85282  ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或者说使得程序中的每一个取“真”分支和取“假”分支至少经历一次,因此判定覆盖又称为分支覆盖。51Testing软件测试网1?Vn;V#q2E
    51Testing软件测试网Cc5Q-u5q
      ·条件覆盖 在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
    'B5IP ^3_L8528251Testing软件测试网qli?b6S
      ·多条件覆盖 多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖的。51Testing软件测试网c}l7}9E N1e

    $wi-^,I[5`+@*J.X85282  ·修正条件判定覆盖 修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制定的“航空运输和装备系统软件认证标准”,目前在国外的国防、航空航天领域应用广泛。这个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、or)连接的布尔条件,每个条件对于判定的结果值是独立的。
    Q ])e8HS-mNY85282
    $D G7jE'_~85282  不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试工具价格是极其昂贵的。
    .X%P0xxnEh8528251Testing软件测试网N'f#dY QDFFB
      嵌入式软件的测试:对于嵌入式软件的测试,我们还需要一方面进一步考虑测试工具对于嵌入式操作系统的支持能力,例如DOS、Vxworks、Neculeus、Linux和Windows CE等;另一方面还需要考虑测试工具对于硬件平台的支持能力,包括是否支持所有64/32/16位CPU 和 MCU,是否可以支持 PCI/VME/CPCI 总线。
    )GFpP$sXQ85282
    PD,Vby|N85282  测试的可视化:白盒测试是工作量巨大并且枯燥的工作,可视化的设计对于测试来说是十分重要的。在选购白盒测试工具时,应当考虑该款测试工具的可视化是否良好,例如:测试过程中是否可以显示覆盖率的函数分布图和上升趋势图,是否使用不同的颜色区分已执行和未执行的代码段显示分配内存情况实时图表等,这些对于测试效率和测试质量的提高是具有很大的作用的。

数据统计

  • 访问量: 10895
  • 日志数: 20
  • 建立时间: 2009-02-11
  • 更新时间: 2009-03-24

RSS订阅

Open Toolbar