【问题标题】:Test passes with a False-Positive测试通过假阳性
【发布时间】:2021-01-03 18:16:19
【问题描述】:

我的测试出现误报。我正在寻找密钥“1234”,我知道它不存在但测试仍然通过。

我有 MAP 方法 (reportUIDsAndTitles),它存储了一组 UID 和标题的键和值。我的测试循环遍历这些键,如果找到它就断言标题与键匹配。但在下面的代码中,如果没有找到密钥,测试仍然通过。

我该如何解决这个问题?我已验证我的 MAP 方法有效且循环有效,但不确定如何设置失败。

@Test
public void apiTitleOfReport() {
    Map<String, String> pairs;
    pairs = reportUIDsAndTitles();

    for (Map.Entry pairEntry : pairs.entrySet()) {
        if (pairEntry.getKey().equals("1234")) {
            String keyValue = (String) pairEntry.getValue();
            assertEquals(keyValue, "Name of title I am looking for", "Report Title not found.");
        }}}

******* 这是我更新的代码,在 IF 块之前缺少 Assert,如建议的那样。现在,如果密钥不存在,它就会失败。但如果它确实存在,代码将继续并检查标题是否正确。谢谢大家的建议。

@Test
public void apiTitleOfReport() {
    Map<String, String> pairs;
    pairs = reportUIDsAndTitles();
    assertTrue(pairs.containsKey("1234"));
    

for (Map.Entry pairEntry : pairs.entrySet()) {
        if (pairEntry.getKey().equals("1234")) {
            String key = (String) pairEntry.getValue();
            assertEquals(key, "Name of title I am looking for", "Report Title not found.");
        }}}

【问题讨论】:

  • 它通过了,因为如果你不输入 if 块,你就不会断言任何东西。没有断言意味着自动通过。
  • 谢谢!这就是我所缺少的。我认为通过将我的 assertEquals 放在 IF 块中,它会在那里捕捉到它......错误。所以,我在 For 循环之前添加了这一行:assertTrue(pairs.containsKey("1234"));

标签: java loops false-positive


【解决方案1】:

您遍历 pairs 映射中的每个条目,然后:

  1. 如果条目的键是"1234",然后检查值(旁注:您正在调用值keyValue?您需要更好的命名技巧,伙计:P)是否等于某些特定的东西。如果是的话,太好了。如果没有,则失败。
  2. 就是这样 - 如果条目的键不完全是"1234",我们会继续循环。只有键为 "1324" 的任何条目会导致任何实际代码运行。
  3. 就是这样。没有#3。

因此,正如您所说,没有密钥 1234 的条目,因此您的代码什么也不做。

如何解决?你的问题是不清楚的意图。一种方法可能是:

@Test
public void ensure1234IsNotInTheMap() {
    assertFalse(map.containsKey("1234"));
}

或许:

@Test
public void ensure1234IsMappedToFOOBAR() {
    assertEquals("FOOBAR", map.get("1234"));
    // if 1234 isn't in the map at all, the map.get op
    // returns null, and thus your test will properly fail,
    // as null is not equal to "FOOBAR".
}

【讨论】:

  • 谢谢,你说得对。我需要更好的名字! :-)
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 2022-01-17
  • 2016-02-03
  • 1970-01-01
  • 2015-09-28
  • 2014-08-20
  • 2018-04-22
相关资源
最近更新 更多