这个问题更多的是最佳实践方法。我们拥有的应用程序是 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'
}
但是,通过这样做,如果使用 Spring 测试运行程序在 IDE 中单独运行单元测试,则无法找到任何测试。我考虑过在 Jenkins 任务中传递一个 boolean 值来执行此操作,例如
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'
}
}
然而,这似乎是一种黑客/拼凑……任何寻找一些“最佳实践”方法来处理这个问题的方法。 JUnit 是快速运行 Java 进程的正确方法吗?还有其他选择吗?是否可以创建一个 Gradle 脚本供开发人员用来调用常见的 Java (Spring Boot) 流程?
最佳答案
我认为您可以使用 JUnit 的 @SuiteClasses 将您的非真正测试分组到测试套件中。注释:
@Suite.SuiteClasses(DatabaseCreationProcessImplTest.class)
public class NotReallyTests {}
然后使用从 Jenkins 命令行传递的条件来排除非真正测试套件:
test {
if (project.hasProperty('excludeNotReallyTests')) {
useJunit {
excludeCategories 'fully.qualified.name.of.your.NotReallyTests'
}
}
}
你的 Jenkins 命令行将是
$ gradle -PexcludeNotReallyTests=true
它比您的解决方案要简单一些,因为它跟踪代码库中并非真正测试的测试分组,而不是 build.gradle
文件。
关于java - Spring/JUnit - 运行并非真正的单元测试 "tests",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220387/