web-dev-qa-db-fra.com

TestNG: Comment exécuter plusieurs fois le même scénario de test?

Je souhaite exécuter plusieurs fois un scénario de test. Est-ce configurable dans le testng.xml? Si j'ajoute une boucle dans la méthode de test, les résultats de chaque exécution ne seront pas affectés dans le rapport testng.

29
Feixiong Liu

Vous ne pouvez pas le faire à partir du xml, mais dans l'annotation @Test - vous pouvez ajouter un attribut invocationCount avec le nombre de fois que vous souhaitez l'exécuter. Il sortirait au fur et à mesure que ces nombreux tests s'exécuteraient dans le rapport.

par exemple.

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

Vous avez manqué la fermeture du crochet à la fin, donc une petite correction.

38
niharika_neo

TestNg a une méthode. Vous pouvez utiliser cette méthode et exécuter votre scénario de test plusieurs fois:

@Test(invocationCount = 100)

public void testCount() {

}
7
Vipin Pandey

Jusqu'à présent, aucune des réponses ne donne vraiment à l'utilisateur la possibilité d'augmenter le nombre d'appels à partir du fichier testng, ce qui était demandé. Cette solution s'appuie sur la solution DataProvider de gaurav25.

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());  
    }
}

Vous pouvez maintenant modifier le nombre de jeux de tests exécutés via la fonction de test avec ce fichier 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

Vous pouvez ajouter plusieurs tests dans testng Suite et les exécuter. Dans tous les tests, les noms des classes doivent être identiques afin d'exécuter le même script plusieurs fois.

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();
    }
}

En utilisant l'annotation @Factory et @DataProvider de TestNG, vous pouvez exécuter plusieurs fois le même scénario de test avec des données différentes.

1
Radadiya Nikunj

Vous ne pouvez pas le faire à partir du XML, mais cela peut être réalisé en utilisant l'annotation @DataProvider dans TestNG.

Voici un exemple de code:

/* 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

Je sais assez tard pour la fête, mais si votre objectif est d'obtenir un rapport pour chaque exécution, vous pouvez essayer TestNG Listener IAnnotationTransformer

extrait de code

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);
    }

extrait xml

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

Si cela ne vous dérange pas d'utiliser Sprint, vous pouvez créer cette classe:

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);
        }
    }

}

Puis dans le test réel:

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() {

    }
}

Où N est le nombre de fois que vous voulez que le test se répète.

0
nzsquall