А как вы имплементируете степы у себя в тесте ?

Привет.

А как вы имплементируете степы у себя в тестах ?

У себя использую TestNG runner и каждый step у меня через @Test(priority = ) сделан.
Т.е. один класс и внутри него методы через @Test(priority) аннотированы.

В итоге в отчёте вижу такое:

Правильный ли это подход или нужно как-то по-другому делать ?

@Step не увидел в TestNG ( org.testng.annotations )

В аллюре есть аннотация @Step

@88Post1, собственно @Step это именно аннотация Allure’a )

Если хотите увидеть в отчете степ, то либо ставите @Step для конкретного метода, например:

    @Step("Perform a Sign-in as user {user.login}")
    protected SignInPageIMDb login(User user) {
            return new SignInPageIMDb()
                    .goToSignInPageIMDB()
                    .logInAs(user);
    }

или, если хотите разбить свой тест-метод на степы, то надо лямбда-стилем завернуть соотвествующие части кода теста, например:

    @Test
    public void scenario1_Test() {

        step("Step 1: Go to the 'www.smthing.com/automation-test' ", () ->
            open("automation-test/")
        );

        RandomClient client = step("Step 2: Create a new Client object with randomly generated data",
                RandomClient::new);

        step("Step 3: Fill the registration fields with the Client's data", () -> {
            $("[name='firstname']").shouldBe(visible).sendKeys(client.getFirstName());
            $("[name='lastname']").shouldBe(visible).sendKeys(client.getLastName());
            $("[name='email']").shouldBe(visible).sendKeys(client.getEmail());
            $("[name='phone']").shouldBe(visible).sendKeys(client.getPhone());
            $("[name='company']").shouldBe(visible).sendKeys(client.getCompany());
        });

        step("Step 5: Click the 'Submit' button", () ->
                $("[type='submit']").shouldBe(visible, enabled).click()
        );

        step("Step 6: Verify that you were redirected to the 'saleforce-promotion' page", () ->
                webdriver().shouldHave(urlStartingWith("https://www.smthing.com/" +
                        "saleforce-promotion-june-2020-thank-you/?submissionGuid="))
        );

        step("Step 7: Verify that the page has 'Thank you for singing up!' text", () ->
                $("div.elementor-widget-container h1")
                        .shouldBe(visible, Duration.ofSeconds(10))
                        .shouldHave(text("Thank you for singing up!\n" +
                                "We will be in touch with you shortly."))
        );
    }

Можно конечно еще занести Cucumber и использовать его степы, но это плохая идея, очень плохая! :sunglasses:

Понятно.
Ну то есть один @Test внутри которого по очереди вызываются методы @Step.
Всё же это не то, что хотелось.

Лямбда стиль подойдёт лишь для примитивнейших тестов. Чуть более что сложное - будет страдать читабельность, так что нет )

ИМХО это единственный адекватный вариант. Ранить разные тесты с подменным приорити чтобы сформировать “красивый отчёт аллюр”, на первый взгляд воспринимается настолько чудовищной формой извращения, по сравнению с которой меркнут худшие из спорных практик BDD.

В связи с этим я стесняюсь спросить, но всё-же спрошу, а как хотелось?

1 лайк

Тест это же и есть совокупность шагов + ассерты.
У нас есть PageObject в котором есть методы например
`
@Step (“Enter email”)
public void enterEmail(String email){
// some code
}

@Step (“Enter password”)
public void enterPasword(String password){
// some code
}
`
В тесте же мы вызываем эти методы и в алююре видим шаги.

1 лайк

Поспорю.
А что делать с переиспользуемыми степами ?
Например, степ - login на станицу. Нужно каждый раз его вызывать в >100 тестах.

Намного правильнее будет оформить его как отдельный классец с @Test который выполняет login и переиспользовать его во множестве тестов из tesng.xml.

Но 1 тест с несколькими степами - тоже норм идея.