JTest
Jtest实现了自动化的解决方案,排除了Java开发人员技术应用上的障碍,使得开发人员能够顺利地采用这些技术。
Jtest的测试生成系统专利技术,开发人员提供了一种省时有效的白盒测试方法。Jtest通过自动生成和执行能够全面测试类代码的测试用例,使白盒测试完全自动化。Jtest使用一个符号化的虚拟机执行类,并搜寻未捕获的运行时异常。对于检测到的每个未捕获的运行时异常,Jtest报告一个错误,并提供导致错误的栈轨迹和调用序列。Jtest的先进技术保证它能够自动测试类的所有代码分支,从而彻底检查被测类的结构。
换句话说,Jtest自动生成高质量的测试用例集合,发现尽可能多的结构性错误,而且:
不需要用户写一点测试脚本语言或测试用例。
不需要用户写测试驱动程序。
不修改源代码。
不要求完整的应用。
Jtest报告下列未捕获的运行时异常:
行为错误的方法:这些方法对于某些特定输入不会产生异常。必须修改这些代码。
非预期参数:这一问题出现在当某方法遇到非预期的输入(不知任何处理)而产生一个异常。这些问题的修正可以通过检查输入并产生一个IllegalArgumentException
(IAE)(假如该输入是非法的)。改正这类问题可以使代码更清晰更易维护。
行为正确的方法:这时,方法的正确输出是产生一个异常。在这种情形下,建议开发人员修改代码,将这类异常的产生置于方法的throw子句中。这会得到更清晰的代码并易于维护。
为开发人员使用的方法:在这种情况下,这些方法"不被假设"成处理Jtest生成的输入,开发人员是这些方法的唯一使用者,并且不传递这些输入参数。最好的办法是修改这些代码,让它产生一个IAE.这将带来额外的好处,使代码更易阅读。
总之,通过执行自动白盒测试,并提示上述类型的问题,Jtest能够为开发人员节省大量的时间并防止了错误。由于能够自动执行白盒测试的各个步骤,Jtest对开发人员来说是非常实用的,为了保证质量可以经常执行这一综合性测试。更进一步,使用测试生成系统技术产生的测试输入,Jtest使得白盒测试比手工测试更精确更有效。
白盒(构造)测试验证对一个类的非预期输入不会导致程序的崩溃。为执行白盒测试,您需要设计和执行根据类的内部结构编写的测试输入,检查是否存在会导致类运行失败的任何可能的对类的使用,以及是否存在某些编程缺陷可能会导致代码更容易出错。白盒测试能否成功的关键取决于测试输入的能力,是否能够尽可能全面地覆盖类的方法,并找出引起未捕捉到的运行时异常的输入。
尽可能早的防止和检测构造问题对Java软件开发来说更为关键。在大多数语言(如C和C++)中,一个非法程序操作常常导致程序的突然中断。Java相对来说提供了一种非常简单的机制来捕获运行时出现的异常并让程序继续运行,这种机制的设计可以简化对系统和其它服务调用的处理。另一方面,一个非法操作引起运行时异常确实指出了程序中的一个错误。捕捉它们并让程序继续运行通常比C++中的突然中断更有问题。带有问题的程序将继续运行是乎好象没有问题出现过,但极有可能进入一种矛盾状态,并产生不准确的结果或破坏它所存取的资源。
虽然白盒测试是保证类和应用质量的一个关键步骤,但手工执行的难度通常会使开发人员望而却步或草草了事。有效地执行白盒测试需要我们能够确定要完全检查被测类那些测试用例是必需的,这对于手工测试来说是太难了。目前的研究表明,典型的公司只测试了其开发的30%的代码,而其余的70%从来没有被测过。一个原因是编写能够测试很少执行的路径或极端的条件的测试用例很困难。例如,一个典型的1万行代码大约有1亿条可能的路径;手工编写能够执行所有路径的测试输入是不可行的或者说几乎是不可能的。
Jtest使用独特的技术完全自动化白盒测试过程。Jtest分析每个被测类的内部结构,自动设计和执行能够完全测试类的结构的测试用例,然后确定每个测试输入是否会产生一个未捕获的运行时异常。对于检测到的每个异常报告一个错误信息并提供一个导致错误的栈轨迹和调用序列。
Jtest分析该类,然后生成大量的根据非预期输入设计的测试用例,并执行。Jtest自动生成的测试用例发现了下列没有捕获的运行时异常。
Jtest能够对任何Java类或部件进行白盒测试,包括那些引用外部资源(如外部文件、数据库、EJB和CORBA)的类。如果您正在测试一些引用外部资源的类,Jtest将自动生成必要的桩函数,或者您可以选择直接调用实际的外部方法或您自己的桩函数。对使用CORBA的类,Jtest提供ORB和其它引用对象的桩函数。对使用EJB的类,Jtest调用Bean初始化程序并提供一个模拟的容器,然后执行白盒测试,保证这些类能够恰当地执行。
您可以根据自己的需要剪裁Jtest的错误报告。如果您对代码中一些正当的异常情况使用了特定的@exception注释标记,Jtest将屏蔽它们。如果您使用了特定的@pre注释标记为有效的方法输入说明允许的范围,Jtest将屏蔽掉落在该范围之外的输入所发现的错误。您还可以使用快捷菜单或禁用配置面板屏蔽异常情况。
黑盒测试
使用Jtest进行黑盒测试比使用任何其它工具更简单(也更有效)。Jtest的专利技术通过分析类的字节码自动生成一组核心输入;这些输入经过精心设计能够达到尽可能高的代码覆盖。由于自动生成的输入的设计目标是覆盖类的方法,而非验证其定义,因此用户可能需要增加自己的测试用例。(这一点是可以理解的,自动技术是针对语法的,机器并不能理解人的真正意图。)
用户定义的输入可以直接添加到树形表示的测试用例中,其中节点代表方法的每个参数或者能够存贮在全局或局部存储库中的常量和方法;在这里,输入可以方便地加入到任何方法的参数中。当测试进行时,Jtest自动执行所有的输入并以简单的树形表示显示相应的输出。在以后的功能测试或回归测试测试中出现错误时,Jtest会自动通告用户。
由于Jtest自动生成了一组很棒的核心输入,大大减少了开发人员和测试人员需要建立的测试用例的数量,并且能够比手工设计覆盖程序中更多的代码——多快好省。
黑盒(功能性)测试检查一个类的行为是否符合其功能说明。为了执行黑盒测试,您需要建立一组输入/输出关系,它们能够测试是否准确实现了类的功能说明。对说明文档中的每一项至少需要有一个测试用例,最好这些测试用例还能测试每一项说明的各种边界条件。测试用例准备好后,您执行它们并验证是否产生了准确的结果。
如果您的类代码中含有按合同设计(DbC)格式的说明信息,Jtest能够完全自动化黑盒测试过程。如果没有,Jtest也能比手工做黑盒测试更容易更有效。
DbC是一种形式化方法,使用注解在代码中加入说明信息。基本上,使用一种描述软件合同的形式语言能够明确表达代码说明。这些合同说明了这样的需求:
在调用一个方法之前必须满足的条件(前置条件)。
在调用一个方法之后必须满足的条件(后置条件)。
在执行中的说明点必须满足的断言。
Jtest读取类代码中用DbC语言定义的说明信息,然后自动基于这些信息开发测试用例。Jtest设计按照下面的规则设计黑盒测试用例:
如果有后置条件,Jtest建立验证是否满足这些条件的测试用例。
如果有断言,Jtest建立试图使断言失败的测试用例。
如果有不变条件(即应用于类的所有方法),Jtest建立试图使不变条件失败的测试用例。
如果有前置条件,Jtest试图找到能够走通前置条件中所有路径的输入。
如果被测方法调用的其它方法中包含已说明的前置条件,Jtest确定被测方法是否能将不允许的值传递给其它方法。
如果发现非法的说明信息
关于Jtest如何自动建立和执行验证类功能性测试用例以及DbC说明如何帮助Jtest的黑盒测试的详细描述,参见"利用按合同设计方法自动化Java软件和部件测试".
如果您没有使用DbC,Jtest也能帮助您建立黑盒测试用例。您可以使用Jtest自动生成一组测试用例作为黑盒测试用例集合的基础,然后通过加入自己的测试用例扩展它们。
可以有多种加入测试用例的方法。例如:
- 直接在表示每个方法参数的树节点中键入方法的输入。
- 设置全局或局部的常量和方法,然后加入到任何方法参数。
- JUnit格式的测试类作为测试用例。
如果一个类引用外部资源,您可以进入自己的桩函数或让Jtest调用实际的外部方法。
当测试运行时,Jtest使用任何可以得到的桩函数,自动执行输入,并以树形表示显示对应这些输入的输出结果。然后您可以观察输出结果并验证。当说明和回归测试错误出现时,Jtest能够自动通报。
2.3.3 回归测试
执行准确的回归测试是保证软件质量和可靠性的另一必要步骤。回归测试即使用前面测试所用的同一组输入和测试参数测试修改过的代码,它是保证一个类在修改后不会引入新的错误或者检查是否成功地排除了错误的唯一途径。每次一个类被修改或用于一个新环境,都应该进行回归测试以保证类的完整性。
Jtest的回归测试使得您能够在类一级执行回归测试,这意味着您能够更早地运行测试用例以监测代码的完整性。Jtest完全自动执行回归测试有关的所有步骤。假使用户没有说明正确的输出,Jtest能够记忆前面的输出结果,并在每次测试时进行比较,当任何输出发生变化时报告一个错误。当然,如果用户指定正确的输出结果,在回归测试时Jtest使用这些值作为参考结果。为了使自动的回归测试尽可能快速准确,Jtest在测试一个或一组类时自动保存所有的测试输入和设置,然后将测试加入到Jtest的菜单选项中。其结果是,用户执行回归测试所需要的只是在测试菜单中选择一个合适的测试,然后按下开始按钮。您还可以将批处理模式的Jtest集成到夜间建立中,保证回归错误能够及时发现和纠正。
3. 编程标准执行
Jtest的编程标准可以分成以下几类:
- 未使用代码
- 初始化
- 面向对象编程
- 命名约定
- JAVADOC注释
- 移植性
- 优化
- 无用信息回收
- 线程和同步
- EJB
- 类指标
- 项目指标
- 国际化
- 安全
- Servlets
- 杂项
另外,Jtest包括一组编程标准帮助您使用DbC在代码中加入说明信息。详见"利用按合同设计自动化Java软件和部件测试".
每个Jtest编程标准有一个违规严重性程度的级别,最有可能引起错误的是1级,最弱的是5级。缺省设置下,Jtest报告1-3级违背编程标准的情况。您可以打开和关闭单个、一级或一类编程标准。这种定制能力使得Jtest能够更适合您的团队或项目,减少不必要的信息。
3.3 定制编程标准
您可以使用RuleWizard建立和执行定制的编程标准,以适应您的编程风格、开发队伍和整个项目。您在RuleWizard中用图示化表达模式设计和修改编程标准("规则")。建立规则只需点击鼠标,在类似流程图的表示中加入规则建立元件,然后用对话框作必要的修改。不需要有关语法分析的知识。在测试时,Jtest就象内建的编程标准一样对待定制标准。
例如,假如您发现您在if语句的条件中经常误用赋值等号(即应该写if (a==b)而写了if (a=b)),您可以建立一个编程标准"避免在if语句的条件中出现赋值等号".
通过提供一个好用而且适应性强的方法实现即使是最复杂和独特的Java编程标准,Jtest帮助您执行许多软件开发专家相信是最有效的软件质量保证方法:错误防止或预防。在编写代码时防止尽可能多的错误引入,不仅能够减少耗费在发现和纠正错误上的时间、工作和费用,还能极大地降低一些错误躲过测试的风险。
Jtest在静态分析时自动度量类和项目的有关指标。如果任何指标超出了预设的"合理"范围(您可以设置),Jtest将报告一个静态分析违规信息,这些信息将对违规做出解释并报告问题的准确位置,游戏您可以方便地决定需要简化那些代码以及如何改变。Jtest提供一个关于每个类和每个项目的所有指标的汇总报告。
另外,Jtest帮助您跨项目跟踪指标,保存每次测试的项目指标,并能够图示化地显示项目中下列指标的变化:
- 所有类文件的字节总数。
- 类的数目。
- Java源文件的数量。
- 类的代码总行数
- 包的数量。
- 私有类数量。
- 保护类数量。
- 公有类数量。
|