【问题标题】:How to assert or validate 2 pieces of text that are "almost" identical for unit test如何断言或验证单元测试“几乎”相同的 2 段文本
【发布时间】:2016-01-05 15:38:08
【问题描述】:

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

所以我有这个:

期望:

因为纳税人可以被视为受抚养人而被取消资格

我想反对这个:

实际:

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

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

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

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

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

我尝试了这个:

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

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

【问题讨论】:

  • 断言如何?它们要么相等,要么不相等。当然测试仍然失败,因为中间有单词,所以它不“包含”那个确切的字符串。您需要在此处编写自己的逻辑。用单词拆分较小的字符串,检查每个字符串的出现,并检查与另一个字符串有多少差异。如何?这取决于你的要求,所以你不能问我们这个
  • assertTrue(titleText.startsWith("disqualified because ") && titleText.endsWith("can be claimed as a dependent"))?
  • 感谢@TagirValeev,但我想要更通用的东西来处理我的所有测试
  • 感谢@Stultuske 我正在研究进行字符串数组比较,如果此字符串数组中的 2 个或更多项不相等,我可能无法通过测试。

标签: java unit-testing junit testng


【解决方案1】:

不要使用正则表达式。只有在您事先知道文本模式并且模式相对简单的情况下,正则表达式才能为您提供帮助。

您必须选择最适合您需求的相似度指标。最著名的是 Levenshtein 距离(或编辑距离)。例如,您可以在 apache commons 中找到它。如果您需要更复杂的东西,您可以使用fuzzy string search 甚至使用全文搜索(lucene 等)

但您可能在断言/匹配器库中找不到任何这些 - 使用专用工具进行比较

【讨论】:

    【解决方案2】:

    好吧,如果您确定这适合您,您可以使用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】:

      最好的方法可能是断言那些是可预测的部分,例如使用正则表达式:

      Assert.assertTrue(titleText
        .matches("(?i)disqualified because \\w+ can be claimed as dependent"));
      

      正则表达式术语 \w+ 表示“一系列 1 个或多个单词字符”。

      另请注意,正则表达式还如何让您通过 (?i) 忽略大小写标志不区分大小写匹配,因此避免了 toLowerCase() 调用。

      或者

      如果“足够接近”确实足够好,请使用 Levenshtein distance 测试,您可以在 Apache common-lang 的 StringUtils.getLevenshteinDistance() 方法中找到它的实现:

      Assert.assertTrue(StringUtils.getLevenshteinDistance(titleText, t) < 10);
      

      【讨论】:

        【解决方案4】:

        您必须自己编写比较器。

        class OwnComparator {
            public static boolean checkThoseForEquality(String str1, String str2) {
                // your logic goes here
            }
        }
        

        与它一起使用

         assertTrue(OwnComparator.checkThoseForEquality(titleText, t);
        

        您甚至可以将 toLowerCase() 从代码移动到此比较器,从而使您的通用代码更短。

        我认为期望 testNG 完全实现您所说的“几乎相等”是不正确的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-23
          • 2019-07-10
          • 1970-01-01
          • 2014-08-06
          • 2015-12-08
          • 1970-01-01
          • 2014-06-26
          相关资源
          最近更新 更多