Может ли @Step быть динамичным в Allure? - PullRequest
0 голосов
/ 24 августа 2018

У меня есть метод шага Allure для параметризованного теста JUnit 5 и Selenium, который получает объект тестовых данных, содержащий все данные теста для параметризованного теста.

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

Пример:

@Step
public void trade(TradeData data) {
    enterAmount(data.getAmount());
    enterCurrency(data.getCurrency());
}

@Step
public void enterAmount(String amount) {
    if (amount != null) {
        // do something
    }
}

@Step
public void enterCurrency(String currency) {
    if (currency != null) {
        // do something
    }
}

В протоколе испытаний Allure указывается, что подэтапы всегда выполняются.

Для приведенного выше примера оно всегда выглядит так:

торговля

enterAmount

enterCurrency

Только если я нажму на подэтап и увижу, что аргумент был нулевым, я могу сделать вывод, что он не был выполнен. Это не идеально.

Вместо этого я хотел бы, чтобы в отчете отображались только те шаги, которые были выполнены. Предположим, что только «число» равно нулю, тогда это будет выглядеть так:

торговля

enterCurrency

Я могу себе представить, что это было бы возможно, если бы не использовать негибкую аннотацию @Step, а вместо этого вызвать метод Allure в блоке if, чтобы объявить метод как шаг (псевдокод):

public void enterAmount(String amount) {
    if (amount != null) {
        Allure.context().step();
        // do something
    }
}

Но возможно ли это как-то с Allure? Я предпочитаю простой способ, чем очень сложный обходной путь.

1 Ответ

0 голосов
/ 24 августа 2018

Вы можете создать вспомогательный метод, который создаст шаг, используя Allure Lifecycle API:

public static void step(String name, Runnable runnable) {
    String uuid = UUID.randomUUID().toString();
    StepResult result = new StepResult()
            .withName(name);
    Allure.getLifecycle().startStep(uuid, result);
    try {
        runnable.run();
        Allure.getLifecycle().updateStep(uuid, s -> s.withStatus(Status.PASSED));
    } catch (Throwable e) {
        Allure.getLifecycle().updateStep(uuid, s -> s
                .withStatus(ResultsUtils.getStatus(e).orElse(Status.BROKEN))
                .withStatusDetails(ResultsUtils.getStatusDetails(e).orElse(null)));
        throw e;
    } finally {
        Allure.getLifecycle().stopStep(uuid);
    }
}

, а затем используйте его так:

public void enterAmount(String amount) {
    if (amount != null) {
        step("Enter amount", () -> {
            //do something
        });
    }
}
...