@Step可以在魅力中动态吗?

时间:2018-08-24 14:22:29

标签: allure

对于参数化的JUnit 5和Selenium测试,我有一种Allure步骤方法,该方法接收一个包含该参数化测试的所有测试数据的测试数据对象。

此主要步骤方法调用其他子步骤方法。仅当子步骤的参数不为空时才执行子步骤。因此,我可以通过测试数据本身来控制测试执行。我在子步骤中而不是在主步骤方法中检查null,因为可以从任何测试中调用子步骤(我不想重复自己)。

示例:

@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
    }
}

在“魅力”测试报告中,似乎总是执行子步骤。

对于上面的示例,它始终显示为:

  

交易

     
    

enterAmount

         

enterCurrency

  

仅当我单击一个子步骤并看到该参数为null时,我才能推断出该参数未执行。这不理想。

相反,我希望报告仅显示已执行的步骤。假设只有“ amount”为空,则它看起来像:

  

交易

     
    

enterCurrency

  

我可以想象不使用不灵活的@Step批注,而是在if块中调用Allure方法来声明该方法被视为步骤(伪代码)是有可能的:

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

但这对诱惑有可能吗?与更复杂的解决方法相比,我更喜欢简单的方法。

1 个答案:

答案 0 :(得分:1)

您可以创建将使用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
        });
    }
}