文通过理论分析和详细例子向读者阐述 JUnit 所带来的最新特性读者通过本文的学习可以轻松掌握使用 JUnit 的新特性
随着当前 Java 开发的越发成熟Agile 和 TDD 的越发流行自动化测试的呼声也越来越高若想将单元测试变得自动化自然 JUnit 这把利器必不可少这也是 JUnit 自 年诞生以来在 Java 开发业界一直相当流行的原因
JUnit 是针对 Java 语言的一个单元测试框架它被认为是迄今为止所开发的最重要的第三方 Java 库 JUnit 的优点是整个测试过程无需人的参与无需分析和判断最终测试结果是否正确而且可以很容易地一次性运行多个测试 JUnit 的出现促进了测试的盛行它使得 Java 代码更健壮更可靠Bug 比以前更少
JUnit 自从问世以来一直在不停的推出新版本目前最新的版本是 年 月发布的 JUnit 它是继 JUnit 以来最大的发行版提供了很多有用的新特性本文将假设读者已经具有 JUnit 的使用经验
JUnit 概述
JUnit 设计的目的就是有效地抓住编程人员写代码的意图然后快速检查他们的代码是否与他们的意图相匹配 JUnit 发展至今版本不停的翻新但是所有版本都一致致力于解决一个问题那就是如何发现编程人员的代码意图并且如何使得编程人员更加容易地表达他们的代码意图JUnit 也是为了如何能够更好的达到这个目的而出现的
JUnit 主要提供了以下三个大方面的新特性来更好的抓住编程人员的代码意图
提供了新的断言语法(Assertion syntax)——assertThat
提供了假设机制(Assumption)
提供了理论机制(Theory)
新的断言语法(Assertion syntax)—— assertThat
JUnit 学习 JMock引入了 Hamcrest 匹配机制使得程序员在编写单元测试的 assert 语句时可以具有更强的可读性而且也更加灵活
Hamcrest 是一个测试的框架它提供了一套通用的匹配符 Matcher灵活使用这些匹配符定义的规则程序员可以更加精确的表达自己的测试思想指定所想设定的测试条件比如有时候定义的测试数据范围太精确往往是若干个固定的确定值这时会导致测试非常脆弱因为接下来的测试数据只要稍稍有变化就可能导致测试失败(比如 assertEquals( x ) 只能判断 x 是否等于 如果 x 不等于 测试失败)有时候指定的测试数据范围又不够太精确这时有可能会造成某些本该会导致测试不通过的数据仍然会通过接下来的测试这样就会降低测试的价值 Hamcrest 的出现给程序员编写测试用例提供了一套规则和方法使用其可以更加精确的表达程序员所期望的测试的行为(具体 Hamcrest 的使用请参阅 参考资料)
JUnit 结合 Hamcrest 提供了一个全新的断言语法——assertThat程序员可以只使用 assertThat 一个断言语句结合 Hamcrest 提供的匹配符就可以表达全部的测试思想
assertThat 的基本语法如下
清单 assertThat 基本语法
assertThat( [value]
[matcher statement] );
value 是接下来想要测试的变量值 matcher statement 是使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明如果 value 值与 matcher statement 所表达的期望值相符则测试成功否则测试失败
assertThat 的优点
优点 以前 JUnit 提供了很多的 assertion 语句如assertEqualsassertNotSameassertFalseassertTrueassertNotNullassertNull 等现在有了 JUnit 一条 assertThat 即可以替代所有的 assertion 语句这样可以在所有的单元测试中只使用一个断言方法使得编写测试用例变得简单代码风格变得统一测试代码也更容易维护
优点 assertThat 使用了 Hamcrest 的 Matcher 匹配符用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件具有很强的易读性而且使用起来更加灵活如清单 所示
清单使用匹配符 Matcher 和不使用之间的比较
// 想判断某个字符串 s 是否含有子字符串
developer
或
Works
中间的一个
// JUnit 以前的版本assertTrue(sindexOf(developer)>||sindexOf(Works)> );
// JUnit
assertThat(s anyOf(containsString(developer) containsString(Works)));
// 匹配符 anyOf 表示任何一个条件满足则成立类似于逻辑或 || 匹配符 containsString 表示是否含有参数子
// 字符串文章接下来会对匹配符进行具体介绍
[] [] [] [] [] [] [] []