【问题标题】:Test failures: false positive or false negative测试失败:假阳性或假阴性
【发布时间】:2017-05-01 21:42:55
【问题描述】:

如果我的单元测试失败,但底层代码确实有效,这会被称为误报还是误报

(这是上下文。我并行运行了一堆测试,但有些测试失败了。我按顺序运行它们,它们都通过了。所有代码实际上都有效,只是并行测试运行器存在问题.)

我的问题只是命名法。我也找到了人们称呼它的例子。在阅读Wikipedia 之后,我会认为这是一个误报,但值得注意的是 Andrew Ng 在他的机器学习课上说:

如果测试通过,即使代码被破坏,这也是误报。如果测试失败,并且代码没有被破坏,那就是假阴性。

【问题讨论】:

  • @Lashane: This websitethis website 不同意你的观点。愿意证实您的主张吗?
  • 失败的测试用例 == 否定,一旦是误报 - 它就是误报
  • @Lashane:我的零假设是我的代码正在运行。我的测试(错误地)表明我的代码不起作用(因此,拒绝了我的零假设)。因此,这是 I 类错误,误报。
  • @Lashane:“误报错误,或简称误报,通常称为“误报”,是一种结果,表明给定条件已经满足,但实际上并未满足。”来自Wikipedia
  • 这取决于你所说的“警报” - 损坏的功能或损坏的测试,对我来说,警报是损坏的功能,所以调用“狼狼”是损坏的测试 -> 错误类型 II

标签: testing naming-conventions


【解决方案1】:

单元测试表明代码以某种方式运行。措辞应该反映这一点。

  • 如果代码被破坏,但测试通过;这是误报。

  • 如果代码正确,但测试失败;这是一个假阴性。

  • 如果代码正确且测试通过;这是一个真正的积极因素。

  • 如果代码失败且测试失败,则为真否定。

最后我会补充一点,没关系。如果测试错过了它,您将一个错误发送到生产环境。如果测试在应该通过的时候没有通过,那么您将延迟交付生产。为假/真阳性/阴性而战是在船下沉时重新布置躺椅。

【讨论】:

  • 所以,我认为最好的应对方法如下:误报(“误报”)是表示已满足给定条件的结果,当它没有的时候。 假阴性是测试结果表明条件失败,而条件成功。即错误地假设没有效果。如果我的代码被破坏并且测试通过,则不会发出警报。没有假设任何影响,因此是假阴性。如果代码正确,但测试失败,则会发出警报,因此是误报。所以恰恰相反。
  • 这个答案虽然是投票最多的一个,但根据参考书目是不正确的。请在下面查看我的答案。
【解决方案2】:

我相信这与其他答案所说的相反。

至少这就是 Gerard Meszaros 在“XUnit 测试模式:重构测试代码”一书中定义误报和误报的方式。

理解这一点的一个简单方法是把它想象成医学中的测试是“测试疾病”。

如果您患有这种疾病,您就是“疾病-阳性”。

在我们的软件世界里,你可以这样想:

阳性测试,表示您对错误持肯定态度,即测试失败,因为您是“NullReferenceExceptionitis-阳性强>”

NEGATIVE 测试,意味着您对错误NEGATIVE 即测试通过,因为您是“StackOverflu-否定强>”

所以,请记住 bug = disease 和:

FALSE 肯定(对错误)意味着您的代码被错误地指控有错误。 (您的代码没有错误,但测试失败)

FALSE 否定(对错误)表示您的代码被错误地 声明为没有错误。 (您的代码有错误,但测试通过)

TRUE 肯定表示您的代码被理所当然(确实) 指控存在错误。 (你的代码有bug,测试失败)

TRUE 否定表示您的代码正确(真正) 声明没有错误(您的代码没有错误,测试通过)

我希望这会有所帮助。

参考资料: http://xunitpatterns.com/false%20positive.html

从那本书中:

如果我们遇到错误测试或生产错误,我们可以 降低假阴性的风险(测试通过时 不应该)

还有:

假阴性

即使被测系统 (SUT) 无法正常工作,测试也通过的情况。据说这样的测试会给出假阴性指示或“假通过”。 另请参阅:误报。

误报

即使被测系统 (SUT) 工作正常,但测试失败的情况

