一、前言之假设
理想情况下,开发人员在编写测试用例时可以明确的知道所有导致他们所写的测试用例无法通过的地方。但有些我们不易察觉,因此无法预料到这些因素,而且通常这些因素并不是开发人员当初设计测试用例时的真实目的。
假设一个测试用例运行的local(如:Locale.US
)与之前开发人员设计该测试用例时所设想的不同(如:Locale.UK
),这样会导致测试无法通过,但是这可能并不是开发人员之前设计测试用例时所设想的测试出来的有用的失败结果(测试点并不是此,比如测试的真正目的是想判断函数的返回值是否为 true
,返回 false
则测试失败)。
我们可以编写一些额外的业务逻辑来避免上面的失败发生,但是花费时间和精力来编写这些不是测试用例根本目的的额外代码其实是种浪费。那么如何更好的解决此问题呢?那就是假设机制,我们在测试用例的开始假设传入的local是Locale.US
,这样当传入参数是Locale.US
则继续执行测试用例,否则直接跳过次测试用例。
二、Assume[假设]
JUnit为我们提供了 org.junit.Assume
工具类,为我们提供了多个假设方法,用于说明关于测试有意义条件的假设。失败的假设并不意味着代码被破坏,假设的基本意思是“如果这些条件不适用,就不要运行这个测试”。失败的假设通常不会被记录下来,因为可能有许多测试不适用于某些配置。
org.junit.Assume
所包含的静态方法:
- assumeFalse(boolean b) :与assumeTrue相反。
- assumeTrue(boolean b): 如果使用计算为false的表达式调用,则测试将停止并被忽略。
- assumeNoException(Throwable e) :如果Throwable
e
不是NULL,则尝试停止测试病忽略它。 - assumeNotNull(Object… objects) :如果
objects
中包含一个或多个null元素,则测试将停止并被忽略。 - assumeThat(T actual, Matcher matcher) :调用匹配器
matcher
来匹配是否与actual
相同。
注:这些方法都可选的添加第一个参数,说明其原因。
org.junit.Assume
是个工具类,我们通过静态导入import static org.junit.Assume.*;
可以更直观的使用。
@Test
public void filenameIncludesString(){
// 如果文件分隔符不是’/’(forward slash),则不执行assertThat断言测试,直接跳过该测试用例函数
assumeThat(File.separatorChar, is('/'));
// 判断文件名fileName是否含有字符串"developerWorks"
assertThat(fileName, containsString("developerWorks"));
}
@Test
public void filenameIncludesString() {
// bugFixed不是JUnit4.4的函数,是开发人员自己工程中定义的函数,表示判断指定的defect是否
// 被修正了,如果被修正,则返回true,否则返回false。这里假设缺陷13356被修正后才进行余下单元测试
assumeTrue(bugFixed("13356"));
// 判断文件名fileName是否含有字符串"developerWorks"
assertThat(fileName, containsString("developerWorks"));
}
注意:在@Before
或 @BeforeClass
方法中失败的假设等同于该类的测试方法都发生失败假设。
三、Theory[理论]
说明:此时的重点不在此,因此待后续深入!
官方文档:https://github.com/junit-team/junit4/wiki/Theories
后续可参考: