一.假设机制(Assumption)概述
理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏得很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员当初设计测试用例时真正目的,他们的测试点是希望测试出被测代码中别的出错地方。
比如,一个测试用例运行的 locale(如:Locale.US)与之前开发人员设计该测试用例时所设想的不同(如:Locale.UK),这样会导致测试不通过,但是这可能并不是开发人员之前设计测试用例时所设想的测试出来的有用的失败结果(测试点并不是此,比如测试的真正目的是想判断函数的返回值是否为 true,返回 false 则测试失败),这时开发人员可以通过编写一些额外的代码来消除这些影响(比如将 locale 作为参数传入到测试用例中,每次运行测试用例时,明确指定 locale),但是花费时间和精力来编写这些不是测试用例根本目的的额外代码其实是种浪费,这时就可以使用 Assumption 假设机制来轻松达到额外代码的目的。编写该测试用例时,首先假设 locale 必须是 Locale.UK,如果运行时 locale 是 Locale.UK,则继续执行该测试用例函数,如果是其它的 locale,则跳过该测试用例函数,执行该测试用例函数以外的代码,这样就不会因为 locale 的问题导致测试出错。
JUnit 4.4 结合 Hamcrest 库提供了assumeThat 语句,开发人员可以使用其配合匹配符 Matcher 设计所有的假设条件(语法和 assertThat 一样)。同样为了方便使用,JUnit 4.4 还专门提供了assumeTrue,assumeNotNull 和assumeNoException 语句。
二.假设机制(Assumption)的优点
优点1:通过对 runtime 变量进行取值假设,从而不会因为一个测试用例的不通过而导致整个测试失败而中断(the test passes),使得测试更加连贯。
开发人员编写单元测试时,经常会在一个测试中包含若干个测试用例函数,这时若是遇到某个测试用例函数不通过,整个单元测试就会终止。这将导致测试不连贯,因为开发人员往往希望一次能运行多个测试用例函数,不通过的测试用例函数不要影响到剩下的测试用例函数的运行,否则会给 debug 调试带来很大的难度。
开发人员编写单元测试时,有时是预测不了传入到单元测试方法中的变量值的,而且这些值有时并不是开发人员所期望的,因为他们会导致测试用例不通过并中断整个测试,所以开发人员需要跳过这些导致测试用例函数不通过的异常情况。
如下所示假设机制优点1的实例:
//@Test 注释表明接下来的函数是 JUnit4 及其以后版本的测试用例函数 @Test public void testAssumptions() { //假设进入testAssumptions时,变量i的值为10,如果该假设不满足,程序不会执行assumeThat后面的语句 assumeThat( i, is(10) ); //如果之前的假设成立,会打印"assumption is true!"到控制台,否则直接调出,执行下一个测试用例函数 System.out.println( "assumption is true!" ); }
优点2:利用假设可以控制某个测试用例的运行时间,让其在自己期望的时候运行(run at a given time)。
如下所示假设机制优点2的实例:
@Test //测试用例函数veryLongTest()执行需要很长时间,所以开发人员不是每次都想运行它,可以通过判断是否定义了 //”DEV”环境变量来选择性地执行该测试用例 public void veryLongTest() throws Exception { //假设环境变量”DEV”为空,即如果之前通过System.setProperty定义过”DEV”环境变量(不为空),则自动跳过 //veryLongTest中假设后剩下的语句,去执行下一个JUnit测试用例,否则执行假设后接下来的语句 assumeThat( System.getProperty( "DEV" ), nullValue() ); System.out.println("running a long test"); Thread.sleep( 90 * 1000 ); }
三.如何使用 Assumption 假设机制
开发人员可以使用 assumeThat 并配合 hamcrest 的匹配符 Matcher,对即将被传入到单元测试用例函数中的 runtime 变量值做精确的假设,如果假设不正确(即当前 runtime 变量的取值不满足所假设的条件),则不会将该变量传给该测试用例中假设后面的语句,即程序会从该 assumeThat 所在的 @Test 测试函数中直接自动跳出(test automatically quietly passes,values that violate assumptions are quietly ignored),去执行下一个 @Test 函数,使得本来会中断的测试现在不会中断。
使用假设机制必须得注意以下几点:
a.由于 JUnit 4.4 引用了 Hamcrest 匹配符库,所以使用 assumeThat 就可以编写所有的假设语句。但是为了方便使用,JUnit 4.4 除 assumeThat 之外,还提供了 assumeTrue,assumeNotNull 和 assumeNoException 语句。
b.要使用 assume* 假设语句,必须得 import static org.junit.Assume.*;。
c.如果引用了第三方 hamcrest 的匹配符库,必须得 import static org.hamcrest.Matchers.*;,如果引用 JUnit 4.4 自带的匹配符库,需要 import static org.hamcrest.CoreMatchers.*;。
如下是假设机制的使用举例:
实例1:
@Test public void filenameIncludesString() { //如果文件分隔符不是’/’(forward slash),则不执行assertThat断言测试,直接跳过该测试用例函数 assumeThat(File.separatorChar, is('/')); //判断文件名fileName是否含有字符串"developerWorks" assertThat( fileName, containsString( "developerWorks" ) ); }
实例2:
@Test public void filenameIncludesString() { //bugFixed不是JUnit4.4的函数,是开发人员自己工程中定义的函数,表示判断指定的defect是否 //被修正了,如果被修正,则返回true,否则返回false。这里假设缺陷13356被修正后才进行余下单元测试 assumeTrue( bugFixed("13356") ); //判断文件名fileName是否含有字符串"developerWorks" assertThat( fileName, containsString( "developerWorks" ) ); }
文章来源:http://www.ibm.com/developerworks/cn/java/j-lo-junit44/
相关推荐
《探索JUnit4扩展:深入Rule》 JUnit是Java开发者最常用的单元测试框架,它极大地简化了测试代码的编写。在JUnit4中,引入了一个强大的特性——Rule,这使得测试更加灵活且可定制化。本文将深入探讨Rule的概念、...
标题“探索JUnit4扩展:使用Rule”涉及到的是Java单元测试框架JUnit的一个高级特性,即`@Rule`。在Java开发中,单元测试是确保代码质量、可维护性和可靠性的重要手段,而JUnit作为最流行的Java单元测试框架之一,...
其次,Junit4.12提供了断言(Assertion)机制,用于检查代码的运行结果是否符合预期。例如,`assertEquals()`用于比较两个值是否相等,`assertTrue()`和`assertFalse()`用来验证布尔条件。此外,还有`assertNull()`...
赠送jar包:junit-jupiter-api-5.4.2.jar; 赠送原API文档:junit-jupiter-api-5.4.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.4.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.4.2.pom; ...
本文将深入探讨关于"junit-4.12.rar"包及其依赖包,以及如何解决在使用JUnit 4进行单元测试时遇到的"method initializationerror not found"错误。 首先,我们来了解JUnit 4.12版本。这是JUnit的一个稳定版本,发布...
- 扩展性:JUnit Jupiter提供了一种可扩展的测试架构,开发者可以自定义测试注解和执行逻辑。 - Vintage模块:为兼容JUnit 4的测试用例,JUnit 5包含了Vintage模块。 3. 使用JUnit进行测试: - 引入依赖:在项目...
在Java开发中,JUnit是一个非常重要的单元测试框架,它允许开发者对代码进行自动化测试,确保其功能正确性。本文将详细介绍如何在无法访问官方网站的情况下,获取并使用JUnit 4.12所需的相关包。 首先,JUnit 4.12...
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
赠送jar包:junit-platform-launcher-1.8.0-M1.jar; 赠送原API文档:junit-platform-launcher-1.8.0-M1-javadoc.jar; 赠送源代码:junit-platform-launcher-1.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-...
赠送jar包:junit-jupiter-engine-5.8.2.jar; 赠送原API文档:junit-jupiter-engine-5.8.2-javadoc.jar; 赠送源代码:junit-jupiter-engine-5.8.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-engine-...
赠送jar包:junit-jupiter-api-5.8.0-M1.jar; 赠送原API文档:junit-jupiter-api-5.8.0-M1-javadoc.jar; 赠送源代码:junit-jupiter-api-5.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.8.0-...
赠送jar包:junit-jupiter-api-5.8.2.jar; 赠送原API文档:junit-jupiter-api-5.8.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.8.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.8.2.pom; ...
JUnit Vintage则是为了兼容JUnit 4而存在的。 使用JUnit 5,开发者可以编写更加灵活和可读的测试代码,例如通过参数化测试来运行同一测试用例的不同数据组合,或者使用条件注解来控制测试执行的条件。另外,JUnit 5...
junit-vintage-engine-5.6.2.jarjunit-vintage-engine-5.6.2.jarjunit-vintage-engine-5.6.2.jar
4. **可扩展性**:JUnit 4.11允许用户自定义规则(Rules),通过@Rule注解,可以创建复杂的测试行为,如临时文件管理、超时控制等。 5. **分类(Categories)**:新增了测试分类功能,开发者可以将测试分为不同的...
为了在项目中使用JUnit,你需要将`junit-4.11.jar`添加到项目的类路径中,并在测试类上使用`@RunWith(JUnit4.class)`注解来指定使用JUnit 4作为测试运行器。然后,你可以创建测试方法,这些方法通常以`test`开头,并...
本人小白,开始学习Android,记录自己的错误瞬间,大神不要喷我,哈哈! 安装好android studio后,测试...如果不在意的话,可以不下载它,在module的build.gradle中dependencies模块把加载junit的testCompile ‘junit:j
JUnit 4所需system-rules.jar依赖包,主要包含:system-rules-1.16.1.jar,system-rules-1.17.1.jar,system-rules-1.18.0.jar
与JUnit3相比,JUnit4的灵活性和可扩展性得到了显著提升,使得测试驱动开发(TDD)在Java领域变得更加普及。 ## 二、JUnit4的核心组件 ### 1. 测试注解 - `@Test`: 表示一个方法是测试方法,可以包含断言。 - `@...
赠送jar包:junit-jupiter-api-5.5.2.jar; 赠送原API文档:junit-jupiter-api-5.5.2-javadoc.jar; 赠送源代码:junit-jupiter-api-5.5.2-sources.jar; 赠送Maven依赖信息文件:junit-jupiter-api-5.5.2.pom; ...