web-dev-qa-db-ja.com

コマンドラインを使用してJUnitクラスから単一のテストを実行する

コマンドラインとJavaのみを使用して、JUnitクラスから単一のテストを実行できるようにするアプローチを見つけようとしています。

次を使用して、クラスからテストのセット全体を実行できます。

Java -cp .... org.junit.runner.JUnitCore org.package.classname

私が本当にやりたいことは次のようなものです:

Java -cp .... org.junit.runner.JUnitCore org.package.classname.method

または:

Java -cp .... org.junit.runner.JUnitCore org.package.classname#method

JUnitアノテーションを使用してこれを行う方法があるかもしれないことに気づきましたが、テストクラスのソースを手動で変更しないことをお勧めします(これを自動化しようとしています)。また、Mavenにはこれを行う方法があるかもしれないこともわかりましたが、可能であれば、Mavenに依存しないようにしたいと思います。

だから、これを行う方法はありますか?


私が探しているキーポイント:

  • JUnitテストクラスから単一のテストを実行する機能
  • コマンドライン(JUnitを使用)
  • テストソースの変更を避ける
  • 追加のツールを使用しない
89
Kevin Jalbert

カスタムのベアボーンJUnitランナーをかなり簡単に作成できます。 com.package.TestClass#methodNameという形式で単一のテストメソッドを実行するものを次に示します。

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

次のように呼び出すことができます。

> Java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

JUnitソースをざっと見てみると、JUnitはこれをネイティブにサポートしていないという同じ結論に達しました。 IDEにはすべてのアクションの中でも特にカーソルの下でテストメソッドを実行できるカスタムJUnit統合があるため、これは私にとって決して問題ではありませんでした。コマンドラインから直接JUnitテストを実行したことはありません。私は常にIDEまたはビルドツール(Ant、Maven)のどちらかで処理するようにしました。特に、デフォルトのCLIエントリポイント(JUnitCore)は、テストの失敗時にゼロ以外の終了コード以外の結果出力を生成しないためです。

注:JUnitバージョン4.9以上の場合、クラスパスに hamcrest ライブラリが必要です

76
Mark Peters

Mavenを使用してプロジェクトをビルドし、SureFire mavenプラグインを使用してjunitテストを実行します。この設定があれば、次のことができます。

mvn -Dtest=GreatTestClass#testMethod test

この例では、クラス "GreatTestClass"内で "testMethod"というテストメソッドを実行するだけです。

詳細については、 http://maven.Apache.org/surefire/maven-surefire-plugin/examples/single-test.html をご覧ください。

41
Yiling