web-dev-qa-db-ja.com

条件に基づいてTestNGテストを無効にする方法

現在、条件に基づいてTestNGテストを無効にする方法はありますか

現在TestNGでテストを無効にできることを知っています:

@Test(enabled=false, group={"blah"})
public void testCurrency(){
...
}

条件に基づいて同じテストを無効にしたいのですが、方法がわかりません。このようなもの:

@Test(enabled={isUk() ? false : true), group={"blah"})
public void testCurrency(){
...
}

これが可能かどうかは誰でも手がかりです。

24
Afamee

次の2つのオプションがあります。

アノテーショントランスフォーマーは条件をテストし、@ Testアノテーションをオーバーライドして、条件が満たされない場合に属性 "enabled = false"を追加します。

15
Cedric Beust

より簡単なオプションは、条件をチェックするメソッドで@BeforeMethodアノテーションを使用することです。テストをスキップする場合は、 SkipException をスローします。このような:

@BeforeMethod
protected void checkEnvironment() {
  if (!resourceAvailable) {
    throw new SkipException("Skipping tests because resource was not available.");
  }
}
35
Bruce

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>
9

Thirdオプションも仮定にすることができます TestNGの仮定 -仮定が失敗すると、TestNGはテストケースを無視するように指示されますしたがって、実行されません。

  • @Assumptionアノテーションの使用
  • Assumes.assumeThat(...)メソッドを使用したAssumptionListenerの使用

次の例を使用できます。 example

2
avivamg

私は、環境設定に基づいていくつかのテストを無効化/スキップするために、この注釈ベースの方法を好みます。メンテナンスが簡単で、特別なコーディング手法は必要ありません。

  • IInvokedMethodListenerインターフェイスの使用
  • カスタムの注釈を作成します。例:@SkipInHeadlessMode
  • SkipExceptionをスローする
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も含まれるエクステントレポートを取得するのに役立ちました。

0
PAQuality101