假设机制(Assumption)
理想情况下写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方但是有的时候这些导致测试用例不通过的地方并不是很容易的被发现可能隐藏得很深从而导致开发人员在写测试用例时很难预测到这些因素而且往往这些因素并不是开发人员当初设计测试用例时真正目的他们的测试点是希望测试出被测代码中别的出错地方
比如一个测试用例运行的 locale(如LocaleUS)与之前开发人员设计该测试用例时所设想的不同(如LocaleUK)这样会导致测试不通过但是这可能并不是开发人员之前设计测试用例时所设想的测试出来的有用的失败结果(测试点并不是此比如测试的真正目的是想判断函数的返回值是否为 true返回 false 则测试失败)这时开发人员可以通过编写一些额外的代码来消除这些影响(比如将 locale 作为参数传入到测试用例中每次运行测试用例时明确指定 locale)但是花费时间和精力来编写这些不是测试用例根本目的的额外代码其实是种浪费这时就可以使用 Assumption 假设机制来轻松达到额外代码的目的编写该测试用例时首先假设 locale 必须是 LocaleUK如果运行时 locale 是 LocaleUK则继续执行该测试用例函数如果是其它的 locale则跳过该测试用例函数执行该测试用例函数以外的代码这样就不会因为 locale 的问题导致测试出错
JUnit 结合 Hamcrest 库提供了 assumeThat 语句开发人员可以使用其配合匹配符 Matcher 设计所有的假设条件(语法和 assertThat 一样)同样为了方便使用JUnit 还专门提供了 assumeTrueassumeNotNull 和 assumeNoException 语句
假设机制(Assumption)的优点
优点 通过对 runtime 变量进行取值假设从而不会因为一个测试用例的不通过而导致整个测试失败而中断(the test passes)使得测试更加连贯
开发人员编写单元测试时经常会在一个测试中包含若干个测试用例函数这时若是遇到某个测试用例函数不通过整个单元测试就会终止这将导致测试不连贯因为开发人员往往希望一次能运行多个测试用例函数不通过的测试用例函数不要影响到剩下的测试用例函数的运行否则会给 debug 调试带来很大的难度
开发人员编写单元测试时有时是预测不了传入到单元测试方法中的变量值的而且这些值有时并不是开发人员所期望的因为他们会导致测试用例不通过并中断整个测试所以开发人员需要跳过这些导致测试用例函数不通过的异常情况
清单 假设机制优点 举例
//@Test 注释表明接下来的函数是 JUnit 及其以后版本的测试用例函数
@Test
public void testAssumptions() {
//假设进入testAssumptions时变量i的值为如果该假设不满足程序不会执行assumeThat后面的语句
assumeThat( i is() );
//如果之前的假设成立会打印assumption is true!到控制台否则直接调出执行下一个测试用例函数
Systemoutprintln( assumption is true! );
}
优点 利用假设可以控制某个测试用例的运行时间让其在自己期望的时候运行(run at a given time)
[] [] [] [] [] [] [] []