在Java 1.5之前,使用命名模式说明某些程序元素需要使用某种工具或框架进行特殊处理。 例如,在JUnit测试框架中,用户必须在测试方法名称的开头使用test。
命名模式的缺点:1.要使一个类的所有方法都没有由于字符拼写错误导致的失败、测试方法的执行和错误报告,请以test开始类,但JUnit支持类级别测试3 .没有提供将参数值与程序要素关联起来的好方法。
评论可以解决命名模式的问题。 以下定义注释类型指定的简单测试。 注释类型规范将自动执行,并且在抛出异常时失败。 请注意,以下Test注释是自定义的,而不是JUnit的实现。 )
导入Java .语言.注释. *;
@ retention (retention策略.运行时间)。
@ target (电子元素类型. method ) )。
公共@接口测试{
}
@ retention (retention policy.runtime )表示测试注释保留在运行时
@target(elementtype.method )表示Test注释只在方法宣言中是正当的
以下Sample类使用Test注释。 如果弄错了Test,或者将Test注释应用于方法以外的位置,将会导致、
编译失败
公共类样本
@ test公共静态语音m1 () )
}
公共静态语音m2 (
}
@ test公共静态语音m3 (() {
thrownewruntimeexception('boom );
}
公共静态语音M4 (
}
@ test公共语音M5 () {
}
公共静态语音M6 (
}
@ test公共静态语音M7 () {
thrownewruntimeexception (' crash );
}
公共静态语音M8 () {
}
}
测试Sample的测试执行类:
公共类运行状况
publicstaticvoidmain (string [ ] args )三级分类
int tests=0;
int passed=0;
类测试类=类.公式(ex _ 35 .示例);
for (methodm :测试类. getdeclaredmethods () ) ) )。
if (M .国际标准(测试类) )
tests;
特里
m .索引键(空值);
固定;
} catch (invocationtargetexceptionwrappedexc ) {
throwable exc=wrapped exc.get cause (;
system.out.println (出现故障的: ' exc );
缓存(执行) {
system.out.println (无价值@测试: ) m;
}
}
}
system.out.printf (已通过: % d,失败: % d % n ),已通过,已通过;
}
}
执行结果:
publicstaticvoidex _ 35.sample.m3 (故障: Java .语言.运行时执行: boom
invalid @ test :公共语音ex _ 35 .样本m5(
publicstaticvoidex _ 35.sample.M7 (故障: Java .语言.运行时执行:崩溃)
Passed: 1、Failed: 3对于只有在抛出特殊例外时才能成功的评论,做出了如下评论。
导入Java .语言.注释.元素类型;
导入Java .语言.注释.保留;
导入Java .语言.注释.保留策略;
导入Java .语言.注释.目标;
@ retention (retention策略.运行时间)。
@ target (电子元素类型. method ) )。
公共@接口执行测试{
克拉斯? 扩展表达式值(;
}
JUnit提供了完整的测试框架。 以下示例基于Junit4
需要测试的类:
公共类计算器{
私有静态结果; //保存静态变量、执行结果
公共语音添加(intn ) {
结果=结果n;
}
公共语音辅助(英寸) {
结果=结果- 1; //Bug:我认为正确的是result=result-n
}
公共语音复用(intn ) {
//这个方法还没有写出来
公共语音通道(intn ) {
结果=结果/n;
}
公共语音方形(intn ) {
结果=n * n;
}
公共库存管理系统(intn ) {
for (; ); //错误:死循环
}
公共语音清除() /将结果清零
结果=0;
}
公共获取结果
返回结果;
}
}
用于测试计算器类的测试类:
公共类计算器测试{
私有计算单元=新计算单元(;
@Before
公共语音设置() throws执行。
计算器. clear (;
}
@Test
公共语音测试
计算器.添加(2;
计算器.添加(3;
声明问题(5,计算结果.获取结果);
}
@Test
公共语音测试子系统(
计算器.添加(10;
计算子轨迹(2;
声明问题(8,计算结果.获取结果);
}
@ ignore (多重) ) Not yet implemented ) )。
@Test
公共语音测试复用
//失败(注解实施);
}
@Test
公共语音测试版
计算器.添加(8;
计算器. divide (2;
声明问题(4,计算结果.获取结果);
}
@test(timeout=1000 ) ) )。
公共语音方根
计算器. square根(4;
声明问题(2,计算结果.获取结果);
}
@ test (expected=数组表达式.类) )。
公共语音dividebyzero (
计算器. divide (0;
}
}
在联合测试中执行计算测试的结果:
请明确告诉我哪个测试错了。
除非是编写测试框架的程序员,否则不需要定义注释类型。 建议使用Java平台提供的预定义注释类型,以保证跨平台性。 另外,为了在测试过程中容易意外更改,请考虑使用静态分析工具,如IDE和Junit的图形界面。