2017-03-10 9 views
1

次のサンプルコードがあります...テスト(およびレポート)を実行するときに、プロバイダが提供する説明フィールドにテスト名を設定したいそれは任意の文字列です)。プロバイダを使用してパラメータを省略するとTestNGテスト名が上書きされます

...しかし、ITestから拡張しても、すべてのプロバイダのパラメータがTestNameに追加されるようですが、私が欲しいのは説明だけです。

実際のテスト名は、 "TestName2 [1](TestName2,2,2,4)"ではなく "TestName1"でなければなりません。これはXMLレポートに表示されているもので、test.aftertest名です。

import org.testng.Assert; 
import org.testng.ITest; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

import java.lang.reflect.Method; 

public class TestNgProviderExample implements ITest{ 

    @Test(dataProvider = "summationProvider") 
    public void testProvider(String description, int number1, int number2, int sum) { 
     Assert.assertEquals(sum, number1 + number2); 
    } 

    @DataProvider(name = "summationProvider") 
    public Object[][] summationData() { 
     Object[][] testData = {{"TestName1",1,2,3},{"TestName2",2,2,4}}; 
     return testData; 
    } 

    private String reportedTestName = ""; 

    @BeforeMethod(alwaysRun = true) 
    public void testData(Method method, Object[] testData) { 
     reportedTestName = testData[0].toString(); 
    } 

    @Override 
    public String getTestName() { 
     return reportedTestName; 
    } 
} 
+0


:https://github.com/cbeust/testng/issues/1382 – juherr

答えて

2

パラメータなしで@Test注釈付きメソッドを実行するだけで解決できます。
パラメータの代わりに、私のソリューションはクラスフィールドとコンストラクタ@Factoryメソッドを使用します。私IntelliJのアイデアから書式設定と

public class TestClass implements ITest { 

    protected String description; 
    protected int firstNumber; 
    protected int secondNumber; 
    protected int sum; 

    @Test 
    public void testProvider() { 
     /** 
     * Minus or plus here to make it fail or pass. 
     */ 
     assertEquals(this.sum, this.firstNumber - this.secondNumber); 
    } 

    @Factory(dataProvider = "summationProvider") 
    public TestClass(String description, 
        int firstNumber, int secondNumber, int sum) { 
     this.description = description; 
     this.firstNumber = firstNumber; 
     this.secondNumber = secondNumber; 
     this.sum = sum; 
    } 

    @DataProvider(name = "summationProvider") 
    public static Object[][] summationData() { 
     Object[][] testData = {{"TestName1", 1, 2, 3}, {"TestName2", 2, 2, 4}}; 
     return testData; 
    } 

    @Override 
    public String getTestName() { 
     return this.description; 
    } 
} 

出力:もちろん enter image description here

@Factoryが同じTestClass、別のクラスをインスタンス化しないことが可能です。

パラメータから40個の別々の変数があり、それを短くしたい場合は...これらのパラメータのホルダーになるクラスを追加します。 ParametrizedInput。少なくとも、これらのインスタンス変数をすべて隠すことが可能になります。 descriptionも同様に2番目のクラスに置くことができます(この場合はThreadLocal<ParametrizedInput>の使用法が推奨されます)。
2番目のクラスはパラメータとともに増加しますが、これは普通の古いJavaオブジェクトであるため、テストで何も破壊してはいけません。 これらの変数をすべて設定したくない場合は、テストでlazilyパラメータにアクセスすることも考えられます。 専門家の(Krishnan Mahadevan)アドバイスに従って、方法の名前は@BeforeMethod - と@AfterMethod - 注釈付きの方法で設定できることを理解しました。

public class TestClass implements ITest { 

    protected static ThreadLocal<String> description 
      = new ThreadLocal<>(); 
    protected ParametrizedInput input; 

    @BeforeMethod 
    public void setUp(Method method) { 
     this.description.set(this.description.get() + " " + method.getName()); 
    } 

    @AfterMethod 
    public void tearDown(Method method) { 
     this.description.set(this.description.get().substring(0, 
       this.description.get().length() - method.getName().length())); 
    } 

    @Test 
    public void testProvider() { 
     assertEquals(this.input.getSum(), 
       this.input.getFirstNumber()/this.input.getSecondNumber()); 
    } 

    @Test 
    public void anotherTestProvider() { 
     assertEquals(this.input.getSum(), 
       this.input.getFirstNumber() - this.input.getSecondNumber()); 
    } 
    @Factory(dataProvider = "summationProvider") 
    public TestClass(String descriptionString, ParametrizedInput input) { 
     this.description.set(descriptionString); 
     this.input = input; 
    } 

    @DataProvider(name = "summationProvider") 
    public static Object[][] summationData() { 
     Object[][] testData = {{"TestName1", new ParametrizedInput(1, 2, 3)}, 
       {"TestName2", new ParametrizedInput(2, 2, 4)}}; 
     return testData; 
    } 

    @Override 
    public String getTestName() { 
     return this.description.get(); 
    } 
} 

パラメータHolderクラス:

public class ParametrizedInput { 

    private int firstNumber; 
    private int secondNumber; 
    private int sum; 

    public ParametrizedInput(int firstNumber, 
          int secondNumber, int sum) { 
     this.firstNumber = firstNumber; 
     this.secondNumber = secondNumber; 
     this.sum = sum; 
    } 

    public int getFirstNumber() { 
     return firstNumber; 
    } 

    public int getSecondNumber() { 
     return secondNumber; 
    } 

    public int getSum() { 
     return sum; 
    } 
} 

結果:私は、問題についての問題を作成した enter image description here

+0

ありがとう!工場外でこれを行う方法はありますか?私が扱っているコードベースでは難しくなるかもしれません。 – vicsz

+0

なぜそれが困難になることができますか?あるクラスにデータプロバイダやテストが多すぎる場合は、単純に分割します。 ) –

+0

継承されたコードベース.. 40個のパラメータのようなものは、40個のインスタンス変数を追加することを定義しないほうがいいですが、ソリューションが唯一の方法だと思われますこれを避けて...何かが欠けていない限り? – vicsz

関連する問題