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 {
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 {
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 {
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测试自学视频