Java接口自动化测试框架,推荐使用AssertJ

文摘   科技   2023-05-02 16:42   四川  

AssertJ是一个流行的Java测试框架,它旨在提供一种更直观、易于阅读和编写的方式来编写断言。使用AssertJ可以帮助开发人员更轻松地编写高效且易于维护的测试代码。

AssertJ的核心功能

1. 提升断言的灵活性 - AssertJ提供了大量的灵活的断言方法,使得编写测试代码更加简单且易于阅读。可以直接使用这些方法来断言对象、数组、集合、日期等。

2. 支持链式断言,AssertJ支持链式断言,使得编写清晰、易于理解的测试代码变得更加容易。

3. 支持自定义扩展,如果需要更多的断言方法,可以基于自己的业务扩展断言方法来满足需求。

4. 兼容多种测试框架,AssertJ可以与JUnit、TestNG等多种测试框架兼容。

TestNG虽然也有断言方法,但AssertJ相对于TestNG来说有以下优点:

1. 链式方式断言:AssertJ可以使用非常易读的链式表达式编写断言。这使得测试代码更加清晰和易于理解。

2. 更详细的错误信息:当断言失败时,AssertJ提供了更详的错误信息。它会告诉你预期的值和实际的值之间的差异,并提供更多的上下文信息,以便更容易地调试问题。

3. 更少的样板代码:使用AssertJ,您需要编写的代码比使用TestNG更少。这是因为AssertJ提供了许多内置的断言方法,可以处理大量的场景。

链式断言

assertThat(object).assertion1().assertion2().assertion3();

在这个例子中,assertThat()方法用于创建需要进行比较的对象,并返回一个可链接的对象。可以使用任意数量的断言方法来对该对象进行比较。每个断言方法都会返回原始对象的新实例,因此可以将多个断言链接在一起,从而形成一个链式结构。

链式断言有以下优点:

1. 更容易阅读 - 使用链式断言,可以通过多行代码对同一个对象进行多次比较,从而提高了测试代码的可读性。

2. 更容易维护 - 由于链式断言将多个断言组合成一个单独的测试用例,因此它们更容易维护并且更难出错。

3. 更加灵活 - 链式断言使得用户可以轻松地添加或删除断言,从而简化了测试代码的维护过程。

自定义断言

如果需要扩展断言方法,AssertJ 同样也支持很多扩展点。通过实现 AbstractAssert接口来扩展自己的断言。

import org.assertj.core.api.AbstractAssert;
public class PersonAssert extends AbstractAssert<PersonAssert, Person> { public PersonAssert(Person actual) { super(actual, PersonAssert.class); }
public static PersonAssert assertThat(Person actual) { return new PersonAssert(actual); }
public PersonAssert hasName(String name) { isNotNull(); if (!actual.getName().equals(name)) { failWithMessage("Expected person's name to be <%s> but was <%s>", name, actual.getName()); } return this; }
public PersonAssert hasAge(int age) { isNotNull(); if (actual.getAge() != age) { failWithMessage("Expected person's age to be <%d> but was <%d>", age, actual.getAge()); } return this; }}
import org.testng.annotations.Test;
public class MyTest { @Test public void test() { Person person = new Person("John", 30); PersonAssert.assertThat(person).hasName("John").hasAge(30); }}

以上是 AssertJ 的一些核心能力和用法,这些特性可以使测试代码更加清晰、简洁、易于理解。除了基本的断言方法之外,AssertJ 还提供了许多高级用法,可以帮助我们更好地编写测试代码。

按需执行多个断言

有时候我们需要按照某种特定的顺序执行多个断言,而不是在第一个断言失败时立即终止这时,我们可以使用 SoftAssertions类来执行多个断言,如果有任何一个断言失败,可以在最后输出所有失败的断言。

import org.assertj.core.api.SoftAssertions;
public class MyTest { @Test public void test() { String expected = "Hello"; String actual = "hello"; SoftAssertions softly = new SoftAssertions(); softly.assertThat(actual).isEqualToIgnoringCase(expected); softly.assertThat(actual).hasSize(5); softly.assertThat(actual).containsOnlyOnce("e"); softly.assertAll(); }}

在上面的示例中,我们使用 SoftAssertions 类来执行多个断言。即使有一个或多个断言失败,所有断言都会执行完毕,并输出所有失败的断言。

过程式编程

AssertJ 还支持过程式编程风格,这种风格更接近于自然语言,可以使测试代码更容易阅读和理解。

import static org.assertj.core.api.Assertions.*;
public class MyTest { @Test public void test() { String expected = "Hello"; String actual = "hello"; assertThat(actual) .as("The actual value %s should be equal to the expected value %s", actual, expected) .isEqualToIgnoringCase(expected) .hasSize(5) .containsOnlyOnce("e"); }}

在上面的示例中,我们使用静态导入Assertions包的方式,以便更清晰地表达断言方法。

最后,个人将使用经历总结如下,Testng与AssertJ并非互斥关系,二者在做断言时可以相互补充各自的不足。例如testng在处理一些复杂断言场景,测试者需要自己开发断言方法,而这点恰恰可以assertJ的长处。

- END -


下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

  • 后台回复【测开】获取测试开发xmind脑图

  • 后台回复【加群】获取加入测试社群方式,领2T测试自学视频

软件质量保障
所寫即所思|一个阿里质量人对测试技术的思考。
 最新文章