2

次のテストクラスがあるとします。

@Listeners([FactoryLogger.class])
class DataProviderOnFactoryTest {
    private String s;
    private int i;

    @Factory(dataProvider = "data")
    DataProviderOnFactoryTest(String test, Integer i) {
        this.test = test
    }

    @DataProvider
    public static Object[][] data() {
        return [["Value 1", 1], ["Value 2", 2]]
    }

    @Test
    public void test() {
        // A test!
    }
}

@Factory を使用してコンストラクターに渡された値をテストリスナーに取得するにはどうすればよいですか?

class FactoryLogger extends TestListenerAdapter {
    @Override
    void onTestFailure(ITestResult tr) {
        super.onTestFailure(tr)

        //TODO: Need values that were passed into the constructor!
        println(tr.getTestName() + 
            ": failed when test class was provided parameters [" 
                + _____ + ", " + _____ + "]")        
    }
}

getParameters() を含む ITestResult オブジェクトを確認しましたが、これは @DataProvider がテスト メソッドにある場合にのみ機能します。テストクラスには多くの変数がある可能性があるため、リフレクションを使用してフィールドを取得することもできません。

4

2 に答える 2

1

私は同じ問題に遭遇しました。以下は私の解決策です。私の場合、テストメソッドが失敗したパラメーターを確認するには、パラメーターを sysout にダンプするだけで十分でした。テスト後にパラメーターを手元に置く必要がある場合は、(うまくいけば:))このソリューションを簡単に拡張できます。


では、いざ…


toString()パラメータをいくつかのコンポジットにラップし、メソッド をオーバーライドしてください。

public interface CommonTestParameter {

    String getStuff();
    Object getMoreStuff();
}

public class TestParameterImpl implements CommonTestParameter {

    private final String stuff;
    private final Object moreStuff;

    public TestParameterImpl(String aStuff, Object aMoreStuff){
        this.stuff = aStuff;
        this.moreStuff = aMoreStuff;
    }

    @Override
    public String getStuff(){
        return this.stuff;
    }

    @Override
    public Object getMoreStuff(){
        return this.moreStuff;
    }

    @Override
    public String toString(){
        return "stuff = \"" + this.stuff + "\", moreStuff = \"" + this.moreStuff.toString() + "\"";
    }
}

テスト クラスの抽象的な親を作成します。

public abstract class AbstractTestParent implements ITest {

    private String testName = "";

    // This method actually is what provides you with the functionality of renaming 
    // your tests for the standard testNG logger
    @Override 
    public String getTestName(){
        return this.testName;
    }

    protected abstract CommonTestParameter getTestParameter();    

    @BeforeMethod
    public void beforeMethod(Method aMethod) {
        this.testName = aMethod.getName() + "[" + getTestParameter().toString() + "]";
    }
}

最後に、テスト クラスを作成します。

public class TestClassImpl extends CommonTestParent {

    private CommonTestParameter testParam;

    @Override
    protected CommonTestParameter getTestParameter(){
        return this.testParam;
    }

    @DataProvider(name = "awesomeDataProvider")
    public static Iterator<Object[]> provideData(){
        List<Object[]> dataList = new LinkedList<Object[]>();
        dataList.add(new TestParameterImpl("Stuff1!", "More stuff1!"));
        dataList.add(new TestParameterImpl("Stuff2!", "More stuff2!"));
        return dataList.iterator();
    }

    @Factory(dataProvider = "awesomeDataProvider")
    public TestClassImpl(CommonTestParameter aTestParam){
        this.testParam = aTestParam;
    }

    @Test
    public void testStuff(){
        System.out.println(this.testParam.getStuff());
    }

    @Test
    public void testMoreStuff(){
        System.out.println(this.testParam.getMoreStuff().toString());
    }
}


これらのテストを実行するたびに、標準形式のコンソール出力の代わりに

PASSED: testStuff
PASSED: testStuff
PASSED: testMoreStuff
PASSED: testMoreStuff

メソッドをオーバーライドして指定した形式で、テストメソッドを呼び出した引数が実際に表示されますtoString()

PASSED: testStuff[stuff = "Stuff1!", moreStuff = "More stuff1!"]
PASSED: testStuff[stuff = "Stuff2!", moreStuff = "More stuff!"]
PASSED: testMoreStuff[stuff = "Stuff1!", moreStuff = "More stuff1!"]
PASSED: testMoreStuff[stuff = "Stuff2!", moreStuff = "More stuff2!"]


実際にパラメーターをさらに処理する必要がある場合は、この概念を反復処理してMap<String, List<CommonTestParameter>>(キーはメソッド名を表し、値はメソッドを呼び出したすべてのパラメーターを表す) に格納してから、何らかの@AfterSuiteメソッドで解析できます。


これが役に立てば幸いです、ジャネック。

于 2013-11-27T17:14:22.153 に答える
-1

抽象class FactoryLogger化して、抽象化機能を持たせますgetTestParams()。次に、拡張する各クラスはFactoryLogger、パラメーターを保存してに渡す必要がありgetTestParams()ます。

于 2013-10-02T22:35:18.760 に答える