7

環境

を使用して、ant1-9-0.jarプログラムで JUnit テストを実行しています。ant-junit-1.9.0.jarant-launcher-1.9.0.jar

私のコードには、JUnit Taskを返す次の関数があります。

/**
 * Generates a JUnit task which runs every single test in a new JVM
 * @return task The JUnit task
 * @throws Exception
 */
public JUnitTask generateRunTestsTask() throws Exception {
    /* New JUnit task */
    JUnitTask task = new JUnitTask();
    task.init();
    
    /* Summary settings */
    JUnitTask.SummaryAttribute sa = new JUnitTask.SummaryAttribute();
    sa.setValue("withOutAndErr");
    task.setPrintsummary(sa);
    
    /* JVM configuration */
    task.setFork(true);
    task.setDir(new File(this.deliveryBinDir));
    task.createJvmarg().setValue("-Duser.dir=" + this.deliveryBinDir);
    
    /* Output to file */
    FormatterElement.TypeAttribute typeFile = new FormatterElement.TypeAttribute();
    typeFile.setValue("xml");
    FormatterElement formatToFile = new FormatterElement();
    formatToFile.setType(typeFile);
    task.addFormatter(formatToFile);
    
    /* Task options */
    task.setHaltonfailure(false);
    task.setShowOutput(true);
    task.setOutputToFormatters(true);
    
    List<String> testSuites = getTestJarList(this.deliveryLibFolder);
    for (String singleSuite : testSuites) {
        JUnitTest test = new JUnitTest(singleSuite);
        /* Sets reports location */
        test.setTodir(this.testReportsFolder);
        task.addTest(test);
    }
    
    return task;
}

JUnit テストは問題なく実行され、出力はファイルに正常に保存され.xmlます。

問題

(プロセス全体の最後だけでなく)結果をライブで表示したいので、出力をコンソールに出力する必要があります。そのために、ブロックFormatterElementのすぐ下に1 秒を追加しました。/** Output to file */

/* Output to screen */
FormatterElement.TypeAttribute typeScreen = new FormatterElement.TypeAttribute();
typeScreen.setValue("plain");
FormatterElement formatToScreen = new FormatterElement();
formatToScreen.setType(typeScreen);
formatToScreen.setUseFile(false);
formatToScreen.setOutput(System.out);
task.addFormatter(formatToScreen);

しかし、私のコンソールにはまだログが表示されません。を削除しようとしましたがformatToFile FormatterElement、成功しませんでした。何か提案はありますか?

ノート:

  • これらの単体テストは本当にフォークする必要があり、変更することはできません。
  • Ant ProjectAnt Targetの設定など、さらにコードが必要な場合はお知らせください。
  • 単体テストには実際にSysouts
  • 動作する一貫したbuild.xmlファイルを再現しました。
  • 必要に応じて、ここに Apache Ant JUnit リポジトリがあります。
4

2 に答える 2

4

Stéphane さん、junit タスクのコードは、コンソールへの出力を処理するのに適しているようです。

ANT の Main クラスのソース コードを確認しましたが、ログを表示できるようにビルド リスナーを定義する必要があります。

これは、ロギング目的でデフォルトのリスナーを定義する実際の例です。

BuildLogger logger = new DefaultLogger();
logger.setOutputPrintStream(System.out);
logger.setErrorPrintStream(System.err);
logger.setMessageOutputLevel(Project.MSG_INFO);
logger.setEmacsMode(true);
project.addBuildListener(logger); //add build listener to your define project
于 2013-08-14T10:21:52.920 に答える
0

Stéphane さん、単体テストの出力がないのは、おそらく JUnitTask.executeAsForked() にハードコードされたサブプロセス ストリーム ハンドラが存在することに関連しています (ant-junit のソース コードを参照してください)。

    Execute execute = new Execute(
        new JUnitLogStreamHandler(
            this,
            Project.MSG_INFO,
            Project.MSG_WARN),
        watchdog);

メソッドは非公開であり、別のストリーム ハンドラを渡す明らかな「公式」な方法は見当たりません。そのため、フォークされた JVM の出力を別の方法で処理したい場合は、ant-junit がオープン ソースであり、 JUnitLogStreamHandler により詳細な設定を使用するか、子プロセスの出力を処理する ExecuteStreamHandler の独自の実装を使用する、わずかに変更されたバージョンを作成します。

于 2013-08-13T20:23:49.400 に答える