Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 所有单元测试都应该成功吗?_Unit Testing_Language Agnostic_Phpunit - Fatal编程技术网

Unit testing 所有单元测试都应该成功吗?

Unit testing 所有单元测试都应该成功吗?,unit-testing,language-agnostic,phpunit,Unit Testing,Language Agnostic,Phpunit,假设您制作了一个应用程序,该应用程序尝试将字母A中的内容尽可能地音译为字母B 因为语言B非常复杂,所以这并不总是成功的。但是你得到了一个近似的音译 在这种情况下,考虑到您预期20-30%的失败率,您将如何构建单元测试?预期失败的单元测试不是单元测试。您需要使用一个评估函数来更改成功的定义,该函数充当一个过滤器,决定它是否“足够接近”,并确定通过/失败。当您的翻译器变得更好时,您可以提高过滤器中的标准。单元测试应该是确定性的。测试失败应该表明软件失败,而不是“按预期工作”的东西。对于您的情况,无论

假设您制作了一个应用程序,该应用程序尝试将字母A中的内容尽可能地音译为字母B

因为语言B非常复杂,所以这并不总是成功的。但是你得到了一个近似的音译


在这种情况下,考虑到您预期20-30%的失败率,您将如何构建单元测试?

预期失败的单元测试不是单元测试。您需要使用一个评估函数来更改成功的定义,该函数充当一个过滤器,决定它是否“足够接近”,并确定通过/失败。当您的翻译器变得更好时,您可以提高过滤器中的标准。

单元测试应该是确定性的。测试失败应该表明软件失败,而不是“按预期工作”的东西。对于您的情况,无论转换成功还是失败,都要以确保结果和测试的方式准备数据(测试失败总是一个选项,因为您预期失败-重要的是您始终能够控制测试通过/失败的时间)。

必须始终以单元测试成功为目标。您使用它的方式无法区分软件中的严重错误和您似乎期望的翻译中的错误

我建议将两者分开:

  • 使用单元测试只是为了确保您的软件按照您期望的方式工作(即使这包括翻译中的一些错误)
  • 生成包含软件生成的翻译的测试数据集。您可以手动或使用统计软件包(如R)检查此测试数据集,以了解翻译的质量

  • 在这种情况下,我学到的一种技术是只测试代码中功能性(或确定性)的部分。当然,最困难的部分是将确定性部分与非确定性部分分开。简而言之,就是“将[或重构]功能化”,这意味着分离出代码中确定的部分,然后测试这些部分

    对于基于场景的上下文,请阅读这篇文章,了解在测试遗留代码(并使用名为的开源单元测试库)时该技术的应用


    另一种可能感兴趣的技术是“基于理论的”测试。有关这方面的更多信息,请查看本文。

    单元测试可能失败的唯一原因是如果涉及计时(主要是在测试电子设备的情况下)。然而,即使在这些情况下,也应该以从单元测试中消除计时问题为目标,例如,如果可能,通过延长/切换超时或其他计时问题。如果不可能,则应做好记录

    消除计时问题并使测试具有确定性的另一种方法是使用某种注入方法为所有外部接口编写存根,即能够设置外部接口方法将返回的值。通过以这种方式设置单元测试,您可以真正地测试每一个错误条件

    (故事:我在一家公司工作,有几个单元测试偶尔会失败。只有少数人能够分析这些是严重错误还是时间问题。首先,做好单元测试将节省大量时间).

    +1用于将验证程序正确性的单元测试与验证程序符合规定要求的验收测试分开。