Добрый день, использую связку Java+TestNG+Selenium
Возникла потребность в многократном запуске тестов с различными данными.
В итоге было решено использовать @Factory, которая отсылает в тестовый класс проперти с необходимыми данными.
@Factory
public Object[] createInstances() {
Object[] result = new Object[getTestDataSet().size()];
for(int i = 0; i < result.length; i++) {
result[i] = new TestClass(getTestDataSetAsProperties(getTestDataSet().get(i)));
}
return result;
}
private ArrayList<String> getTestDataSet(){
ArrayList<String> testdataPathFiles = new ArrayList<String>();
Scanner scanner = null;
try {
scanner = new Scanner(new File("src\\test\\resources\\testdata\\Testset.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while(scanner.hasNext()){
testdataPathFiles.add(scanner.next());
}
/*for(String s : testdataPathFiles){
System.out.println(s);
}*/
return testdataPathFiles;
}
private Properties getTestDataSetAsProperties(String path){
Properties properties = new Properties();
InputStream inputStream = null;
File file = new File(path);
try{
inputStream = new FileInputStream(file.getAbsoluteFile());
properties.load(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
В общем то проблем никаких не было, даже с параллельным/удаленным запусками. Ровно до тех пор, пока не был создан testng.xml в котором был уже набор тестов.
<?xml version="1.0" encoding="UTF-8" ?>
<suite name="Projectname. Whatwetestname">
<test name="WIN8. Chrome">
<parameter name="pcId" value="win8"/>
<packages>
<package name ="de.test.package.testclasses"/>
</packages>
</test>
</suite>
Собственно, не важно, параллельный ли запуск, или только на одной машине, не важно, расписаны ли классы после теста в или указан пэкэдж, результат всегда один и тот же.
Выполняется первый класс(не определенный, а тот, который тестнг запустил первым), а затем появляется эксепшн java.lang.NullPointerException
Т.е. такое ощущение, что данные из фабрик не передались в тест, хотя они явно считались.
Как мне кажется, ошибка зарыта где-то в аннотациях, но я, естественно, могу и ошибаться.
Структура тестов выглядит так:
@BeforeTest
Инициализация драйвера, открытие страницы, логин в страницу.
Данная аннотация вынесена в отдельный класс, от которого наследуются всего последующие тесты.
В тестовых классах
@BeforeClass
открытие нужной страницы.
Дальше, в зависимости от ф-циональности мы иногда используем @BeforeMethod который устанавливает какой-нибудь прекондишн
Оканчиваются тесты аннотацией
@AfterMethod
Где мы возвращаемся к какому-то начальному состоянию
@AfterClass
Где мы закрываем страницу
@AfterTest
Где убивается драйвер.
Собственно, если есть идеи, подскажите, куда копать.
Спасибо!