package test.testng387; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.testng.Assert; import org.testng.ITestContext; import org.testng.ITestNGMethod; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * test for http://jira.opensymphony.com/browse/TESTNG-387 * The invocation-numbers logic in failed.xml is wrong for dataprovider and parallel=true * * The test will throw exception when numbers are prime, so getFailedInvocationNumbers() should be a list of prime numbers. * * @author freynaud */ public class FailedDPTest { // prime numbers < 10 private List<Integer> primes = new ArrayList<Integer>(); public FailedDPTest(){ primes.add(2); primes.add(3); primes.add(5); primes.add(7); } /** * DP generating all number from 0 to 9. * */ @DataProvider(name = "DP", parallel = true) public Iterator<Integer[]> getData() { List<Integer[]> list = new ArrayList<Integer[]>(); for (int i = 0; i < 10; i++) { list.add(new Integer[] { i }); } return list.iterator(); } /** * Throws an exception for a prime number. * @throws Exception */ @Test(dataProvider = "DP", groups = { "DPTest" }) public void isNotPrime(Integer i) throws Exception { if (primes.contains(i)){ throw new Exception(i+" is prime"); } } /** * validates that the failed invoc number are the correct ones, ie the prime numbers. * @param ctx */ @AfterClass(alwaysRun=true) public void check(ITestContext ctx){ ITestNGMethod testMethod = getMethod(ctx, "isNotPrime"); List<Integer> failed = testMethod.getFailedInvocationNumbers(); if (failed.size() != primes.size()){ throw new Error(); } for (Integer num : primes) { Assert.assertTrue(failed.contains(num),num+" should be present to be retried.It is not."); } } private ITestNGMethod getMethod(ITestContext ctx, String methodName) { ITestNGMethod method = null; for (int i = 0; i < ctx.getAllTestMethods().length; i++) { method = ctx.getAllTestMethods()[i]; if (method.getMethodName().equals(methodName)) { return method; } } throw new RuntimeException("test case creation bug."); } }