TestNG: как программно запустить пользовательский файл TestNG.XML
Я просмотрел несколько разных тем и веб-сайтов (а также API TestNG) в поисках того, как запускать и создавать собственные тесты. Я не нашел (или не понял), как я могу программно запустить собственный testng.xml (набор тестов).
Я создал файл testng.xml, похожий на этот:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="The Login Suite'" verbose="1" >
<test name="Some login check" >
<classes>
<class name="tests.first_login"/>
</classes>
</test>
<test name="Another login check" >
<classes>
<class name="tests.second_login"/>
</classes>
</test>
</suite>
Я знаю, что могу выполнить свой набор из Eclipse - но я не хочу этого. Зачем? Потому что у меня тест, запускаемый планировщиком. Поэтому мне нужно иметь настраиваемый файл testng.xml.
Я попытался создать виртуальный набор тестов XML с помощью кода, похожего на это:
TestListenerAdapter tla = new TestListenerAdapter();
TestNG tng = new TestNG();
tng.addListener(tla);
XmlSuite loginSuite = new XmlSuite();
loginSuite.setName("The Login Suite");
XmlTest first_test = new XmlTest();
first_test.setName("Some login check");
first_test.setSuite(loginSuite);
List<XmlClass> fistlogin_classes = new ArrayList<XmlClass>();
fistlogin_classes.add(new XmlClass("tests.fist_login"));
XmlTest second_test = new XmlTest();
second_test.setName("Another login check");
loginSuite.addTest(SOEtest);
List<XmlClass> secondlogin_classes = new ArrayList<XmlClass>();
secondlogin_classes.add(new XmlClass("tests.second_login"));
List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites.add(loginSuite);
tng.setXmlSuites(suites);
tng.run();
Но угадайте, что... это тоже не сработает. TestNg, похоже, не находит класс (ы), содержащие методы испытаний. Код выполняется успешно, но ни один из тестов не запущен, ни один не выполнен или пропущен.
Еще я попробовал экспортировать файл testng.xml в файл *.jar и определить его путь, подобный следующему:
TestListenerAdapter tla = new TestListenerAdapter();
TestNG tng = new TestNG();
tng.setXmlPathInJar("tests.jar");
tng.addListener(tla);
tng.run();
Примечание: тестовые тесты,jar находится в корне проекта. Как <... / loginproject / tests.jar>
Единственное, что я сделал на данный момент, это:
TestListenerAdapter tla = new TestListenerAdapter();
TestNG tng = new TestNG();
tng.setDefaultTestName("Login check");
tng.setDefaultSuiteName("The Login suite");
tng.setTestClasses(new Class[] { fist_login.class });
tng.addListener(tla);
tng.run();
Это, однако, не соответствует требованию моего проекта, заключающемуся в создании набора тестов, подобного тому, который показан в XML выше. Мне нужен 1 Test Suite, с различными тестами входа в систему, каждый из которых реализован в своем классе. Также проблема с последним решением состоит в том, что каждый класс, который я добавляю в список, выполняется одновременно, но мне нужно запускать их за другим.
Я бы предпочел решение, позволяющее мне напрямую выполнять пользовательский файл testng.xml, но я также был бы рад, если бы кто-то мог сказать мне, что я делаю неправильно при создании виртуального файла XML.
Спасибо всем заранее.
ОБНОВЛЕНИЕ И РЕШЕНИЕ. Я нашел решение, в котором я добавляю свой файл костюма в список и, в свою очередь, добавляю этот список с помощью метода API в список комплектов TestNG. Выглядит так:
List<String> testFilesList = new ArrayList<String>();
testFilesList.add("./testng.xml"); //test suite resides in the working directory's root folder
**testng.setTestSuites(testFilesList);** //you can addd multiple suites either here by adding multiple files or include all suites needed in the testng.xml file
testng.setUseDefaultListeners(false);
testng.addListener(htmlRep);
testng.run();
2 ответа
В примере с виртуальным XML вы пропустили добавление класса в тест и теста в ваш пакет.
т.е.
first_test.getClasses().addAll(fistlogin_classes);
loginSuite.addTest(first_test);
public static void main(String[] args) {
TestNG testng = new TestNG();
List<String> suites = Lists.newArrayList();
suites.add(".//TestNG.xml");
testng.setTestSuites(suites);
testng.run();
}