1. Новый функционал
4голоса

Отображение предусловий для конкретных тестовых методов

У нас есть необходимость выполнять предусловие для конкретного тестового метода, для отображения в отдельном блоке интерфейса: **Launches | Launch N | Execution**, без добавления данного предусловия в теле самого теста. Аннотация **@Step** для этого не подходит, так как попадает в тело теста. Аннотации **@BeforeClass** или **@BeforeTest** также не подходят, так как будут выполняться перед **КАЖДЫМ** тестовым методом, а у нас потребность выполнить предусловие **ТОЛЬКО** перед конкретным тестовым методом. Мы используем TestNG.

В качестве временного решения, мы добавили класс обертку io.qameta.allure.AllureLifecycleCustom, в котором добавлена конструкция AllureLifecycleCustom.setUp().
Данный метод является оберткой над методом Allure.step() и принимает параметром блок кода который будет исполнятся в теле теста, но после завершения теста результат будет перезаписан и шаги расположенные в этом блоке кода будут перенесены в отчете в автоматически созданный метод в блоке "Предусловие":

```
public static <T> T setUp(Allure.ThrowableRunnable<T> runnable) {
return Allure.step("SET_UP : ", runnable);
}
```

Пример теста, использующий данную конструкцию:

```
@Test
public void singleTestPreconditionExample() {
var sms1 = setUp(() -> {
var sms = SendSmsRequestData.base("+79990001212", "Hello!");
gateSteps().sendSms(sms);
return sms;
});
gateSteps().getSmses(new GetSmsesRequestData(1)).check(response -> response
.shouldOk()
.phoneShould(everyItem(equalTo(sms1.phone()))));
}
```

Проблема данного подхода заключается в том, что если нужно выполнить два предусловия (с использованием return) перед тестовым методом, то в отчете будет отображено только то, что относится к первому вызову.

Пример теста, в котором повторный вызов метода setUp не будет отображен в интерфейсе

```
@Test
public void singleTest2PreconditionExample() {
var sms1 = setUp(() -> {
var sms = SendSmsRequestData.base("+79990001212", "Hello!");
gateSteps().sendSms(sms);
return sms;
});
var sms2 = setUp(() -> {
var sms = SendSmsRequestData.base("+79990001212", "New present available!!");
gateSteps().sendSms(sms);
return sms;
});
gateSteps().getSmses(new GetSmsesRequestData(2)).check(response -> response
.shouldOk()
.phoneShould(everyItem(equalTo(sms1.phone())))
.statusShould(everyItem(is(in(SmsStatus.textValues())))));
}
```

Можете ли вы добавить механизм, который позволит выполнять предусловия только для конретного тестового метода в классе и отображать их в отдельном блоке интерфейса Launches?

нет комментариев