如何断言或验证两个几乎是"几乎"单元测试相同

时间:2015-10-08 06:52:41

标签: java unit-testing junit testng

我想在实际的API响应中验证对实际的预期响应,作为单元测试的一部分。

所以我有这个:

期望:

  

被取消资格,因为纳税人可以被声称为受抚养人

我想反对这一点:

实际:

  

被取消资格,因为您可以被声称为受抚养人

来自已编译二进制文件的API响应。

由于这些文本足够接近,我想在测试中传递这个断言:

Assert.assertEquals(titleText.toLowerCase(), t.toLowerCase(), "Did not match!");

由于这个断言显然没有通过,因为2个文本不相等。

我尝试了这个:

Assert.assertTrue(titleText.toLowerCase().contains(t.toLowerCase()));

但测试仍然失败......我怎样才能通过测试?任何建议将不胜感激。

4 个答案:

答案 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等)

但是你可能找不到断言/匹配库中的任何一个 - 使用专用工具进行比较