24

TestNGをプログラムで(データプロバイダーを使用して)呼び出す必要があるプロジェクトに取り組んでいます。レポートで @Test メソッドの名前を取得していることを除いて、問題はありません。これは、多くのケースを処理するための一般的なものです。私たちが望むのは、レポートで意味のある名前を取得することです。

私はこれについて調査していて、3つの方法を見つけましたが、残念ながら、すべて失敗しています。

1) ITest を実装する

私はこれについてここここで見つけました

@Testメソッドに入るとすぐに、必要な名前を設定しています(試した3つの方法すべてで、これが名前の設定方法です)。この名前はgetTestName()から返されます。私が観察したのは、 @Test の前後に getTestName() が呼び出されていることです。最初はnullを返し(NullPointerExceptionを処理するために、nullの代わりに ""を返します)、後で正しい値を返します。しかし、これがレポートに反映されているとは思いません

編集:また、artdanil の提案に従って from@BeforeMethod という名前を設定してみました

2と3

どちらも、上記の 2 番目のリンクに記載されているソリューションに基づいています。

XmlSuite で setName をオーバーライドすることにより、取得しています

Exception in thread "main" java.lang.AssertionError: l should not be null
        at org.testng.ClassMethodMap.removeAndCheckIfLast(ClassMethodMap.java:58)
        at org.testng.internal.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:208)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:114)
        at org.testng.TestRunner.privateRun(TestRunner.java:767)
        ...

toString() をオーバーライドすることで、これらはログに (私のコメントとともに) 表示されますが、レポートには更新がありません

[2013-03-05 14:53:22,174] (Main.java:30) - calling execute 
    [2013-03-05 14:53:22,346] GenericFunctionTest.<init>(GenericFunctionTest.java:52) - inside constructor
    [2013-03-05 14:53:22,372] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning **//this followed by 3 invocations before arriving at @Test method**
    [2013-03-05 14:53:22,410] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning 
    [2013-03-05 14:53:22,416] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning 
    [2013-03-05 14:53:22,455] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning 
    [2013-03-05 14:53:22,892] GenericFunctionTest.<init>(GenericFunctionTest.java:52) - inside constructor 
    [2013-03-05 14:53:23,178] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning **//again blank as i havent set it yet**
    [2013-03-05 14:53:23,182] GenericFunctionTest.getResult(GenericFunctionTest.java:69) - inside with test case:TestCase{signature=Signature{...}}**//I am setting it immedietely after this**
    [2013-03-05 14:53:23,293] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning MyMethodName **//What i want**
    [2013-03-05 14:53:23,299] GenericFunctionTest.toString(GenericFunctionTest.java:276) - returning MyMethodName **// again**

編集:テストメソッドのエントリで値を設定するのではなく、値をハードコーディングして、3つすべてを再試行しました。でも同じ結果

4

7 に答える 7

15

私は同じ問題を抱えていました.TestNGのネイティブインジェクションを@BeforeMethod使用して、メソッド名とテストパラメーターを提供するために、 で注釈が付けられたメソッドにテストケース名を格納するフィールドを設定すると役立つことがわかりました。テスト名は、 によって提供されるテスト パラメータから取得されます。テスト メソッドにパラメーターがない場合は、メソッド名を報告するだけです。DataProvider

//oversimplified for demontration purposes
public class TestParameters {
    private String testName = null;
    private String testDescription = null;

    public TestParameters(String name,
                          String description) {
        this.testName = name;
        this.testDescription = description;
    }

    public String getTestName() {
        return testName;
    }
    public String getTestDescription() {
        return testDescription;
    }
}

public class SampleTest implements ITest {
    // Has to be set to prevent NullPointerException from reporters
    protected String mTestCaseName = "";

    @DataProvider(name="BasicDataProvider")
    public Object[][] getTestData() {
        Object[][] data = new Object[][] {
                { new TestParameters("TestCase1", "Sample test 1")},
                { new TestParameters("TestCase2", "Sample test 2")},
                { new TestParameters("TestCase3", "Sample test 3")},
                { new TestParameters("TestCase4", "Sample test 4")},
                { new TestParameters("TestCase5", "Sample test 5") }
        };
        return data;
    }

    @BeforeMethod(alwaysRun = true)
    public void testData(Method method, Object[] testData) {
        String testCase = "";
        if (testData != null && testData.length > 0) {
            TestParameters testParams = null;
            //Check if test method has actually received required parameters
            for (Object testParameter : testData) {
                if (testParameter instanceof TestParameters) {
                    testParams = (TestParameters)testParameter;
                    break;
                }
            }
            if (testParams != null) {
                testCase = testParams.getTestName();
            }
        }
        this.mTestCaseName = String.format("%s(%s)", method.getName(), testCase);
    }

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

    @Test(dataProvider="BasicDataProvider")
    public void testSample1(TestParameters testParams){
        //test code here
    }

    @Test(dataProvider="BasicDataProvider")
    public void testSample2(TestParameters testParams){
        //test code here
    }

    @Test
    public void testSample3(){
        //test code here
    }
}

編集:以下のコメントに基づいて、レポートのサンプルが役立つことに気付きました。

上記のコードを実行したレポートからの抜粋:

<testng-results skipped="0" failed="0" total="5" passed="5">
  <suite name="SampleTests" duration-ms="2818" started-at="<some-time>" finished-at="<some-time>">
    <test name="Test1" duration-ms="2818" started-at="<some-time>" finished-at="<some-time>">
        <test-method 
            status="PASS" 
            signature="testSample1(org.example.test.TestParameters)[pri:0, instance:org.example.test.TimeTest@c9d92c]"
            test-instance-name="testSample1(TestCase5)"
            name="testSample1" 
            duration-ms="1014"
            started-at="<some-time-before>" 
            data-provider="BasicDataProvider" 
            finished-at="<some-time-later>" >
            <!-- excluded for demonstration purposes -->
        </test-method>
        <!-- the rest of test results excluded for brevity -->
    </test>
  </suite>
</testng-result>

getTestName()メソッドから返される値は、test-instance-name属性ではなく属性にあることに注意してくださいname

于 2013-03-11T21:37:42.540 に答える
1

getTestName() メソッドを必要とする org.testng.ITest インターフェースを実装してみてください。このようにして、レポートは戻り値を適切に処理します。

于 2015-01-05T00:03:28.710 に答える