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
.
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.
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() {
}
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>
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.
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.
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/"}
};
}
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>
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.