gpt4 book ai didi

allure - @Step 在 Allure 中可以是动态的吗?

转载 作者:行者123 更新时间:2023-12-05 05:14:59 31 4
gpt4 key购买 nike

我有一个用于参数化 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
}
}

在 Allure 测试报告中,似乎总是执行子步骤。

对于上面的例子,它总是这样读:

trade

enterAmount

enterCurrency

只有当我点击一个子步骤并看到参数为空时,我才能推断它没有被执行。这并不理想。

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

trade

enterCurrency

我可以想象,如果不使用不灵活的@Step 注解,而是在 if block 中调用 Allure 方法来声明该方法被视为一个步骤(伪代码),这将是可能的:

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

但是这在某种程度上可以用 Allure 实现吗?与非常复杂的解决方法相比,我更喜欢简单的方法。

最佳答案

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

关于allure - @Step 在 Allure 中可以是动态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52006538/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com