对于参数化的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
}
}
但这对诱惑有可能吗?与更复杂的解决方法相比,我更喜欢简单的方法。
答案 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
});
}
}