gradle java-test-fixtures 由来场景用法示例
文章目录
1. 由来
测试夹具是在单元测试中使用的组件或模块,用于提供额外的数据或环境。测试夹具(Test fixtures)通常用于设置待测试的代码,或者提供旨在简化组件测试的工具。
Java项目可以通过应用java-test-fixtures
插件来启用测试夹具支持,除了java
或java-library
插件外。
java-test-fixtures
是 Gradle 构建工具中的一种配置,用于定义和管理 Java 测试夹具(Test Fixtures)。
2. 适用场景
java-test-fixtures
配置适用于以下场景:
- 单元测试中的测试夹具:通过
java-test-fixtures
配置可以定义和管理在单元测试中所需的测试夹具。 - 分离测试和生产代码:使用测试夹具可以将测试环境与生产环境隔离开来,使测试更加可靠和独立。
简单来说,测试夹具是用于准备测试环境的工具或代码。在测试代码执行之前,它可以帮助设置测试所需的各种环境和条件。这可能包括初始化对象、加载数据、配置环境等。
例如,如果你正在测试一个Java类,你可能需要创建一个该类的实例,并为其提供一些预设的值或状态。这就是测试夹具的作用。它可以帮助你更容易地设置这些条件,从而使你能够专注于测试代码的行为,而不是手动设置测试环境。
在Maven或Gradle这样的构建工具中,插件是用于扩展构建工具功能的模块。java-test-fixtures
插件就是这样一个插件,它提供了对测试夹具的支持,帮助Java项目更容易地进行测试。
启用这个插件后,你就可以在你的测试代码中使用它提供的工具和方法来设置测试环境。
3. 用法及示例
在同一个项目中创建和使用测试夹具
测试夹具常用于设置待测试的代码,或提供旨在简化组件测试的工具。Java项目可以通过应用java-test-fixtures
插件来启用测试夹具支持,除了应用java
或java-library
插件之外:
// 应用 Java test fixtures 插件
plugins {
id 'java-library' // Java库
id 'java-test-fixtures' // 生成测试夹具
id 'maven-publish' // 发布
}
这将自动创建一个testFixtures
源集,您可以在其中编写测试夹具。测试夹具的配置如下:
- 它们可以看到主源集的类。
- 测试源可以看到测试夹具的类。
例如,对于以下主类:
src/main/java/com/acme/Person.java
public class Person {
private final String firstName;
private final String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
// ...
}
可以在src/testFixtures/java
中编写测试夹具:
src/testFixtures/java/com/acme/Simpsons.java
public class Simpsons {
private static final Person HOMER = new Person("Homer", "Simpson");
private static final Person MARGE = new Person("Marjorie", "Simpson");
private static final Person BART = new Person("Bartholomew", "Simpson");
private static final Person LISA = new Person("Elisabeth Marie", "Simpson");
private static final Person MAGGIE = new Person("Margaret Eve", "Simpson");
private static final List<Person> FAMILY = new ArrayList<Person>() {{
add(HOMER);
add(MARGE);
add(BART);
add(LISA);
add(MAGGIE);
}};
public static Person homer() { return HOMER; }
public static Person marge() { return MARGE; }
public static Person bart() { return BART; }
public static Person lisa() { return LISA; }
public static Person maggie() { return MAGGIE; }
// ...
}
声明测试夹具的依赖关系
与Java Library Plugin类似,测试夹具提供了API和实现配置:
// 声明测试夹具的依赖关系
dependencies {
testImplementation 'junit:junit:4.13'
// API 依赖项在构建时对消费者可见
testFixturesApi 'org.apache.commons:commons-lang3:3.9'
// 实现依赖项在构建时不会泄漏给消费者
testFixturesImplementation 'org.apache.commons:commons-text:1.6'
}
值得注意的是,如果一个依赖项是测试夹具的实现依赖项,那么在编译依赖于这些测试夹具的测试时,实现依赖项不会泄漏到编译类路径中。这可以改善关注点分离和更好的编译避免。
使用另一个项目的测试夹具
测试夹具不仅限于单个项目。通常情况下,依赖项目的测试也需要依赖于该依赖项的测试夹具。可以使用testFixtures
关键字轻松实现这一点:
// 添加对另一个项目测试夹具的依赖
dependencies {
implementation(project(":lib"))
testImplementation 'junit:junit:4.13'
testImplementation(testFixtures(project(":lib")))
}
发布测试夹具
使用java-test-fixtures
插件的一个优点是可以发布测试夹具。
按照惯例,测试夹具将被发布为带有test-fixtures
分类器的构件。对于Maven和Ivy,具有此分类器的构件将简单地与常规构件一起发布。然而,如果使用maven-publish
或ivy-publish
插件,则测试夹具将作为Gradle模块元数据中的附加变体进行发布,并且您可以直接依赖于另一个Gradle项目中的外部库的测试夹具:
// 添加对外部库测试夹具的依赖
dependencies {
functionalTest testFixtures("com.google.code.gson:gson:2.8.5")
}
值得注意的是,如果外部项目没有发布Gradle模块元数据,则解析将失败,并显示找不到该变体的错误。
如果您发布库并使用测试夹具,但不想发布夹具,可以通过以下方式禁用测试夹具变体的发布。
// 禁用测试夹具变体的发布
components.java.withVariantsFromConfiguration(configurations.testFixturesApiElements) { skip() }
components.java.withVariantsFromConfiguration(configurations.testFixturesRuntimeElements) { skip() }
4. 注意事项
在使用 java-test-fixtures
配置时,需要注意以下事项:
- 确保测试夹具依赖与项目的需求和要求相匹配。
- 使用测试夹具时,应确保其环境和数据与实际生产环境隔离开来,避免对生产系统造成影响。