Есть сервер приложений, на котором поднятно несколько инстансов. Возникла необходимость запускать один и тот же тест на всех инстансах сервера, а не только на том, на который мы случайно попадем через балансер. В итоге нужно получить тест, который будет ходить по всех указанных инстансах. Как эффективней реализовать это на Джаве?
Самый топорный способ - сделать отдельные проекты и спокойно запускать их себе в Дженкинсе. Но, возможно, есть способ элегантней? Если реализовать через один проект, как после завершения набора тестов на первом инстансе (напомню: в нашем случае новый инстанс - это новая ссылка в браузере), подставлять адреса второго инстанса и снова проходить этот же набор тестов?
При этом не дублируя вручную тесты и не добавляя в них новый адрес. Использую java+testng+maven+jenkins.
Не знаю, как у вас устроен фреймворк, но под свою архитектуру я бы сформировал testng.xml таким образом, чтобы он, во-первых, распараллеливал тесты, во-вторых, содержал N одинаковых блоков тестовых классов, в-третьих, передавал в качестве параметра ссылку на нужный мне инстанс. Затем в BeforeClass считывал бы эту ссылку через ITestContext и передавал бы ее в get / navigate.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite for multithread execution" parallel="tests" thread-count="N">
<test name="Run on first instance">
<parameter name="instanceLink" value="..."/>
<classes>
<class name="..."/>
<class name="..."/>
...
</classes>
</test>
<test name="Run on second instance">
<parameter name="instanceLink" value="..."/>
<classes>
<class name="..."/>
<class name="..."/>
...
</classes>
</test>
<test name="Run on third instance">
<parameter name="instanceLink" value="..."/>
<classes>
<class name="..."/>
<class name="..."/>
...
</classes>
</test>
...
</suite>
@BeforeClass(alwaysRun = true)
public void start(ITestContext context) {
String link = context.getCurrentXmlTest().getParameter("instanceLink");
...
Естественно, вам придется подключать грид. Зато таким образом вы ускорите прогон ваших тестов. И не надо будет создавать одинаковые джобы.
start(ITestContext) - это всего лишь инициализатор. Он ничего не должен возвращать. И вам никто не мешает засетить линк в прайвит филд, а потом вытянуть его протектед геттером.
String link = context.getCurrentXmlTest().getParameter("instanceLink");
мы только инициализируем параметр с xml и записываем его в строку String link? А как потом эту строку использовать для теста? К сожалению, "засетить линк в прайвит филд, а потом вытянуть его протектед геттером." мне мало чего сказало.
К примеру, сейчас линк на стартовую страницу я получаю так:
Если link = null, то либо instanceLink параметра не существует в вашем testng.xml, либо вы его некорректно определили, либо между вашим классом-инициализатором и тестами нет никакой связи. В какой момент дебаг показывает null? В BeforeClass методе или в самом тесте?
Попробовал еще раз. Заработало. Наверное, где-то здесь ошибься: "либо между вашим классом-инициализатором и тестами нет никакой связи."
Спасибо большое.
Есть еще небольшой концептуальный вопрос. Как правильней осуществлять переход по разделам сайта: октрывать прямые ссылки или кликать по элементам на странице?
Тесты должны моделировать работу реального юзера. Заходя на какой-либо сайт, вы вряд ли будете держать в голове все возможные линки, и наверняка воспользуетесь предложенными средствами навигации. Аналогично с тестами. Линк вбиваете только при загрузке первой страницы. Конечно бывают случаи, когда необходимо написать "умную" навигацию. Типа юзер вызвал метод NavigateTo, передал пейдж, а тест сам отправился на нужную нам страницу, минуя все попутные степы. В такой ситуации прямой редирект вполне допустим.