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

本文介绍了Gradle中的java-test-fixtures插件,用于创建和管理Java测试夹具,以简化单元测试和隔离测试环境。内容涵盖了插件的由来、适用场景、用法示例,以及注意事项和官方链接。

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

### 医学图像分割中的Attention U-Net #### Attention U-Net架构概述 Attention U-Net是一种改进版的U-Net网络,在传统U-Net的基础上引入了注意力机制来增强目标区域特征并抑制背景噪声。这种设计使得模型能够更专注于重要的解剖结构,从而提高分割精度[^1]。 具体来说,Attention U-Net在网络编码器部分采用标准的U-Net收缩路径:每个块由两个连续的3×3卷积组成,随后接ReLU激活函数以及最大池化操作完成下采样过程;而在解码阶段,则加入了特殊的attention gate模块连接低分辨率特征图与高分辨率特征图之间,确保只有那些真正有助于当前像素分类的信息被保留下来参与最终预测[^2]。 ```python import torch.nn as nn from torchvision import models class AttentionBlock(nn.Module): """定义Attention Gate""" def __init__(self, F_g, F_l, F_int): super(AttentionBlock, self).__init__() self.W_g = nn.Sequential( nn.Conv2d(F_g, F_int, kernel_size=1,stride=1,padding=0,bias=True), nn.BatchNorm2d(F_int) ) self.W_x = nn.Sequential( nn.Conv2d(F_l, F_int, kernel_size=1,stride=1,padding=0,bias=True), nn.BatchNorm2d(F_int) ) self.psi = nn.Sequential( nn.Conv2d(F_int, 1, kernel_size=1,stride=1,padding=0,bias=True), nn.BatchNorm2d(1), nn.Sigmoid() ) self.relu = nn.ReLU(inplace=True) def forward(self,g,x): g1 = self.W_g(g) x1 = self.W_x(x) psi = self.relu(g1+x1) psi = self.psi(psi) return x*psi ``` 上述代码展示了如何构建一个简单的`Attention Block`类,它接受来自不同层次的空间位置上的特征向量作为输入,并输出经过加权后的特征表示形式。这些权重反映了各个通道对于特定任务的重要性程度[^3]。 #### 应用实例 在实际应用场景中,Attention U-Net已被广泛应用于多种类型的医学影像分析任务当中,比如肿瘤检测、器官轮廓提取等。相比于原始版本而言,加入注意力机制之后可以显著改善边界细节处理效果,减少误报率的同时也提高了真阳性发现的概率[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigDataMLApplication

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

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

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

打赏作者

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

抵扣说明:

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

余额充值