2012-12-28 64 views
2

这些测试应该在之后运行这个jar文件被构建。 他们应测试它是否运行, 以及它是否在给定某些输入文件的情况下生成正确的控制台输出。如何使用Maven测试Java控制台应用程序?

请问您可以指出控制台应用程序的这些测试的一些示例吗?这些测试是否必须用Java编写才能用于Maven?

还有一个类似的问题(Testing console based applications/programs - Java),但我需要的是黑匣子测试,而不是单元测试。它没有提到Maven。


UPDATE:

原来,它VAS很容易做到的。我的第一个问题是在看到如此多的定义(What is Unit test, Integration Test, Smoke test, Regression Test?; What's the difference between unit, functional, acceptance, and integration tests?; What are unit testing and integration testing, and what other types of testing should I know about?; What is an integration test exactly?)之后,对集成测试有一个误解。第二个问题是我不打算用Java编写这些测试,但最终我不得不学习如何使用java.lang.Runtime

首先,我已经加入这个我的pom.xml

<plugin> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

然后我就在的src/test/java下创建的* IT.java文件:

public class MyAppIT { 

    @Test 
    public void test() throws IOException { 
     Runtime runtime = Runtime.getRuntime(); 
     String cmd = "java -cp target/myapp.jar my.app.Main"; 
     Process process = runtime.exec(cmd); 
     InputStreamReader isr = new InputStreamReader(process.getErrorStream()); 
     BufferedReader br = new BufferedReader(isr); 
     Boolean containsUsage = false; 
     String line; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("Usage")) { 
       containsUsage = true; 
      } 
     } 
     assertTrue(containsUsage); 
    } 
} 

现在我用mvn验证而不是mvn包

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 

回答

3

看来你想要集成测试。

在许多情况下,应用程序是由持续集成(CI)系统构建,如Hudson,Travis或者某些程序。该CI在每次提交源代码后编译并运行单元测试。 编译成功后,触发集成测试项目。

集成测试驻留在单独的maven源项目中。你可以像src/test/java中的普通单元测试一样创建集成测试类。当然,你不要单独测试一个类 - 这就是单元测试 - 你需要为系统设置集成测试(连接正确的组件)并执行所需的测试“烟雾测试”。

因此,您可以创建另一个项目进行集成测试,并在构建应用程序后执行此项目。您可以创建一个maven parent-pom并使用子模块来避免手动集成测试构建。

测试类需要是java,位于src/test/java中,它们看起来像正常的单元测试,并且由maven运行。 当然,您可以在测试中启动一个非java程序并声明结果。

控制台应用程序有一个“”方法,所以我会在测试中调用主要方法。否则,你必须运行一个shell命令或其他东西。 (通过java.lang.Runtime中)

有测试控制台应用程序没有特长。除非你想测试用户界面 - 用户界面的自动化测试不是那么容易和困难,请澄清这是否是你的焦点。

+0

是的,我要的是测试如果程序实际运行,没有如果“** **为主”的方法运作。我不会称之为我的程序的界面测试不允许任何用户交互。它只是处理输入文件并输出结果。 – utapyngo

+0

命令行调用会发出对主方法的调用。您可以使用Runtime来执行“java my.app.Main”命令,您在测试项目中拥有完整的java可能性。 – burna

+0

不满意 - 还有问题吗? – burna

1

我会建议结合使用maven-invoker-pluginexec-maven-plugin。 Invoker创建一个子项目并运行它,exec插件启动你的JAR。调用者然后验证其输出。

例如,采取s3auth-relay项目一起来看看这款pom.xml。该模块本身生成一个JAR控制台应用程序,它是一个HTTP守护程序。 pom.xmlmaven-invoker-plugin配置的一部分。它启动控制台应用程序并检查它是否正常关闭。为了防止JAR作为守护进程启动,我们使用可选的-d标志。

该示例没有显示测试JAR输出的能力,但可以使用post build script机制maven-invoker-plugin

+0

不幸的是,maven-invoker-plugin旨在运行Maven作为maven-plugins集成测试的一部分,特别是控制台应用程序。 – khmarbaise

+0

只要您的控制台应用程序并不需要用户输入Maven的调用,插件是一个完美的结合 – yegor256

+0

你有一些用法示例? – khmarbaise

相关问题