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


95

コマンドラインと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を使用)
  • テストソースを変更しない
  • 追加のツールの使用を避ける

4
クール、もう1つの「Unix is my IDE」タイプの愛好家。エディターにIDEを使用するのは好きですが(特にNetBeansのvimプラグインを使用)、「永久に」持続し、任意の構成でアセンブルできる小さな鋭いツールは、継続的な難解な機能を常に再学習するよりも優れていることに同意しますIDEブランドとバージョンのシリーズ。よかったね!
Roboprog

2
あなたはメイベンを避けたいと言いました。、こちらをご覧参照のmaven使ってこれを実行したい人のためmaven.apache.org/plugins/maven-surefire-plugin/examples/...
reevesy

回答:


79

カスタムのベアボーン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クラスパスにライブラリを


2
実際、テストのアサーションが失敗したときにログに完全なスタックトレースが表示されることと、未定義の期待を説明する各アサーションからの(定義されている場合はオプション)メッセージを覚えているようです。回避策をありがとう。
Roboprog

48

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

mvn -Dtest=GreatTestClass#testMethod test

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

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


-2

私たちはIntelliJを使用し、かなりの時間をかけてそれを理解しようとしました。

基本的に、2つのステップが含まれます。

手順1:テストクラスをコンパイルする

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

ステップ2:テストを実行する

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest


6
これは、1つのテストだけでなく、クラス内のすべてのテストを実行します。
強盗2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.