如何按自定义规则正确删除Testcase列表中的重复项
删除互为反向输入的重复测试用例方案
我来给你拆解一下怎么搞定这个互为反向输入的重复测试用例问题哈,核心思路是给每一组输入对生成不随顺序变化的唯一标识,这样就能轻松识别并剔除重复项了。
具体实现步骤
1. 明确重复判定规则
首先得理清:只有当两个用例的XQuery、Testpath完全一致,且FirstInputFile和SecondInputFile互为反向时,才算重复项。如果只需要针对输入对去重,可以忽略XQuery和Testpath的判断。
2. 生成唯一标识
把FirstInputFile和SecondInputFile按字典序排序后拼接成字符串,这样不管输入顺序是FAIL→FAIL2还是FAIL2→FAIL,生成的标识都是完全相同的。如果需要结合XQuery和Testpath一起判断重复,就把这两个字段也加入到标识里。
3. 遍历执行去重
用一个集合来记录已经保留过的用例标识,遍历所有测试用例:
- 对当前用例生成唯一标识
- 如果标识不在集合里,就保留这个用例,并把标识加入集合
- 如果标识已经存在,就跳过这个用例(视为重复项)
Java代码示例
假设你的HeaderAndBodyTestcase类已经提供了获取各个字段的getter方法,下面是完整的去重实现:
// 初始化存储去重后用例的列表 List<HeaderAndBodyTestcase> uniqueTestcases = new ArrayList<>(); // 用来跟踪已处理过的输入对标识,避免重复 Set<String> processedPairs = new HashSet<>(); for (HeaderAndBodyTestcase tc : tcs) { // 获取用例的关键字段 String xquery = tc.getXQuery(); String testpath = tc.getTestpath(); String firstInput = tc.getFirstInputFile(); String secondInput = tc.getSecondInputFile(); // 生成输入对的唯一标识(不随顺序变化) String inputPairKey; if (firstInput.compareTo(secondInput) <= 0) { inputPairKey = firstInput + "|" + secondInput; } else { inputPairKey = secondInput + "|" + firstInput; } // 如果需要结合XQuery和Testpath判断重复,就生成完整标识 String fullUniqueKey = xquery + "|" + testpath + "|" + inputPairKey; // 判断是否已存在该标识,不存在则保留用例 if (!processedPairs.contains(fullUniqueKey)) { uniqueTestcases.add(tc); processedPairs.add(fullUniqueKey); } } // 替换原列表为去重后的列表 tcs = uniqueTestcases;
额外说明
- 如果你的测试用例还有其他需要纳入重复判定的维度(比如Expected结果),只需要把对应的字段加入到
fullUniqueKey里即可。 - 用
HashSet存储标识是因为它的查询效率很高,能保证去重过程的性能。
内容的提问来源于stack exchange,提问作者0x45
相关产品推荐
相关产品推荐

