現在、条件に基づいてTestNGテストを無効にする方法はありますか
現在TestNGでテストを無効にできることを知っています:
@Test(enabled=false, group={"blah"})
public void testCurrency(){
...
}
条件に基づいて同じテストを無効にしたいのですが、方法がわかりません。このようなもの:
@Test(enabled={isUk() ? false : true), group={"blah"})
public void testCurrency(){
...
}
これが可能かどうかは誰でも手がかりです。
より簡単なオプションは、条件をチェックするメソッドで@BeforeMethodアノテーションを使用することです。テストをスキップする場合は、 SkipException をスローします。このような:
@BeforeMethod
protected void checkEnvironment() {
if (!resourceAvailable) {
throw new SkipException("Skipping tests because resource was not available.");
}
}
TestNGでテストを「無効化」する制御を可能にする方法は2つあります。
注意すべき非常に重要な違いは、IannotationTransformerを実装するとReflectionを使用して、指定した条件に基づいて個々のテストを無効にする一方で、SkipExceptionが後続のすべてのテストを中断することです。 SkipExceptionとIAnnotationTransfomerの両方について説明します。
スキップ例外の例
import org.testng.*;
import org.testng.annotations.*;
public class TestSuite
{
// You set this however you like.
boolean myCondition;
// Execute before each test is run
@BeforeMethod
public void before(Method methodName){
// check condition, note once you condition is met the rest of the tests will be skipped as well
if(myCondition)
throw new SkipException();
}
@Test(priority = 1)
public void test1(){}
@Test(priority = 2)
public void test2(){}
@Test(priority = 3)
public void test3(){}
}
IAnnotationTransformerの例
もう少し複雑ですが、その背後にあるアイデアは、リフレクションと呼ばれる概念です。
ウィキ- http://en.wikipedia.org/wiki/Reflection_(computer_programming)
最初にIAnnotationインターフェースを実装し、これを* .Javaファイルに保存します。
import Java.lang.reflect.Constructor;
import Java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
public class Transformer implements IAnnotationTransformer {
// Do not worry about calling this method as testNG calls it behind the scenes before EVERY method (or test).
// It will disable single tests, not the entire suite like SkipException
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod){
// If we have chose not to run this test then disable it.
if (disableMe()){
annotation.setEnabled(false);
}
}
// logic YOU control
private boolean disableMe()){
}
次に、テストスイートでJavaファイルを@BeforeClass関数で次のように実行します。
import org.testng.*;
import org.testng.annotations.*;
/* Execute before the tests run. */
@BeforeClass
public void before(){
TestNG testNG = new TestNG();
testNG.setAnnotationTransformer(new Transformer());
}
@Test(priority = 1)
public void test1(){}
@Test(priority = 2)
public void test2(){}
@Test(priority = 3)
public void test3(){}
最後のステップは、build.xmlファイルにリスナーを確実に追加することです。鉱山は次のようになりました。これはbuild.xmlの1行だけです。
<testng classpath="${test.classpath}:${build.dir}" outputdir="${report.dir}"
haltonfailure="false" useDefaultListeners="true"
listeners="org.uncommons.reportng.HTMLReporter,org.uncommons.reportng.JUnitXMLReporter,Transformer"
classpathref="reportnglibs"></testng>
私は、環境設定に基づいていくつかのテストを無効化/スキップするために、この注釈ベースの方法を好みます。メンテナンスが簡単で、特別なコーディング手法は必要ありません。
public class ConditionalSkipTestAnalyzer implements IInvokedMethodListener {
protected static PropertiesHandler properties = new PropertiesHandler();
@Override
public void beforeInvocation(IInvokedMethod invokedMethod, ITestResult result) {
Method method = result.getMethod().getConstructorOrMethod().getMethod();
if (method == null) {
return;
}
if (method.isAnnotationPresent(SkipInHeadlessMode.class)
&& properties.isHeadlessMode()) {
throw new SkipException("These Tests shouldn't be run in HEADLESS mode!");
}
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
//Auto generated
}
}
詳細を確認してください: https://www.lenar.io/skip-testng-tests-based-condition-using-iinvokedmethodlistener/
SkipException:クラスに@Testメソッドが1つしかない場合に便利です。データドリブンフレームワークの場合と同様に、いくつかの条件に基づいて実行またはスキップする必要があるTestメソッドが1つだけあります。したがって、条件をチェックするためのロジックを@Testメソッド内に配置して、目的の結果を取得しました。テストケースの結果がPass/Failであり、特定のSkipも含まれるエクステントレポートを取得するのに役立ちました。