5

これらのテストは、jarファイルがビルドされた後に実行する必要があります。彼らはそれがまったく実行されているかどうか、そして特定の入力ファイルが与えられたときに正しいコンソール出力を生成するかどうかをテストする必要があります。

コンソールアプリケーションのそのようなテストのいくつかの例を指摘できますか?これらのテストは、Mavenで使用するためにJavaで作成する必要がありますか?

同様の質問(コンソールベースのアプリケーション/プログラムのテスト-Java)がありますが、必要なのは単体​​テストではなくブラックボックステストです。そして、それはMavenについては言及していません。


アップデート:

非常に簡単に実行できることがわかりました。私の最初の問題は、ここで非常に多くの定義を見た後の統合テストの誤解でした(ユニットテスト、統合テスト、スモークテスト、回帰テストとは何ですか? ;ユニット、機能、受け入れ、統合テストの違いは何ですか? ;ユニットテストとは何ですか?統合テスト、および他にどのような種類のテストについて知っておくべきですか? ;統合テストとは正確には何ですか?)2番目の問題は、これらのテストを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パッケージの代わりにmvnverifyを使用しています。

Results :

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

2 に答える 2

3

統合テストが必要なようです。

多くの場合、アプリケーションは、Hudson、Travis、sthなどの継続的インテグレーション(CI)システムによって構築されます。このCIは、ソースコードにコミットするたびに単体テストをコンパイルして実行します。コンパイルが成功すると、統合テストプロジェクトがトリガーされます。

統合テストは、別のMavenソースプロジェクトにあります。src / test/javaに通常の単体テストのような統合テストクラスを作成します。もちろん、単一のクラスを単独でテストすることはありません。つまり、単体テストです。統合テスト用にシステムをセットアップし(適切なコンポーネントを配線し)、必要なテスト「スモークテスト」を実行します。

したがって、あなたの場合、統合テスト用の別のプロジェクトを作成し、アプリケーションのビルド後にこれを実行することができます。Mavenの親pomを作成し、サブモジュールを使用して、手動の統合テストビルドを回避できます。

テストクラスはjavaであり、src / test / javaにある必要があります。これらは通常の単体テストのように見え、mavenによって実行されます。もちろん、そのテストでJava以外のプログラムを開始し、結果をアサートすることもできます。

コンソールアプリには「main」メソッドがあるため、テストではmainメソッドを呼び出します。それ以外の場合は、シェルコマンドなどを実行する必要があります。(java.lang.Runtime経由)

コンソールアプリのテストに専門はありません。ユーザーインターフェイスをテストする場合を除いて、ユーザーインターフェイスの自動テストは簡単ではなく、より困難です。これが焦点であるかどうかを明確にしてください。

于 2012-12-28T12:32:50.713 に答える
1

maven-invoker-pluginをexec-maven-pluginと組み合わせて使用​​することをお勧めします。Invokerはサブプロジェクトを作成して実行し、execプラグインがJARを開始します。次に、呼び出し元はその出力を検証します。

たとえばpom.xmls3auth-relayプロジェクトでこれを見てください。モジュール自体は、HTTPデーモンであるJARコンソールアプリケーションを生成します。pom.xmlは構成の一部ですmaven-invoker-plugin。コンソールアプリケーションを起動し、正常にシャットダウンするかどうかを確認します。JARがデーモンとして起動しないようにするために、オプションの-dフラグを使用しています。

この例では、JARの出力をテストする機能は示されていませんが、ビルド後のスクリプトメカニズムを使用してテストすることは可能ですmaven-invoker-plugin

于 2012-12-28T14:49:25.823 に答える