`

Junit4使用汇总(二)assertThat

 
阅读更多

一、assertThat方法

JUnit4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。

其基本语法为:

assertThat([message,] value, matcher-statement);

其中:

  1. 第一个参数message,为可选参数,为出错是的提示信息;
  2. value为想要测试的变量;
  3. matcher-statement为使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher-statement所表达的期望值相符,则测试成功,否则测试失败。

开发人员可以通过实现 Matcher 接口,定制自己想要的匹配符。当开发人员发现自己的某些测试代码在不同的测试中重复出现,经常被使用,这时用户就可以自定义匹配符,将这些代码绑定在一个断言语句中,从而可以达到减少重复代码并且更加易读的目的。

目前,JUnit提供的匹配符,定义在两个类里面:org.junit.matchers.JUnitMatchersorg.hamcrest.CoreMatchers

org.junit.matchers.JUnitMatchers提供的匹配符,目前有两个:

isThrowable(Matcher<T> throwableMatcher);
isException(Matcher<T> exceptionMatcher);

org.hamcrest.CoreMatchers提供的匹配符就很多了,常用的有:

  1. 核心

    • anything - 总是匹配,如果你不关心测试下的对象是什么是有用的
    • describedAs - 添加一个定制的失败表述装饰器
    • is - 改进可读性的装饰器
  2. 逻辑

    • allOf - 如果所有匹配器都匹配才匹配, short circuits (很难懂的一个词,意译是短路,感觉不对,就没有翻译)(像 Java &&)
    • anyOf - 如果任何匹配器匹配就匹配, short circuits (像 Java ||)
    • not - 如果包装的匹配器不匹配器时匹配,反之亦然
  3. 对象

    • equalTo - 测试对象相等使用Object.equals方法
    • hasToString - 测试Object.toString方法
    • instanceOf, isCompatibleType - 测试类型
    • notNullValue, nullValue - 测试null
    • sameInstance - 测试对象实例
  4. Beans

    • hasProperty - 测试JavaBeans属性
  5. 集合

    • array - 测试一个数组元素test an array’s elements against an array of matchers
    • hasEntry, hasKey, hasValue - 测试一个Map包含一个实体,键或者值
    • hasItem, hasItems - 测试一个集合包含一个元素
    • hasItemInArray - 测试一个数组包含一个元素
  6. 数字

    • closeTo - 测试浮点值接近给定的值
    • greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - 测试次序
  7. 文本

    • equalToIgnoringCase - 测试字符串相等忽略大小写
    • equalToIgnoringWhiteSpace - 测试字符串忽略空白
    • containsString, endsWith, startsWith - 测试字符串匹配

如何自定义一个匹配符呢?

看代码:

package mytest;

import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

public class IsNotANumber extends TypeSafeMatcher<Double> {

  @Override
  public boolean matchesSafely(Double number) {
    return number.isNaN();
  }

  public void describeTo(Description description) {
    description.appendText("not a number");
  }

  @Factory
  public static <T> Matcher<Double> notANumber() {
    return new IsNotANumber();
  }

}

可以这样用于测试:

@Test
public void testSquareRootOfMinusOneIsNotANumber() {
    assertThat(Math.sqrt(-1), is(notANumber()));
}

一、还有个assumeThat方法

理想情况下,写测试用例的开发人员可以明确的知道所有导致他们所写的测试用例不通过的地方,但是有的时候,这些导致测试用例不通过的地方并不是很容易的被发现,可能隐藏得很深,从而导致开发人员在写测试用例时很难预测到这些因素,而且往往这些因素并不是开发人员当初设计测试用例时真正目的,他们的测试点是希望测试出被测代码中别的出错地方。

比如,一个测试用例运行的 locale(如:Locale.US)与之前开发人员设计该测试用例时所设想的不同(如:Locale.UK),这样会导致测试不通过,但是这可能并不 是开发人员之前设计测试用例时所设想的测试出来的有用的失败结果(测试点并不是此,比如测试的真正目的是想判断函数的返回值是否为 true,返回 false 则测试失败),这时开发人员可以通过编写一些额外的代码来消除这些影响(比如将 locale 作为参数传入到测试用例中,每次运行测试用例时,明确指定 locale),但是花费时间和精力来编写这些不是测试用例根本目的的额外代码其实是种浪费,这时就可以使用 Assumption 假设机制来轻松达到额外代码的目的。编写该测试用例时,首先假设 locale 必须是 Locale.UK,如果运行时 locale 是 Locale.UK,则继续执行该测试用例函数,如果是其它的 locale,则跳过该测试用例函数,执行该测试用例函数以外的代码,这样就不会因为 locale 的问题导致测试出错。

JUnit4 结合 Hamcrest 库提供了 assumeThat 语句,开发人员可以使用其配合匹配符 Matcher 设计所有的假设条件(语法和 assertThat 一样)。

看下面例子:

import static org.junit.Assume.*
@Test public void filenameIncludesUsername() {
    assumeThat(File.separatorChar, is('/'));
    assertThat(new User("optimus").configFileName(), is("configfiles/optimus.cfg"));
}

@Test public void correctBehaviorWhenFilenameIsNull() {
    assumeTrue(bugFixed("13356"));  // bugFixed is not included in JUnit
    assertThat(parse(null), is(new NullDocument()));
}

JUnit自带的运行器(Runner)会忽略那些假设不成立的测试数据,而自定义运行器的处理逻辑可能会不一样。

 

另外,假设也可以用在@Before 或者 @BeforeClass这两个步骤里面。

分享到:
评论

相关推荐

    Junit4使用方法

    JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。本文将详细介绍 JUnit4 的使用方法和核心概念。 JUnit4 核心概念 JUnit4 的核心概念包括测试类、测试集和测试运行...

    junit4教程(《Junit4初探》)

    ## 二、JUnit4的核心组件 ### 1. 测试注解 - `@Test`: 表示一个方法是测试方法,可以包含断言。 - `@Before`: 在每个测试方法之前运行,通常用于初始化测试环境。 - `@After`: 在每个测试方法之后运行,用于清理...

    junit4 jar包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了编写可重复执行、易于维护的测试代码的能力。这个“junit4 jar包”包含了运行JUnit4测试所必需的库文件,主要包括两个核心组件:`junit-4.11....

    JUnit4基础文档

    本文档介绍了JUnit4的基础知识,包括单元测试的概念、JUnit4的HelloWorld示例、断言机制、注解使用、测试运行方式等。 单元测试的概念 单元测试是指对软件的最小单元进行测试,以确保其正确性和可靠性。单元测试...

    junit4测试数据库源码

    本资料包"junit4测试数据库源码"主要涵盖了Junit4的新特性assertThat断言以及如何利用Junit4进行MySQL和Oracle两种主流数据库的增删改查操作的测试。 首先,我们来了解一下Junit4的assertThat断言。在旧版本的Junit...

    JUnit4使用.pdf

    ### JUnit4 使用详解 #### 一、JUnit简介与单元测试概念 JUnit 是一个用于 Java 程序的单元测试框架,它可以帮助开发者确保代码的质量和稳定性。单元测试是一种编程方法,通过这种方式开发者可以在开发过程中编写...

    junit4测试jar包

    JUnit4测试框架是Java开发中广泛使用的单元测试工具,它为开发者提供了编写和运行可重复、可靠的测试用例的能力。这个“junit4测试jar包”包含了一切你需要在项目中集成JUnit4进行测试的库文件。只需将其复制到你的...

    junit4 jar完整包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar完整包”包含了所有你需要进行单元测试的类和接口,使得测试过程变得简单且易于...

    junit4学习文档

    #### 二、JUnit4 中注解的应用 在 JUnit4 中,注解的引入极大地提高了测试用例编写的灵活性和可读性。下面我们详细介绍几个常用的注解: 1. **@Test** - 作用:用于标记一个方法为测试方法。 - 示例: ```java...

    Junit4使用教程详解+源码下载.rar

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写可重复执行、可验证的测试代码。本教程将深入讲解JUnit4的使用方法,并附带源码供学习者实践和参考。 一、JUnit4概述 JUnit...

    JUnit4JUnit4JUnit4(文档)

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写、组织和执行单元测试。JUnit4引入了许多改进和新特性,极大地提升了测试的灵活性和效率。下面将详细介绍JUnit4的关键概念、...

    Junit4所需jar包

    在JUnit4中,我们常常会使用Hamcrest的匹配器来定义预期结果,比如`assertThat()`方法就是通过Hamcrest进行断言的。 以下是一些关于JUnit4和Hamcrest的知识点: 1. **JUnit4的特性**: - **注解驱动**:JUnit4...

    Junit4教程非常详尽

    二、JUnit4 中的改进 在 JUnit4 中,测试用例的编写变得非常简单。我们可以使用 @Before、@After、@Test 等 Annotation 来描述测试方法,而不需要继承自 TestCase。这种方式使得测试用例的编写变得更加灵活和简洁。...

    JUnit4使用简单教程

    eclipse上通过一个简单例子演示使用JUnit4进行测试

    在eclipse中使用junit4教程

    jUnit4 在 Eclipse 中的使用教程 jUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。 Annotation 是一种元数据,描述数据的数据。在 Java 里面可以用来和 ...

    powermock-module-junit4-2.0.9-API文档-中英对照版.zip

    赠送jar包:powermock-module-junit4-2.0.9.jar; 赠送原API文档:powermock-module-junit4-2.0.9-javadoc.jar; 赠送源代码:powermock-module-junit4-2.0.9-sources.jar; 赠送Maven依赖信息文件:powermock-...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    Junit4简单实用

    每个测试方法执行之后都要执行一次。这两个元数据主要用于设置测试前后的环境,例如初始化数据或者清理资源。...在实际开发中,熟练掌握 JUnit4 的使用对于保证软件质量、提升开发效率具有重要意义。

Global site tag (gtag.js) - Google Analytics