编程语言
首页 > 编程语言> > 如何使用Maven测试Java控制台应用程序?

如何使用Maven测试Java控制台应用程序?

作者:互联网

这些测试应在构建jar文件之后运行.
他们应该测试它是否可以运行
给定某些输入文件,是否产生正确的控制台输出.

您能否指出一些针对控制台应用程序的测试示例?这些测试是否必须用Java编写才能与Maven一起使用?

有一个类似的问题(Testing console based applications/programs – Java),但我需要的是黑盒测试,而不是单元测试.而且它没有提到Maven.

更新:

事实证明,这很容易做到.我的第一个问题是对集成测试的误解,因为在这里看到了太多的定义(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 verify而不是mvn package.

Results :

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

解决方法:

看来您要进行集成测试.

在许多情况下,该应用程序是由诸如Hudson,Travis或sth之类的持续集成(CI)系统构建的.每次提交源代码后,此CI都会编译并运行单元测试.
成功编译后,将触发集成测试项目.

集成测试位于单独的Maven源项目中.您将在src / test / java中创建像普通单元测试一样的Integration-Test-class.当然,您不会孤立地测试单个类(即单元测试),而是将系统设置为进行集成测试(连接正确的组件)并执行所需的测试“烟雾测试”.

因此,在您的情况下,您可以创建另一个项目进行集成测试,并在构建应用程序之后执行此项目.您可以创建一个maven父pom并使用子模块来避免手动进行集成测试构建.

测试类必须是Java,并且位于src / test / java中,它们看起来像普通的单元测试,并且由maven运行.
当然,您可以在该测试中启动一个非Java程序并声明结果.

控制台应用程序具有“ main”方法,因此我将在测试中调用main方法.否则,您必须运行shell命令或其他命令. (通过java.lang.Runtime)

测试控制台应用程序没有专长.除非您要测试用户界面-用户界面的自动测试并不容易,而且难度更大,请说明这是否是您的重点.

标签:maven,testing,console-application,java
来源: https://codeday.me/bug/20191031/1975918.html