t.me/atinfo_chat Telegram группа по автоматизации тестирования

Порядок выполнения тестов в наборе testng

Теги: #<Tag:0x00007f748380bbb0> #<Tag:0x00007f748380bae8> #<Tag:0x00007f748380b9f8>

Всем привет.
Имеется класс с тестами и конфиг testng

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1" >

    <test name="createDemo" >
        <parameter name="nameFile" value="demoAccountValidData.json"/>
        <classes>
            <class name="tests.TestDemoAccount">
                <methods>
                    <include name="createDemoAccount" />
                </methods>
            </class>
        </classes>
    </test>

    <test name="notCreateDemo"  >
        <parameter name="nameFile" value="demoAccountInvalidData.json"/>
        <classes>
            <class name="tests.TestDemoAccount">
                <methods>
                    <include name="notCreateDemoAccount" />
                </methods>
            </class>
        </classes>
    </test>
</suite>

При запуске выполняется тест второй по списку, то есть notCreateDemoAccount и после успешного выполнения к первому не приступает.

Подскажите в чем косяк?

Если убрать из XML тест notCreateDemo, запустится ли “createDeAccount” ?
Может у вас <include name="createDemoAccount" /> написан с опечатой и ТестНГ не видит такого метода

Может поможет прояснить ситуацию.

В том, то и дело, что если убрать notCreateDemo, то CreateDemo, отлично запускается
Опечатки нет точно. Более того, если установить зависимость теста notCreateDemo от createDemo через dependsOnMethods, то валится ошибка, говорящая, что отсутствует тест CreateDemo
Я не понимаю этой магии) уже всю голову сломала) сначала думала дело в приоритете невыставленном, но и приоритет не помогает)

Приоретизация вообще не работает через priority.

Покажите как выглядит тестовый класс где находятся эти методы

public class TestDemoAccount extends TestBase {

    ObjectMapper mapper = new ObjectMapper();
    String customer = app.properties.getProperty("WEB_LOGIN");


    @DataProvider(name = "data")
    public Iterator<Object[]> testData(ITestContext nameFile) throws IOException {
        File file = app.getFile(nameFile);
        List<DemoAccount> myObjects = mapper.readValue(file, new TypeReference<List<DemoAccount>>() {
        });
        Iterator<Object[]> iterator = myObjects.stream().map((g) -> new Object[]{g}).collect(Collectors.toList()).iterator();
        return iterator;
    }

    @Test(dataProvider = "data")
    public void createDemoAccount(DemoAccount demo) throws InterruptedException {
        app.goTo().demoPage();
        Objects<DemoAccount> before = app.db().demoAccount(customer);
        app.accountDemo().createDemoAccount();
        app.accountDemo().fillDemoAccount(demo);
        app.accountDemo().submitDemoAccount();
        Assert.assertTrue(app.accountDemo().isTextPresent("Ваш демо-счет успешно создан"));
        Objects<DemoAccount> after = app.db().demoAccount(customer);
        Assert.assertEquals(after.size(), before.size() + 1);
        Assert.assertEquals(after, before.withAdded(demo.setId(after.stream().mapToInt((g) -> g.getId()).max().getAsInt())));
/*                .setTypeAccount(after.stream().map( (g) -> g.getTypeAccount()).iterator().next())
                .setAmount(after.stream().map((g) -> g.getAmount()).iterator().next())
                .setCurrency(after.stream().map((g) -> g.getCurrency()).iterator().next())));*/
    }

    @Test(dataProvider = "data")
    public void notCreateDemoAccount(DemoAccount demo) throws InterruptedException {
        app.goTo().demoPage();
        Objects before = app.db().demoAccount(customer);
        app.accountDemo().createDemoAccount();
        app.accountDemo().fillDemoAccount(demo);
        app.accountDemo().submitDemoAccount();
        Assert.assertFalse(app.accountDemo().isTextPresent("Ваш демо-счет успешно создан"));
        app.goTo().demoPage();
        Objects after = app.db().demoAccount(customer);
        Assert.assertEquals(after.size(), before.size());
        Assert.assertEquals(after, before);
    }

}

Очень странно.
Я сделал такую же конфигупацию что и у вас и оба теста срабатывают
модет быть дело в ТестНГ версии…
я пробовал с <version>7.1.0</version> попробуйте и вы с ней.

Всё работает, просто что-то не то делаете. Я тоже думал проблема с selenide , но меня переубедили

Запустите в режиме debug и пришлите лог, скорее всего не очевидная ошибка в коде или конфиге

Все таки testng пошел выполнять сначала createDemo


но на первой же строчке отваливается с InvocationTargetException

driver почему-то не инициализировался

если порядок меняешь в конфиге, то отрабатывает сначала createDemo

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1" >
    <test name="notCreateDemo"  >
        <parameter name="nameFile" value="demoAccountInvalidData.json"/>
        <classes>
            <class name="tests.TestDemoAccount">
                <methods>
                    <include name="notCreateDemoAccount" />
                </methods>
            </class>
        </classes>
    </test>

    <test name="createDemo" >
        <parameter name="nameFile" value="demoAccountValidData.json"/>
        <classes>
            <class name="tests.TestDemoAccount">
                <methods>
                    <include name="createDemoAccount" />
                </methods>
            </class>
        </classes>
    </test>

</suite>

последняя версия ставится не хочет

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>7.1.0</version>
</dependency>

У вас он в принципе не стартует второй тест или всеже пытается стартовать но какую-то ошибку выдает ? Если выдает покажите что за ошибка, вы там чтото про драйвер выше писали.

Нет, драйвер инициализируется, все норм, иначе бы вообще никакой тест не запускался.
Прхожусь дебагом и вижу, что набор определился с двумя тестами

[Suite: "Suite1" [Test: "createDemo" verbose:1[parameters:nameFile=>demoAccountValidData.json][metagroups:] [included: ][excluded: ] classes:[XmlClass class=tests.TestDemoAccount] packages:] [Test: "notCreateDemo" verbose:1[parameters:nameFile=>demoAccountInvalidData.json][metagroups:] [included: ][excluded: ] classes:[XmlClass class=tests.TestDemoAccount] packages:] ]

Но первым выполняет notCreateDemo, после переходит к createDemo и на первой же строке валится с NullPointerException

И если поменять в конфиге местами сами тесты, то опять таки выполнится самый последний, а к последующим не переходит.
Вообще непонятно и в кишках не смогла отловить ошибку.

Может какое-то свойство нужно добавить в конфиг testng ?

Перед каждым тестовым набором у меня отрабатывает авторизация

public class TestBase {

    protected final ApplicationManager app = new ApplicationManager(System.getProperty("BROWSER", BrowserType.CHROME));
    String customer = app.properties.getProperty("WEB_LOGIN");


    @BeforeSuite
    public void setUp() throws IOException {
        app.properties();
        app.init();
    }

    @AfterSuite
    public void tearDown() {
        app.stop();
    }

}

и если меняешь аннотацию на @BeforeMethod, то все прекрасно отрабатывает, 2 теста и в том порядке, в котором указано в конфиге testng
А вот с @BeforeSuite авторизационная сессия со второго теста получается протухает, так как валится NullPointerException, хотя не должна.
Видимо и правда какая-то настройка что-ли должна быть в testng дополнительная… ?

Сделайте два suite, в каждый подключите свои параметры, классы и методы и подключите свои suite в testng. Может так заработает, как вам нужно

ну это наверное как-то странно, так как все эти тесты относятся к одной теме)
все равно не ясно почему не работает с одним suite )