15

testng.xml ファイルを使用して定義されたいくつかのテストを Gradle に実行させようとしています。私のtestng.xmlファイルは次のようになります。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="mySuite" verbose="1">

  <listeners>
    <listener class-name="mypackage.MyListener" />
    <listener class-name="mypackage.TestOrderer" />
  </listeners>

  <test name="Tests">
    <classes>
      <class name="mytestpackage.CrazyTest1"/>
      <class name="mytestpackage.CrazyTest2"/>
      <class name="mytestpackage.CrazyTest3"/>
    </classes>
  </test>
</suite>

では、なぜこれが必要なのですか?ここにリストされているものと同様の注釈によって定義された方法でテストが編成されていることを確認したいと思います。ご想像のとおり、TestOrderer は IMethodInterceptor です。

ここに問題があります。Gradle が私の testng.xml ファイルを乗っ取り、テスト ディレクトリをスクレイピングして、実行したいテストを見つけているようです。これを無効にしても、メソッドを適切に実行できません。これは私がうまくいくはずだと思うものですが、うまくいきません。

test {
  useTestNG()
  options.suites("src/test/resources/crazyTestNG.xml") 
  # Adding 
  # scanForTestClasses = false 
  # causes zero tests to be executed, since the class names don't end in Test
}

それは簡単なことのように思えます... TestNGプロセスをフォークして実行させますが、Gradleに邪魔にならないように指示してテストを実行する方法がわかりません。

4

5 に答える 5

11

gradle での TestNG サポートが嫌いでした...生の TestNG を使用する場合と比較して、最も柔軟ではないことがわかりました。そしてgradleをいじるのにうんざりしました。私の解決策..Gradleタスクを使用してTestNGを直接実行します

task runTests(type: JavaExec, dependsOn: 'classes') {
    main = 'org.testng.TestNG'
    classpath = files("./src/test/resources",
                      project.sourceSets.main.compileClasspath,
                      project.sourceSets.test.compileClasspath,
                      project.sourceSets.main.runtimeClasspath,
                      project.sourceSets.test.runtimeClasspath)
    args = ["-parallel",  "methods", "-threadcount", "1", "-d", "./build/test-output", "./src/test/resources/test.xml"]
}

コマンドラインから実行します:

gradle runTests

于 2015-03-05T01:28:04.130 に答える
1

このメソッドは testng.xml ファイルを使用しませんが、testNG テスト グループをエミュレートし、JUnit テスト グループを Gradle タスクとして作成して順序付けし、ビルドの実行時にタスクの実行を順序付けて手動で順序付けすることもできます。

// in build.gradle
task testGroupOne(type: Test) {
   //include '**/*SuiteOne.*'
   include '**/SuiteOne.class'
   testReportDir = file("${reportsDir}/SuiteOne")
   testResultsDir = file("${buildDir}/test-results/SuiteOne")
}

task testGroupTwo(type: Test) {
   //include '**/*SuiteTwo.*'
   include '**/SuiteTwo.class'
   testReportDir = file("${reportsDir}/SuiteTwo")
   testResultsDir = file("${buildDir}/test-results/SuiteTwo")
}

次に、次のようにビルドを実行します: gradle testGroupTwo testGroupOne

于 2013-02-09T19:49:18.370 に答える
1

Gradle TestNG ランナーは、スキャンまたは名前のパターン マッチングによってテスト クラスが指定されていない場合、テストの実行を完全にスキップする必要があると想定します。

代わりに、スイート xml が提供されているかどうかも考慮する必要があります。この問題に Jira の問題を追加していただけますか?

考えられる回避策の 1 つは、options.listener を使用してリスナーを指定し、スイート xml ファイルをまったく使用しないことです。

test {
   options.listeners << 'mypackage.MyListener'
   options.listeners << 'mypackage.TestOrderer'
}

この方法では、テスト クラスを指定する必要がなく、スキャンにそれらを見つけさせることができます。

于 2011-01-22T04:39:45.937 に答える