Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Запуск теста на нескольких инстансах сервера приложений


(ivan_ochc) #1

Добрый вечер.

Есть сервер приложений, на котором поднятно несколько инстансов. Возникла необходимость запускать один и тот же тест на всех инстансах сервера, а не только на том, на который мы случайно попадем через балансер. В итоге нужно получить тест, который будет ходить по всех указанных инстансах. Как эффективней реализовать это на Джаве?

Самый топорный способ - сделать отдельные проекты и спокойно запускать их себе в Дженкинсе. Но, возможно, есть способ элегантней? Если реализовать через один проект, как после завершения набора тестов на первом инстансе (напомню: в нашем случае новый инстанс - это новая ссылка в браузере), подставлять адреса второго инстанса и снова проходить этот же набор тестов?

При этом не дублируя вручную тесты и не добавляя в них новый адрес. Использую java+testng+maven+jenkins.

 


(Sergey Korol) #2

Не знаю, как у вас устроен фреймворк, но под свою архитектуру я бы сформировал 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");
        ...

Естественно, вам придется подключать грид. Зато таким образом вы ускорите прогон ваших тестов. И не надо будет создавать одинаковые джобы.


(ivan_ochc) #3

Затем в BeforeClass считывал бы эту ссылку через ITestContext и передавал бы ее в get / navigate.

 @BeforeClass(alwaysRun = true)

    public void start(ITestContext context) {
        String link = context.getCurrentXmlTest().getParameter("instanceLink");
        ...
А как ее передавать, если тип void?

(Sergey Korol) #4

start(ITestContext) - это всего лишь инициализатор. Он ничего не должен возвращать. И вам никто не мешает засетить линк в прайвит филд, а потом вытянуть его протектед геттером.


(ivan_ochc) #5

Значит, здесь 

 

public void start(ITestContext context) {
        String link = context.getCurrentXmlTest().getParameter("instanceLink");
 
мы только инициализируем параметр с xml и записываем его в строку String link? А как потом эту строку использовать для теста? К сожалению, "засетить линк в прайвит филд, а потом вытянуть его протектед геттером." мне мало чего сказало. 
К примеру, сейчас линк на стартовую страницу я получаю так:
public void open() {
driver.get(ConfigProperties.getProperty("login.url"));
}
 

 


(Sergey Korol) #6

 

private String link;
 
@BeforeClass
public void start(ITestContext context) {
        link = context.getCurrentXmlTest().getParameter("instanceLink");
        ...
}
 
protected String getPageLink() {
        return link;
}
 
public void open() {
        driver.get(getPageLink());
}

 


(ivan_ochc) #7

Спасибо за помощь.

Я что-то похожее и делал. Но на данный момент в дебаге вижу, что в линке null.


(Sergey Korol) #8

Если link = null, то либо instanceLink параметра не существует в вашем testng.xml, либо вы его некорректно определили, либо между вашим классом-инициализатором и тестами нет никакой связи. В какой момент дебаг показывает null? В BeforeClass методе или в самом тесте?


(ivan_ochc) #9

Попробовал еще раз. Заработало. Наверное, где-то здесь ошибься: "либо между вашим классом-инициализатором и тестами нет никакой связи."

Спасибо большое. 

Есть еще небольшой концептуальный вопрос. Как правильней осуществлять переход по разделам сайта: октрывать прямые ссылки или кликать по элементам на странице?


(Sergey Korol) #10

Тесты должны моделировать работу реального юзера. Заходя на какой-либо сайт, вы вряд ли будете держать в голове все возможные линки, и наверняка воспользуетесь предложенными средствами навигации. Аналогично с тестами. Линк вбиваете только при загрузке первой страницы. Конечно бывают случаи, когда необходимо написать "умную" навигацию. Типа юзер вызвал метод NavigateTo, передал пейдж, а тест сам отправился на нужную нам страницу, минуя все попутные степы.  В такой ситуации прямой редирект вполне допустим.