我想在实际的API响应中验证对实际的预期响应,作为单元测试的一部分。
所以我有这个:
期望:
被取消资格,因为纳税人可以被声称为受抚养人
我想反对这一点:
实际:
被取消资格,因为您可以被声称为受抚养人
来自已编译二进制文件的API响应。
由于这些文本足够接近,我想在测试中传递这个断言:
Assert.assertEquals(titleText.toLowerCase(), t.toLowerCase(), "Did not match!");
由于这个断言显然没有通过,因为2个文本不相等。
我尝试了这个:
Assert.assertTrue(titleText.toLowerCase().contains(t.toLowerCase()));
但测试仍然失败......我怎样才能通过测试?任何建议将不胜感激。
答案 0 :(得分:2)
你必须自己编写比较器。
class OwnComparator {
public static boolean checkThoseForEquality(String str1, String str2) {
// your logic goes here
}
}
与
一起使用 assertTrue(OwnComparator.checkThoseForEquality(titleText, t);
您甚至可以将toLowerCase()
从代码移到此比较器,从而缩短您的常规代码。
我认为期望testNG完全没有实现“几乎相等”的意思是有效的。
答案 1 :(得分:1)
最好的方法可能是使用例如正则表达式来断言那些 可预测的部分:
Assert.assertTrue(titleText
.matches("(?i)disqualified because \\w+ can be claimed as dependent"));
正则表达式术语\w+
表示"一系列1个或多个单词字符"。
另请注意,正则表达式还允许您通过(?i)
ignore-case标记不区分大小写,从而避免toLowerCase()
调用。
如果"足够接近"真的很好,使用Levenshtein distance测试,你可以在Apache common-lang的StringUtils.getLevenshteinDistance()
方法中找到它的实现:
Assert.assertTrue(StringUtils.getLevenshteinDistance(titleText, t) < 10);
答案 2 :(得分:1)
好吧,如果您确定这适合您,您可以使用Levenshtein Distance(或其他一些字符串匹配分数来比较字符串。
//Checks that at most 20% of the string are different using Levenshtein distance score
assertTrue(StringUtils.getLevenshteinDistance(titleText.toLowerCase(), t.toLowerCase()) < titleText.length()*0.2)
答案 3 :(得分:1)
不要使用正则表达式。只有事先了解文本模式以及模式是否相对简单,正则表达式才能帮助您。
您必须选择最符合您需求的相似度量标准。最着名的是Levenshtein距离(或编辑距离)。你可以在apache commons中找到它。如果你需要更复杂的东西,你可以使用fuzzy string search甚至使用全文搜索(lucene等)
但是你可能找不到断言/匹配库中的任何一个 - 使用专用工具进行比较