【问题标题】:What are unit tests and why should I care?什么是单元测试,我为什么要关心?
【发布时间】:2010-09-25 16:29:30
【问题描述】:

好的,我用 PHP 和 JavaScript 开发 Web 应用程序,在 Stack Overflow 上我经常看到 unit test 这个词经过,但我在网站上找不到任何地方对单元测试到底是什么的一个令人满意的答案。

那么什么是单元测试,作为 PHP 和 JavaScript 程序员,我应该关心还是只针对“真正的”编程语言?

【问题讨论】:

    标签: php javascript unit-testing


    【解决方案1】:

    关于为什么首先应该进行单元测试,我想补充一下Barry Boehm的论点:“在单元测试阶段发现并纠正的错误超过一百次比在交付给客户后完成更便宜。”

    虽然乘数听起来有点粗糙,但我认为这个论点绝对证明了测试的合理性。

    【讨论】:

      【解决方案2】:

      除了已经回答的问题,测试用例涵盖您的代码允许您继续 Refactoring(改进您的代码设计而不修改其可观察行为)。

      Unit test frameworks for PHP 包括 PHPUnitSimpleTest,它们已经是 compared on StackOverflow

      【讨论】:

        【解决方案3】:

        如果您编写任何描述的应用程序,您应该考虑单元测试。如果做得好,它们会迫使您考虑交付给用户的代码质量。我认为您在这里遇到的问题是单元测试代码和自动化单元测试之间的区别。单元测试可以像编写一组测试然后手动运行一样简单地完成。

        另一方面,自动化单元测试依赖于您拥有某种形式的应用程序/工具来运行和重新运行测试。使用自动化单元测试,您只需按一个按钮即可重新运行测试。那么为什么重新运行测试如此重要呢?简单地说,您不会编写应用程序在它们上运行一次测试然后离开它们。编写您的测试,以便您在离散的小运行中练习您的代码,并在整个开发过程中运行它们。通过这样做,通过一组编写良好的测试,您更有可能识别出因升级而损坏的代码。

        【讨论】:

          【解决方案4】:

          单元测试是一种自动化测试,用于测试给定的代码在给定的一组环境下是否按照您的预期执行。好的单元测试测试小块功能,通常是在单个功能级别。

          单元测试的结构通常是这样的,您可以设置一些状态,运行要测试的函数或方法,然后断言该函数的输出,或者该函数导致其他状态的变化。大多数单元测试框架都有支持和构建它的实用程序,例如:

          • 测试用例:将类似测试组合在一起的方法,通常用于测试相同的文件或代码段。
          • 设置/拆卸函数:在每次测试之前调用的函数,设置和清理状态在多个测试中是相同的。
          • 断言函数:允许您断言特定事物为真的函数,例如一个值等于另一个预期值、一个值是真/假等。当它们失败时,它们会向您显示预期值和实际值是多少。
          • 测试运行应用程序:一个应用程序一个接一个地为您运行所有测试,显示每个测试是成功还是失败,如果失败,哪些特定断言失败,以及实际值是多少与预期值相反。

          单元测试之所以有用的原因有很多:

          • 它们可确保您的代码在编写时工作,而无需手动测试。在编写函数时,您可以测试您对其工作原理的假设,并立即发现错误。
          • 即使您或其他人更改了代码,它们也会让工作代码继续工作。一旦编写了一个函数并进行了完整的单元测试(即,它应该做的所有事情都有相关的单元测试来验证它们确实做到了),那么如果您或其他任何人破坏了任何该功能,您将立即知道何时您运行单元测试,并且可以轻松地纠正它。
          • 它们可以帮助您调试。在尝试诊断通过手动测试应用程序观察到的错误时,无需查看大量代码,单元测试使您可以专注于较小的功能,从而减少您需要考虑的复杂性。
          • 他们会记录您的代码,并且会随着代码的变化而保持更新。设计文档和 cmets 很容易忘记更新。另一方面,单元测试在未更新时会中断。如果写得很清楚,它们会显示代码在特定情况下的实际作用,并且可以向您证明这一点。

          单元测试适用于任何大于几行的代码,无论是哪种语言。我确实对 php 代码进行了单元测试,即使是对于相对较小的项目,并且从中获得了立竿见影的回报。

          【讨论】:

          • 您的意思是测试套件将类似的测试组合在一起,而不是测试用例。
          【解决方案5】:

          google search for "php unit testing" 提供了有关此主题的大量信息。 PHPUnit 项目看起来很有趣。

          【讨论】:

            【解决方案6】:

            单元测试适用于您希望维护的任何代码。

            简而言之,这个想法是编写许多小测试,每个小测试都可以单独运行,并测试代码库中尽可能小的部分(通常是单个类或单个函数)。如果我给这个函数它期望的输入,它会返回我期望的输出吗?如果是这样,这意味着应用程序的其余部分几乎可以假设它可以工作。如果没有,我宁愿在一个小的、简单的、独立的单元测试函数中捕获错误,而不是尝试在整个应用程序中跟踪它。

            当然,它还要求您在编写代码时相当自律,这既是因为必须可以隔离单个函数或类来测试它们,而且因为测试不会自己编写.你必须这样做。 ;)

            鉴于我见过的大多数 PHP 代码的质量,我会说单元测试肯定在 PHP 社区中占有一席之地。事实上,这比几乎任何其他语言都要多。 ;)

            【讨论】:

            • 你知道使用 PHP 的单元测试框架吗?坦率地说,如果您看到 PHP 复杂到足以使单元测试可行,那么您必须质疑 PHP 是否适合这项工作。
            • SimpleTest 和 PHPUnit 是两个。
            • Anothony:我认为语言的复杂性并不重要。只要您有想要测试的代码(并且您通常不希望测试所有您的代码吗?),单元测试都是有益的。它们是否易于针对您的代码库编写是真正的问题,但更多地取决于设计而不是语言。
            • 或许您可以说清楚:它还要求您在编写代码时相当自律:必须将其分解为单元进行测试。
            • @AnthonyWJones:我个人会质疑 PHP 是否适合任何工作。但是,如果您发现自己在使用它,那么您需要获得所有帮助,以确保您的代码比用于编写它的语言更少损坏。所以是的,更有理由对你的代码进行单元测试
            【解决方案7】:

            单元测试是对您编写的一小部分代码的测试。您将其与系统的其余部分隔离开来进行测试,以确保您的代码的那部分工作正常。

            测试大量小部分代码,确保它们工作,然后测试它们一起工作,而不是测试整个系统更容易。

            区分单元测试和自动化单元测试很重要。您应该始终对代码进行单元测试。但是,自动化单元测试是另一回事。

            【讨论】:

              【解决方案8】:

              我见过的大多数 php 几乎不可能进行单元测试。

              Wikipedia 有一篇关于单元测试的文章,如果你有兴趣的话。

              【讨论】:

              • 部分是因为人们混合了逻辑和表示,并且不使用函数。为什么人们似乎讨厌 PHP 中的函数,我无法理解 - DDRY(一定要重复一遍)似乎是 PHP 的口头禅。
              • 这在脚本风格编码中很常见,它是一种被抛弃的编码风格,通常被那些对成为网站设计师而不是开发人员更感兴趣的人所使用。它在 ASP/VBScript 社区中很常见。坦率地说,如果您需要 UT,您应该考虑另一种语言。
              猜你喜欢
              • 2014-01-05
              • 1970-01-01
              • 2011-02-10
              • 1970-01-01
              • 1970-01-01
              • 2019-07-23
              • 2019-05-27
              • 2010-09-08
              • 2018-01-18
              相关资源
              最近更新 更多