Cucumber Java:动态运算已存变量及多变量求和单步实现
解决Cucumber Java中的变量运算与通用总和验证问题
嘿,针对你提出的两个Cucumber Java场景需求,我来分享一下实际项目里常用的解决方案,都是经过实践验证的靠谱方法:
1. 动态对已存储变量执行算术运算
要实现动态对存储的变量做加减乘除,核心是先有一个线程安全的变量存储容器,用来在步骤间共享数据(因为Cucumber的场景是线程隔离的,所以要用ThreadLocal或者类似的机制)。
第一步:实现变量存储上下文
先写一个简单的ScenarioContext类,用来存、取变量:
import java.util.HashMap; import java.util.Map; public class ScenarioContext { private static final ThreadLocal<Map<String, Object>> context = ThreadLocal.withInitial(HashMap::new); public static void setVariable(String key, Object value) { context.get().put(key, value); } public static <T> T getVariable(String key) { return (T) context.get().get(key); } public static Map<String, Object> getVariableMap() { return context.get(); } public static void clearContext() { context.get().clear(); } }
第二步:编写支持动态运算的步骤定义
用正则表达式匹配步骤里的变量名和运算类型,然后从上下文取出变量值计算,再把结果存回去。比如可以设计这样的步骤:
When 对变量
$var1执行加法运算,加上变量$var2,结果存入$resultVar
When 对变量$var1执行减法运算,减去变量$var2,结果存入$resultVar
对应的步骤定义代码:
import io.cucumber.java.en.When; public class MathStepDefinitions { @When("^对变量`(.*?)`执行`(加法|减法|乘法)`运算,(?:加上|减去|乘以)变量`(.*?)`,结果存入`(.*?)`$") public void performArithmeticOperation(String var1Key, String operation, String var2Key, String resultKey) { // 从上下文取出变量值(假设都是数值类型,比如Integer或Long) Number var1 = ScenarioContext.getVariable(var1Key); Number var2 = ScenarioContext.getVariable(var2Key); // 执行对应运算 Number result; switch (operation) { case "加法": result = var1.doubleValue() + var2.doubleValue(); break; case "减法": result = var1.doubleValue() - var2.doubleValue(); break; case "乘法": result = var1.doubleValue() * var2.doubleValue(); break; default: throw new IllegalArgumentException("不支持的运算类型: " + operation); } // 把结果存回上下文 ScenarioContext.setVariable(resultKey, result); } }
这样你就可以在场景里灵活地对任意已存储的变量做动态运算啦!
2. 编写通用步骤验证$TotalRecords等于任意数量$Count类变量的总和
这个需求的关键是自动识别所有以Count开头的变量,然后求和后和TotalRecords比较。我们可以用一个通用的步骤来实现,不用为每个Count变量写单独的验证逻辑。
第一步:设计通用验证步骤
场景里可以写这样的步骤:
Then 验证
$TotalRecords等于所有$Count*变量的总和
第二步:实现通用步骤定义
在步骤定义里,从ScenarioContext中筛选出所有key以Count开头的变量,求和后和TotalRecords的值对比:
import io.cucumber.java.en.Then; import static org.junit.Assert.assertEquals; public class ValidationStepDefinitions { @Then("^验证`(.*?)`等于所有`Count.*`变量的总和$") public void validateTotalEqualsSumOfCounts(String totalKey) { // 获取TotalRecords的值 Number totalValue = ScenarioContext.getVariable(totalKey); // 筛选所有以Count开头的变量并求和 double sumOfCounts = ScenarioContext.getVariableMap().entrySet().stream() .filter(entry -> entry.getKey().startsWith("Count")) .mapToDouble(entry -> ((Number) entry.getValue()).doubleValue()) .sum(); // 断言相等(可以设置精度,比如保留2位小数) assertEquals("总和验证失败", totalValue.doubleValue(), sumOfCounts, 0.001); } }
结合你的示例场景使用
比如你的场景:
Given 用户登录"AppA"应用 When 用户从"TotalLines"获取计数并存储到"$TotalRecords" And 用户从"Car1"获取计数并存储到"$Count1" And 用户从"Car2"获取计数并存储到"$Count2" And 用户从"Car3"获取计数并存储到"$Count3" Then 验证`$TotalRecords`等于所有`Count*`变量的总和
这个通用步骤会自动把$Count1、$Count2、$Count3的值加起来,和$TotalRecords对比,不管你有多少个Count变量都能适配!
内容的提问来源于stack exchange,提问作者Nabil Rashid
相关产品推荐
相关产品推荐

