频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

新版JUnit 4.0 抢先体验

来源:ibm 作者: 出处:巧巧读书 2006-10-12 进入讨论组
测试异常

  异常测试是 JUnit 4 中的最大改进。旧式的异常测试是在抛出异常的代码中放入 try 块,然后在 try 块的末尾加入一个 fail() 语句。例如,该方法测试被零除抛出一个 ArithmeticException:

public void testDivisionByZero() {
 try {
  int n = 2 / 0;
  fail("Divided by zero!");
 }
 catch (ArithmeticException success) {
  assertNotNull(success.getMessage());
 }
}

  该方法不仅难看,而且试图挑战代码覆盖工具,因为不管测试是通过还是失败,总有一些代码不被执行。在 JUnit 4 中,您现在可以编写抛出异常的代码,并使用注释来声明该异常是预期的:

@Test(expected=ArithmeticException.class)
public void divideByZero() { int n = 2 / 0;}
  
  如果该异常没有抛出(或者抛出了一个不同的异常),那么测试就将失败。但是如果您想要测试异常的详细消息或其他属性,则仍然需要使用旧式的 try-catch 样式。

  被忽略的测试

  也许您有一个测试运行的时间非常地长。不是说这个测试应该运行得更快,而是说它所做的工作从根本上比较复杂或缓慢。需要访问远程网络服务器的测试通 常都属于这一类。如果您不在做可能会中断该类测试的事情,那么您可能想要跳过运行时间长的测试方法,以缩短编译-测试-调试周期。或者也许是一个因为超出 您的控制范围的原因而失败的测试。例如,W3C XInclude 测试套件测试 Java 还不支持的一些 Unicode 编码的自动识别。不必老是被迫盯住那些红色波浪线,这类测试可以被注释为 @Ignore,如下所示:

// Java doesn't yet support
// the UTF-32BE and UTF32LE encodings @Ignore
public void testUTF32BE() throws ParsingException, IOException, XIncludeException {
 File input = new File( "data/xinclude/input/UTF32BE.xml" );
 Document doc = builder.build(input);
 Document result = XIncluder.resolve(doc);
 Document expectedResult = builder.build( new File(outputDir, "UTF32BE.xml") );
 assertEquals(expectedResult, result);
}
  
  测试运行程序将不运行这些测试,但是它会指出这些测试被跳过了。例如,当使用文本界面时,会输出一个“I”(代表 ignore),而不是为通过的测试输出所经历的时间,也不是为失败的测试输出“E”:

$ java -classpath .:junit.jar org.junit.runner.JUnitCore nu.xom.tests.XIncludeTestJUnit version 4.0rc1.....I..Time: 1.149OK (7 tests)

  但是一定要小心。最初编写这些测试可能有一定的原因。如果永远忽略这些测试,那么它们期望测试的代码可能会中断,并且这样的中断可能不能被检测到。忽略测试只是一个权宜之计,不是任何问题的真正解决方案

  时间测试

  测试性能是单元测试最为痛苦的方面之一。JUnit 4 没有完全解决这个问题,但是它对这个问题有所帮助。测试可以用一个超时参数来注释。如果测试运行的时间超过指定的毫秒数,则测试失败。例如,如果测试花费 超过半秒时间去查找以前设置的一个文档中的所有元素,那么该测试失败:

@Test(timeout=500)
public void retrieveAllElementsInDocument() {
 doc.query("//*");
}
  
  除了简单的基准测试之外,时间测试也对网络测试很有用。在一个测试试图连接到的远程主机或数据库宕机或变慢时,您可以忽略该测试,以便不阻塞所有其 他的测试。好的测试套件执行得足够快,以至程序员可以在每个测试发生重大变化之后运行这些测试,有可能一天运行几十次。设置一个超时使得这一点更加可行。 例如,如果解析 http://www.ibiblio.org/xml 花费了超过 2 秒,那么下面的测试就会超时:

@Test(timeout=2000)
public void remoteBaseRelativeResolutionWithDirectory()
 throws IOException, ParsingException {
  builder.build("http://www.ibiblio.org/xml");
}
  
  新的断言

  JUnit 4 为比较数组添加了两个 assert() 方法:

  public static void assertEquals(Object[] expected, Object[] actual)public static void assertEquals(String message, Object[] expected, Object[] actual)

  这两个方法以最直接的方式比较数组:如果数组长度相同,且每个对应的元素相同,则两个数组相等,否则不相等。数组为空的情况也作了考虑。

   巧巧读书:http://www.qqread.com/java/2006/10/a217988.html

进入讨论组讨论。
更多专题 【深 度 阅 读】 相 关 文 章
收藏此文】【 】【打印】【关闭
较早的文章:Hibernate二级缓存攻略

较新的文章:.NET vs Java
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章