We would like to run some of our tests each against a set of data values, verifying that the same conditions hold true for each. The data is currently stored in either flat files or in simple Excel spreadsheets.
My first thought was to create a TestNG DataProvider that would load the data from the file and be used to call the test method once for each data value. My problem is that different tests need to load data from different files and there doesn't appear to be any way to send a parameter to the DataProvider. Does anyone know if this is possible?
Ideally, I would like my code to look like the following (simplified example):
public class OddTest {
@DataProvider(name = "excelLoader")
public Iterator<Object[]> loadExcelData(String fileName) {
...
}
@Test(dataProvider = "excelLoader" dataProviderParameters = { "data.xls" })
public void checkIsOddWorks(int num)
assertTrue(isOdd(num));
}
}
Taken from the TestNG docs:
If you declare your @DataProvider as taking a java.lang.reflect.Method
as first parameter, TestNG will pass the current test method for this first parameter. This is particularly useful when several test methods use the same @DataProvider and you want it to return different values depending on which test method it is supplying data for.
For example, the following code prints the name of the test method inside its @DataProvider:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
System.out.println(m.getName()); // print test method name
return new Object[][] { new Object[] { "Cedric" }};
}
@Test(dataProvider = "dp")
public void test1(String s) {
}
@Test(dataProvider = "dp")
public void test2(String s) {
}
and will therefore display:
test1
test2
This can also be combined with the solution provided by desolat to determine data from the context and the method accordingly:
@DataProvider(name = "dp")
public Object[][] foodp(ITestContext ctx, Method method) {
// ...
}