【问题标题】:Spring/JUnit - running Unit Tests that aren't really "tests"Spring/JUnit - 运行并非真正“测试”的单元测试
【发布时间】:2017-12-26 11:39:42
【问题描述】:

这个问题更像是一种最佳实践方法。我们拥有的应用程序是 Spring Boot 1.5.4 并使用 Gradle 构建。我正在使用 Jenkins 创建夜间构建,并希望确保项目中的所有单元测试都通过。

然而,该项目有许多这样的“测试”:

@SpringBootTest(classes = {Application.class})
@RunWith(SpringRunner.class)
public class DatabaseCreationProcessImplTest {

这个特定的类创建了一个示例数据库图像供开发人员使用。当然,我们可以直接编写 SQL 脚本,但 Java 进程很有用,因为有代码也可以从外部源(例如 Liferay)查询数据。

我们为此使用单元测试的原因是因为开发人员可以轻松地在 IntelliJ 中运行它来加载新的数据库映像。然而,这并不是真正的“测试”,它使用测试运行器作为运行 Java 进程的快速方法。

我正在设置夜间构建,我不希望在构建中包含此测试。我可以在构建脚本中执行以下操作:

test {
exclude 'com/mydomain/service/util/impl/DatabaseCreationProcessImplTest.class'
}

但是,如果这样做,如果在 IDE 中使用 Spring 测试运行程序单独运行单元测试,则无法找到任何测试。我考虑过在 Jenkins 任务中传递一个布尔值来执行此操作,例如

test {
    systemProperties 'property': 'value'
    testLogging {
        events "passed", "skipped", "failed", "standardOut", "standardError"
    }

    // Exclusions go here
    if (Boolean.getBoolean('exclude.tests')) {
        exclude 'com/mydomain/service/util/impl/DatabaseCreationProcessImplTest.class'
    }
}

但是,这似乎是一种 hack/kludge... 寻找一些“最佳实践”方法来处理此问题的任何方法。 JUnit 是快速运行 Java 进程的正确方法吗?还有其他选择吗?是否可以创建一个 Gradle 脚本,开发人员也可以使用它来调用常见的 Java (Spring Boot) 进程?

【问题讨论】:

    标签: java spring unit-testing gradle junit


    【解决方案1】:

    我认为您可以使用 JUnit 的 @SuiteClasses 注释将您的非真正测试分组到一个测试套件中:

    @Suite.SuiteClasses(DatabaseCreationProcessImplTest.class)
    public class NotReallyTests {}
    

    然后使用您从 Jenkins 命令行传递的条件来排除 not-really-tests 套件:

    test {
        if (project.hasProperty('excludeNotReallyTests')) {
            useJunit {
                excludeCategories 'fully.qualified.name.of.your.NotReallyTests'
            }
        }
    }
    

    您的 Jenkins 命令行将是

    $ gradle -PexcludeNotReallyTests=true
    

    它比您的解决方案更简单,因为它会跟踪代码库中并非真正测试的测试分组,而不是 build.gradle 文件。

    【讨论】:

    • 今晚我要试试这个。我面临的最大挑战是当开发人员在本地运行“构建”或“测试”任务时,我希望排除这些特定的单元测试。如果这种方法可以让我单独运行任务,它应该可以工作。
    【解决方案2】:

    适用于 Android 的测试 API 提供了多个注释,用于将测试组合在一起。然后,您可以通过在命令行上提供注释之一来指定要运行的测试。我不知道如何实现这一点的细节。这只是一个建议,如果您有兴趣,请自行探索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多