使用JUnit运行端到端测试

时间:2014-03-07 19:06:56

标签: java junit integration-testing end-to-end

我们正在开发一个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中。

我们显然在这里遗漏了一些东西,因为我们的测试情况并不罕见!任何建议非常感谢。

1 个答案:

答案 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。