我们正在开发一个Java命令行应用程序,我们希望从许多外部(属性)文件中应用数据驱动的测试,并允许一些知识渊博的用户在不触及Java代码库的情况下添加测试。当然,我们要确保每次运行应用程序时都从干净状态开始(即没有静态类副作用,干净的文件环境......)。以下是一些选项:
(a)在单个JUnit类中的单个方法中运行所有测试,调用app的main()方法:
@Test
public void appTest () {
<get all properties files>
<for each property file>
String[] args = <construct command line from property file>
MyApp.main (args);
<test result>
...
}
不起作用,因为整个事情都在一个JVM中运行。
(b)用一种方法运行所有测试,分析应用程序:
@Test
public void appTest () {
<get all properties files>
<for each property file>
String[] args = <construct command line from property file>
<fork app with args>
<test result>
...
}
确实为我们提供了单独的JVM,但是JUnit(和Surefire)不了解各个测试,因此报告是无用的。
(c)每个JUnit类进行一次测试:
public class MyAppTest1 {
private static final String PROP_FILE = "src/test/resources/myapp/myapp1.properties
@Test
public void appTest () {
String[] args = <construct command line from PROP_FILE>
MyApp.main (args);
<test result>
}
}
这有效,但它很麻烦且重复,你必须为每个测试添加一个类。
(d)JUnit参数化测试(@RunWith(Parameterized.class)在同一个JVM中运行时没用。
(e)Surefire并行化是在JVM中。
我们显然在这里遗漏了一些东西,因为我们的测试情况并不罕见!任何建议非常感谢。
答案 0 :(得分:0)
至少部分答案:Surefire支持分配每个测试用例。请在您的surefire配置部分中尝试以下操作:
<reuseForks>false<reuseForks>
<forkCount>1<forkCount>
在http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html
上详细了解相关信息对于&#34;数据驱动测试&#34;的一般问题,最好是自定义Junit运行程序。这并不像你想象的那么难,只需看看Junit源代码https://github.com/junit-team/junit/tree/master/src/main/java/org/junit/runners中的runners包,并使用外部数据重新实现/扩展Parameterized Runner。