【gradle插件系列1】java-test-fixtures 由来场景用法示例

gradle java-test-fixtures 由来场景用法示例

1. 由来

测试夹具是在单元测试中使用的组件或模块,用于提供额外的数据或环境。测试夹具(Test fixtures)通常用于设置待测试的代码,或者提供旨在简化组件测试的工具。

Java项目可以通过应用java-test-fixtures插件来启用测试夹具支持,除了javajava-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插件来启用测试夹具支持,除了应用javajava-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-publishivy-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 配置时,需要注意以下事项:

  • 确保测试夹具依赖与项目的需求和要求相匹配。
  • 使用测试夹具时,应确保其环境和数据与实际生产环境隔离开来,避免对生产系统造成影响。

5. 官方链接

Gradle User Manual - Java Testing

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值