【讨论】:

  • 你是从一个颠倒的想法开始的。如果我检测出某种疾病呈阳性,那就是有问题。如果我的测试都通过了,希望一切顺利。尽量不要将医学与编程混为一谈,您正在寻找通过所有测试。对于疾病,您希望您无法通过测试(疾病不存在)。
  • @boatcoder 如果您通过了测试(绿色勾号),则该测试被视为“阴性”。从整个讨论中可以清楚地看出,这对许多人来说是违反直觉的。你可以随便叫它,没有人给你强加任何规则:)
  • 在编写测试时,我们不测试错误,我们测试功能。积极的测试结果是当我们的测试证明该功能有效时。误报是我们的测试表明该功能有效,但实际上已损坏(被测代码和测试代码都有错误) (只有测试有bug)
  • 如果你想用医学类比来思考。阳性测试是存在该特征/存在疾病。
  • @dancarter 正如您在martinfowler.com/books/meszaros.html 中看到的那样(我相信Martin Fowler 不需要介绍)我在回答中提到的这本书得到了很多赞誉。那本书中的信息也存在于作者的网页上:xunitpatterns.com/false%20positive.html“当被测系统(SUT)工作正常但测试失败时,该测试被称为给出误报指示或”错误失败”。当我们尝试计算某些观察错误发生的概率时,该术语来自统计科学。”
【解决方案3】:

我同意@boatcoder,只是另一种说法,也许更容易理解:

https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#Type_I_error

当原假设 (H0) 为真但被拒绝时,会发生 I 类错误。 它是在断言一些不存在的东西,一个错误的命中。

这是如果代码被破坏,但测试通过;这是一个误报。来自boatcoder的回答

因为测试断言代码在工作,而实际上不是(工作代码不存在)。

当原假设为假但错误地未能被拒绝时,会发生 II 类错误。 它无法断言存在的东西,错过了

这是如果代码正确,但测试失败;这是来自boatcoder 的回答的误报

因为测试未能断言代码正在工作(工作代码存在)。

【讨论】:

  • 如果测试通过,断言的缺失是什么?至少你给出的参考是相当模棱两可的,但对我来说,误报是在没有错误时断言存在错误(这是一个错误地失败的测试)。
  • @skyking 单元测试不是为了断言代码没有错误,而是为了断言某些代码路径正在工作,这就是为什么它们不同于疾病,你不是在寻找问题,即积极意味着这个特定的代码路径正在工作
  • 问题是您引用的来源似乎与您声称的不太相符,尤其是您选择的引用,即使您将“某事”解释为工作代码。例如,测试通过应该意味着工作代码不存在,那么 any 通过测试将被视为误报。与此相关的是我们的意思是存在工作代码?我会解释工作代码的存在,即有 一些 代码正在工作,但不一定 所有 代码都在工作。
  • @skyking 来证明我们的代码是有效的,我们应该reject null-hypothesis(参见wiki链接的例子),所以我们的H0 is that "code is **not** working"。通过断言某些代码路径正在工作,我们拒绝假设该代码路径不工作。因此,当测试通过损坏代码时,我们可以将其表述为“我们断言(不工作代码)不存在”,而实际上“(不工作代码)存在”=“(工作代码)不存在”
  • @skyking 现在关于第二种情况,当我们的 H0 为假时,即代码实际上正在工作,但我们未能拒绝 H0(即我们假设我们的 H0 为真),我们有假阴性,即“我们断言(工作代码)不存在”,而实际上“(工作代码)存在”
【解决方案4】:

同意boatcoder 提到的内容。此外,POSITIVE 或 NEGATIVE 一词指的是预测的内容(在这种情况下为测试输出),TRUE 或 FALSE 指的是相对于 ACTUAL 的预测内容(代码是否工作)。 例如

当代码正常工作并且测试显示其损坏时,它是 FALSE NEGATIVE。这里 NEGATIVE 是因为测试结果显示为 NEGATIVE ,但由于代码实际工作,相对于实际的预测是 FALSE。因此它的假阴性。

当代码不工作并且测试显示其损坏时,它是 TRUE NEGATIVE。在这里,NEGATIVE 是因为测试显示代码已损坏,并且相对于实际的预测为 TRUE。因此是真正的否定。

当代码正在运行并且测试显示它正在运行时,它是真正的积极的。 当代码不工作并且测试显示其工作时,则其为 FALSE POSITIVE。

但是,这一切都取决于您所说的“积极”。我认为代码工作是积极的:) 希望这会有所帮助

【讨论】:

    【解决方案5】:

    让生活变得简单易懂。

    这是我们的 SUT 代码。

    code is broken  
    
                     
    

    这是我们的测试。

    but testing passing.
    

    这很糟糕,这表明我们的测试不正确。这种类型的单元测试称为

    误报。

    它是错误的,因为我们的 SUT 代码被破坏了(即没有做应该做的事情。)。 然而,我们的单元测试显示为正面(即它通过了。)

    现在是副 Versa 场景。

    这是我们的 SUT 代码。

    code is fine
    
                     
    

    这是我们的测试。

    but testing still failing.
    

    这很糟糕,这表明我们的测试不正确。这种类型的单元测试称为

    假阴性。

    它是错误的,因为我们的 SUT 代码正在工作(即做应该做的事情。)。 然而我们的单元测试显示为负(即它没有通过。)

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2016-02-03
      • 1970-01-01
      • 2015-09-28
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      相关资源
      最近更新 更多