1.背景

在设计自动化cases时,遵守的核心原则是3A(Arrange-> Actor ->Assert)原则; 断言工具的强大直接影响到用例的执行效率,本文将介绍一种流式断言神器:AssertJ。
在JAVA cases中常用的断言工具有JUnit自带的Assert,还有hamcrest的assertThat(之前总结过http://blog.csdn.net/neven7/article/details/42489723),这些工具对于AssertJ来说都相形见绌。

2.AssertJ介绍

AseertJ: JAVA 流式断言器,什么是流式,常见的断言器一条断言语句只能对实际值断言一个校验点,而流式断言器,支持一条断言语句对实际值同时断言多个校验点。

  1. 概述

    1.1. 依赖


    首先需要增加相应依赖,Spring Boot默认已经加载。
    1. <dependency>
    2. <groupId>org.assertj</groupId>
    3. <artifactId>assertj-core</artifactId>
    4. <version>3.4.1</version>
    5. <scope>test</scope>
    6. </dependency>

    1.2. 简介

    AssertJ提供一组类和工具方法,可以很容易写出流畅、优美的断言方法:

Standard Java
Java 8
Guava
Joda Time
Neo4J and
Swing components
读者可以在其官网上查看所有有效模块。下面是从官网摘取的几个简单示例看看:

  1. assertThat(frodo)
  2. .isNotEqualTo(sauron)
  3. .isIn(fellowshipOfTheRing);
  4. assertThat(frodo.getName())
  5. .startsWith("Fro")
  6. .endsWith("do")
  7. .isEqualToIgnoringCase("frodo");
  8. assertThat(fellowshipOfTheRing)
  9. .hasSize(9)
  10. .contains(frodo, sam)
  11. .doesNotContain(sauron);


上面示例仅为冰山一角,但可以让我们了解下AssertJ写断言的大致情况。

3 实战学习


本节我们将集中于学习AssertJ并探索其可能性。引入相应依赖或jar包之后,应用仅需在测试类中增加一句静态导入语句:

  1. import static org.assertj.core.api.Assertions.*;

3.1. 写断言

写断言首先需要传入测试对象至Assertions.assertThat()方法,然后跟上实际的断言方法。与其他库不同,下面代码没有实际断言任何内容,也永远不会产生失败的测试:

  1. assertThat(anyRefenceOrValue);


如果利用IDE代码提示特性,写AssertJ断言将变得难以置信地容易,所有方法都是自描述的,下面截图来着IDEA:
image.png
我们看到有很多与字符串相关方法可以选择,下面看看这些API的详细应用。

3.2. 对象断言

对象可以使用多种方式进行比较,既可以两个对象进行比较也可以对象的字段进行比较。下面示例看Dog类的对象fido和fidosClone之间比较:

  1. public class Dog {
  2. private String name;
  3. private Float weight;
  4. // standard getters and setters
  5. }
  6. Dog fido = new Dog("Fido", 5.25);
  7. Dog fidosClone = new Dog("Fido", 5.25);


也可以使用下面断言进行比较:

  1. assertThat(fido).isEqualTo(fidosClone);


该对象引用之间比较会失败。如果比较其内容,可以使用isEqualToComparingFieldByFieldRecursively()方法:

  1. assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);


当对两个对象fido和fidosClone进行按字段递归比较,两者是相等。有许多断言方法提供不同方式进行比较,还可以对其字段进行检查和断言。

3.3. 布尔比较

布尔比较函数:
isTrue()
isFalse()
示例如下:

  1. assertThat("".isEmpty()).isTrue();


3.4. Iterable/Array断言


对于Iterable/Array有多种断言方法判断其内容是否存在。最常见的是判断是否存在给定元素:

  1. List<String> list = Arrays.asList("1", "2", "3");
  2. assertThat(list).contains("1");


或判断是否为空:

  1. assertThat(list).isNotEmpty();


或如果List已给定元素开头:

  1. assertThat(list).startsWith("1");


如果在一个对象上进行多个断言,可以很容易采用链接方式。下面示例首先检查列表是否为空,然后判断是否包括“1”元素,不包括空值,并且包括元素序列“2”、“3”:

  1. assertThat(list)
  2. .isNotEmpty()
  3. .contains("1")
  4. .doesNotContainNull()
  5. .containsSequence("2", "3");


该类型还有很多其他可能的断言,读者可以自己查看官网文档。

3.5. 字符断言


字符类型断言一般涉及比较和检查字符是否来自Unicode表。请看实例:

  1. assertThat(someCharacter)
  2. .isNotEqualTo('a')
  3. .inUnicode()
  4. .isGreaterThanOrEqualTo('b')
  5. .isLowerCase();


方法几乎都是自描述,不再解释。

3.6. 类断言


类断言一般检查其字段和类的类型,注解是否存在、是否为final类。如果判断Runnable类是否为接口:

  1. assertThat(Runnable.class).isInterface();


或者判断一个类是否从另一个类赋值:

  1. assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);


3.7. 文件断言


File断言检查文件实例是否存在,是目录或文件,有一定内容,是否可读,具有特定扩展名。
下面示例执行一些列检查:

  1. assertThat(someFile)
  2. .exists()
  3. .isFile()
  4. .canRead()
  5. .canWrite();


3.8. 数值类型断言


数值类型包括Double/Float/Integer及其他类型。断言主要比较数值在一定偏移量之内或之外。举例,检查两个数值在一定精度范围内是否相等:

  1. assertThat(5.1).isEqualTo(5, withPrecision(1d));


注意这里使用withPrecision(Double offset) 方法生成偏移量对象。

3.9. InputStream断言


流断言只有一个方法:
hasSameContentAs(InputStream expected),示例如下:

  1. assertThat(given).hasSameContentAs(expected);


3.10. Map断言


Map断言主要检查map是否包括特定项(key,value对),或key和value单独比较。示例如下:

  1. assertThat(map)
  2. .isNotEmpty()
  3. .containsKey(2)
  4. .doesNotContainKeys(10)
  5. .contains(entry(2, "a"));


3.11. Throwable断言


Throwable断言主要检查异常消息,栈跟踪,原因(cause)检查或验证。示例如下:

  1. assertThat(ex).hasNoCause().hasMessageEndingWith("c");


3. 断言描述


为了更好描述断言,可以在断言中动态生成自定义描述,使用as方法,示例如下:

  1. assertThat(person.getAge())
  2. .as("%s's age should be equal to 100", person.getName())
  3. .isEqualTo(100);


运行测试输出结果如下:

  1. [tom's age should be equal to 100] expected:<100> but was:<27>


4. 总结


本文简要说明了AssertJ提供的各种断言方法,帮助我们更便捷地写各种测试断言,更多功能可参考官网。
————————————————
版权声明:本文为CSDN博主「梦想画家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/neweastsun/article/details/104006208/