什么是单元测试,我为什么要关心?

时间:2008-12-06 19:11:21

标签: php javascript unit-testing

好的,我用PHP和JavaScript开发Web应用程序,很多时候在Stack Overflow上我已经看到了单元测试这个词,但我在网站上找不到任何地方对单元测试究竟是什么的满意答案。

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

8 个答案:

答案 0 :(得分:25)

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

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

当然,它还要求你在编写代码方面要有相当的纪律,因为它必须能够隔离单个函数或类来测试它们,并且因为测试不会自己编写。你必须这样做。 ;)

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

答案 1 :(得分:19)

单元测试是一种自动化测试,用于测试给定的代码片段是否符合您在特定环境下的预期。良好的单元测试通常在单个功能级别上测试小功能。

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

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

由于多种原因,单元测试很有用:

  • 在您编写代码时确保代码正常工作,而无需手动测试。在编写函数时,您可以测试您的工作原理,立即捕获错误。
  • 他们继续使用代码,即使您或其他人更改了代码也是如此。一旦函数被编写并完全单元测试(即,它应该做的所有事情都有相关的单元测试验证它们实际上是这样做的),那么如果你或其他任何人破坏了任何这些功能,你马上就会知道你运行单元测试,可以很容易地纠正它。
  • 他们帮助您调试。在尝试诊断手动测试应用程序时发现的错误时,不必查看大量代码,单元测试可以让您专注于较小的功能,从而减少您需要考虑的复杂程度。
  • 他们以代码更改时保持更新的方式记录您的代码。设计文档和注释很容易忘记更新。另一方面,单元测试在未更新时会中断。如果写得清楚,它们会显示在特定情况下实际执行的代码,并且可以向您证明。

单元测试对任何大于几行的代码都很有用,无论语言如何。我肯定是单元测试过的PHP代码,即使对于相对较小的项目,也可以从中获得直接的奖励。

答案 2 :(得分:3)

单元测试是对您编写的一小部分代码的测试。您可以与系统的其他部分隔离测试它,以确保代码的这一部分能够正常工作。

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

区分单元测试和自动化单元测试非常重要。您应该始终对代码进行单元测试。但是,自动化单元测试是另一个主题。

答案 3 :(得分:3)

除了已经回答的内容之外,让测试用例覆盖您的代码可以让您继续Refactoring(改进代码设计而不修改其可观察行为)。

Unit test frameworks for PHP包含PHPUnitSimpleTest compared on StackOverflow

答案 4 :(得分:1)

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

如果您有兴趣,

Wikipedia会有一篇关于单元测试的文章。

答案 5 :(得分:1)

如果您编写任何描述的应用程序,则应考虑单元测试。正确完成后,它们会强制您考虑您向用户提供的代码质量。我认为你在这里遇到的问题是单元测试代码和自动化单元测试之间的区别。单元测试可以像写下一组测试一样简单,然后手动运行它们。

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

答案 6 :(得分:1)

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

虽然乘数确实听起来有些粗糙,但我认为这个论证肯定是合理的。

答案 7 :(得分:0)

A google search for "php unit testing"产生了关于这个主题的宝库。 PHPUnit项目看起来很有趣。