Java 中的 Arrange/Act/Assert 模式:提升测试清晰度和简洁性
大约 2 分钟
也称为
- Given/When/Then
Arrange/Act/Assert 设计模式的意图
Arrange/Act/Assert 模式在 Java 的单元测试中至关重要。这种测试方法通过将单元测试划分为三个不同的部分来清晰地构建单元测试:设置(Arrange)、执行(Act)和验证(Assert)。
Arrange/Act/Assert 模式的详细解释及现实世界示例
现实世界示例
想象一下,你正在组织一个小型活动。为了确保一切顺利进行,你遵循类似于 Arrange/Act/Assert 的模式。
- Arrange:你准备场地,准备嘉宾名单,安排座位,组织餐饮。
- Act:你根据计划进行活动,欢迎嘉宾,提供餐饮,并按照时间表进行。
- Assert:活动结束后,你通过检查嘉宾反馈来评估活动的成功程度,确保所有任务都已完成,并回顾一切是否按计划进行。
这种对准备、执行和评估的清晰分离有助于确保活动井井有条且取得成功,这与软件测试中 Arrange/Act/Assert 模式的结构化方法相呼应。
通俗地说
Arrange/Act/Assert 是一种测试模式,它将测试组织成三个清晰的步骤,以便于维护。
WikiWikiWeb 的说法
Arrange/Act/Assert 是一种用于安排和格式化 UnitTest 方法中代码的模式。
Java 中 Arrange/Act/Assert 模式的编程示例
我们需要为一个类编写全面且清晰的单元测试套件。在 Java 测试中使用 Arrange/Act/Assert 模式可以确保清晰度。
让我们首先介绍要进行单元测试的 Cash
类。
public class Cash {
private int amount;
Cash(int amount) {
this.amount = amount;
}
void plus(int addend) {
amount += addend;
}
boolean minus(int subtrahend) {
if (amount >= subtrahend) {
amount -= subtrahend;
return true;
} else {
return false;
}
}
int count() {
return amount;
}
}
然后,我们根据 Arrange/Act/Assert 模式编写单元测试。请注意每个单元测试中清晰分隔的步骤。
class CashAAATest {
@Test
void testPlus() {
//Arrange
var cash = new Cash(3);
//Act
cash.plus(4);
//Assert
assertEquals(7, cash.count());
}
@Test
void testMinus() {
//Arrange
var cash = new Cash(8);
//Act
var result = cash.minus(5);
//Assert
assertTrue(result);
assertEquals(3, cash.count());
}
@Test
void testInsufficientMinus() {
//Arrange
var cash = new Cash(1);
//Act
var result = cash.minus(6);
//Assert
assertFalse(result);
assertEquals(1, cash.count());
}
@Test
void testUpdate() {
//Arrange
var cash = new Cash(5);
//Act
cash.plus(6);
var result = cash.minus(3);
//Assert
assertTrue(result);
assertEquals(8, cash.count());
}
}
何时在 Java 中使用 Arrange/Act/Assert 模式
使用 Arrange/Act/Assert 模式的场景
- 单元测试,尤其是在 TDD 和 BDD 的上下文中
- 在需要在测试用例中保持清晰度和结构的任何地方
Java 中 Arrange/Act/Assert 模式的现实世界应用
- 这种模式在 Java 中使用 TDD 和/或 BDD 方法时尤其有用。
- 应用于各种编程语言和测试框架,例如 JUnit(Java)、NUnit(.NET)和 xUnit 框架。
Arrange/Act/Assert 模式的优缺点
优点
- 通过清晰地分离设置、操作和验证步骤来提高测试的可读性。
- 使测试更容易维护和理解,因为每个测试都以可预测的方式构建。
- 通过将测试失败隔离到测试内的特定阶段来促进调试。
权衡
- 可能会在测试中引入冗余,因为类似的安排可能会在多个测试中重复。
- 一些复杂的测试可能无法完全符合这种结构,需要在这些三个阶段之外添加额外的上下文或设置。
相关的 Java 设计模式
- 页面对象:一种用于组织 UI 测试的模式,可以与 Arrange/Act/Assert 一起使用。