web-dev-qa-db-ja.com

TestNG:同じテストケースを複数回実行するにはどうすればよいですか?

テストケースを複数回実行したい。 testng.xmlで設定可能ですか?テストメソッドにループを追加しても、testngレポートの各実行の結果は影響を受けません。

29
Feixiong Liu

Xmlから実行することはできませんが、@ Testアノテーションでは、invocationCount属性に実行回数を追加できます。これらの多くのテストがレポートで実行されると、結果が出ます。

例えば。

@Test(invocationCount = 10)
public void testCount() {..}

最後に中かっこを閉じていなかったため、少し修正しました。

38
niharika_neo

TestNgには1つのメソッドがあります。このメソッドを使用して、テストケースを複数回実行できます。

@Test(invocationCount = 100)

public void testCount() {

}
7
Vipin Pandey

これまでの回答では、ユーザーがtestngファイルから呼び出し回数を増やすことはできませんでした。このソリューションは、gaurav25のDataProviderソリューションから便乗します。

class TestClass() {
    int invocationCount;

    @Parameters({ "invocationCount" })
    @BeginClass
    void BeginClass( @Optional("1") String invocationCount) {
        this.invocationCount = Ingeter.parse(invocationCount)
    }

    // It will return a 2D array of size 3x1
    @DataProvider(name="URLprovider")
    private Object[][] getURLs() {
        ArrayList<Object []> obj = new ArrayList<>(3 * this.invocationCount);

        for(int iCount = 0; iCount < this.invocationCount; ++iCount) {
            list.add( new Object[] {"https://www.google.co.in/"} );
            list.add( new Object[] {"http://www.gmail.com/"} );
            list.add( new Object[] {"http://stackoverflow.com/"} );
        }

        return list.toArray();
    }

    /* Since Data provider for this test method returns 2D array of size
     (3*invocationCount)x1, this test method will run 3*invocationCount 
     times **automatically** with 1 parameter every time. */
    @Test(dataProvider="URLprovider")
    private void notePrice(String url) {
        driver.get(url);
        System.out.println(driver.getTitle());  
    }
}

このtestng.xmlファイルを使用して、テスト関数で実行されるテストセットの数を変更できます。

<suite name="ESFService" verbose="1" parallel="methods" thread-count="1" data-provider-thread-count="10" >
    <test name="Basic">
        <classes>
            <class name="TestClass">
                <parameter name="invocationCount" value="5"/>
            </class>
        </classes>
    </test>
</suite>
4
John Chesshir

Testng Suiteに複数のテストを追加して実行できます。同じスクリプトを複数回実行するには、すべてのテストでクラス名が同じである必要があります。

1
Sreenivas
public class ProcessTest implements ITest {


    protected ProcessData processData;

    @Test
    public void executeServiceTest() {
        System.out.println(this.processData.toString());
    }

    @Factory(dataProvider = "processDataList")
    public RiskServiceTest(ProcessData processData) {
        this.processData = processData;
    }

    @DataProvider(name = "processDataList", parallel=true)
    public static Object[] getProcessDataList() {

        Object[] serviceProcessDataList = new Object[10];

    for(int i=0; i<=serviceProcessDataList.length; i++){
        ProcessData processData = new ProcessData();
        serviceProcessDataList[i] = processData
    }


        return serviceProcessDataList;
    }

    @Override
    public String getTestName() {

        return this.processData.getName();
    }
}

TestNGの@Factoryおよび@DataProviderアノテーションを使用することにより、異なるデータを使用して同じテストケースを複数回実行できます。

1
Radadiya Nikunj

Xmlから実行することはできませんが、TestNGで@DataProviderアノテーションを使用して実現できます。

サンプルコードを次に示します。

/* Since Data provider for this test method returns 2D array of size 3x1, 
this test method will run 3 times **automatically** with 1 parameter every time. */
@Test(dataProvider="URLprovider")
private void notePrice(String url) {
    driver.get(url);
    System.out.println(driver.getTitle());  
}

// It will return a 2D array of size 3x1
@DataProvider(name="URLprovider")
private Object[][] getURLs() {
  return new Object[][] {
    {"https://www.google.co.in/"},
    {"http://www.gmail.com/"},
    {"http://stackoverflow.com/"}
  };
}
1
gaurav25

私はパーティーにかなり遅れていることを知っていますが、あなたの目的が各実行のレポートを達成することである場合、TestNG Listener IAnnotationTransformerを試すことができます

コードスニペット

public class Count implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        // TODO Auto-generated method stub
        annotation.setInvocationCount(numberOfTimesTOExecute);
    }

xmlスニペット

<listeners>
<listener class-name="multiple.Count"></listener>
1
Faisal Uddin

Sprintの使用を気にしない場合は、このクラスを作成できます。

package somePackage;

import org.junit.Ignore;
import org.junit.runner.Description;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.springframework.test.annotation.Repeat;

public class ExtendedRunner extends BlockJUnit4ClassRunner {

    public ExtendedRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected Description describeChild(FrameworkMethod method) {
        if (method.getAnnotation(Repeat.class) != null
                && method.getAnnotation(Ignore.class) == null) {
            return describeRepeatTest(method);
        }
        return super.describeChild(method);
    }

    private Description describeRepeatTest(FrameworkMethod method) {
        int times = method.getAnnotation(Repeat.class).value();

        Description description = Description.createSuiteDescription(
            testName(method) + " [" + times + " times]",
            method.getAnnotations());

        for (int i = 1; i <= times; i++) {
            description.addChild(Description.createTestDescription(
                getTestClass().getJavaClass(), "[" + i + "] "
                        + testName(method)));
        }
        return description;
    }

    @Override
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
        Description description = describeChild(method);

        if (method.getAnnotation(Repeat.class) != null
                && method.getAnnotation(Ignore.class) == null) {
            runRepeatedly(methodBlock(method), description, notifier);
        }
        super.runChild(method, notifier);
    }

    private void runRepeatedly(Statement statement, Description description,
            RunNotifier notifier) {
        for (Description desc : description.getChildren()) {
            runLeaf(statement, desc, notifier);
        }
    }

}

次に、実際のテストで:

package somePackage;

import *.ExtendedRunner;

import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.Repeat;

@Ignore
@RunWith(ExtendedRunner.class)
public class RepeatedTest{
    @Repeat(value N)
    public void testToBeRepeated() {

    }
}

Nは、テストを繰り返す回数です。

0
nzsquall