如何用PHPUnit报价工作?


9

我从事网站编程已有15年之久,而过去5年来一直从事PHP。我总是写扎实的代码。但是,我有一个客户坚持要对80%的代码进行单元测试。由于客户端总是正确的,因此我计划使用PHP_CodeSniffer来确保我的代码看起来正确,并使用PHPUnit来进行单元测试。我希望通过这次经历学习一些东西。

这些是正确使用的工具吗?设置PHPUnit和编写其他代码需要多少时间?与过去一样,我需要大约8周的时间来编写网页和进行自测。如果我再增加4天(10%)进行单元测试(PHPUnit),就足够了吗?有什么想法吗?有什么建议吗?谢谢。


2
单元测试可以使开发时间加倍。

您使用过PHP 2.0?真好!简而言之,我的输入不符合答案的条件:对于工具的选择,您正确地选择了恕我直言。请参阅我对php测试框架的看法,对于phpcs,我什至不知道其他任何选择。需要补充的时间:在执行TDD一段时间后,通常没有它我会变慢,但是当我开始某些事情时,时间会更长(+ 50%)。如果您使用的框架会使测试变得困难(很多静态的东西),那么会增加更多。
edorian 2011年

1
它会增加最初的前期开发,但是在一个为期8周的项目中,您会发现它的影响较小,因为单元测试将帮助您更早,更轻松地发现错误。
Fenton

1
@Dragon,有点,但是单元测试也可以加快开发速度[部署/测试/查找/修复周期少很多
僧侣2011年

Answers:


7

一句话:这取决于您的工作方式。我庄严地认为10%太少了。它应该至少为25%,如果不是40%,如果不是60%,如果不是更多。

首先,我非常同意您在那里的客户。单元测试是功能强大,易于维护,易于调试的产品的重要组成部分。

我会用我所知道的说话。对于大多数项目,我都使用TDD(测试驱动开发)。TDD基本上使您在实际代码之前编写测试。他们建立了一套最终产品需要满足的验收标准。通常,您将花费50%到70%的时间来编写测试,其余时间用于实施代码以使它们通过。

尽管这听起来很荒谬和/或巨大,但我可以向您保证不是。原因如下:

  • 您将能够找出编写测试时要使用的最佳架构模式。这样,当您开始编码时,应用程序体系结构将发生最小的变化(因为我们都知道重做应用程序体系结构的成本很高)。
  • 您仅编写代码以使测试通过(因此使最终产品可以接受)。您将不会花时间对无用/范围外的功能进行编程。
  • 通过减少代码量(即:仅实际需要的代码),就减少了出错的可能性。(更少的代码=更少的错误)。
  • 如果您确实犯了一个错误,那么您将花费更少的时间来找出原因所在以及问题出在哪里。如果测试编写正确,则意味着单个错误将导致单个故障,而不是连锁反应。这样,您可以在几分钟(甚至几秒钟)内轻松查明问题根源。
  • 用单元测试实现实际代码将花费更少的时间。一旦测试失败,您就会知道出了点问题。您不必与客户端反复来解决错误。
  • 您最终将不得不与客户端来回修复错误,因为没有东西可以捕获100%的错误。但是,您可以轻松捕获95%(甚至更多)。

PHPUnit实际上是用于单元测试PHP的事实上的工具,并且在这一方面非常出色。我没用过PHP_CodeSniffer。但是,我认为如果您一个人工作,则可能不需要它。在团队中,无论谁进行编码,都要确保代码看起来相同,这一点更为有用。


5

向您表明您将从这种经验中学到东西的态度。我相信你会的。

您应该学习的第一件事是,单元测试的必要性与您的经验无关。最好的开发人员也将成为最好的单元测试人员之一:

Bill Venners:您在书《 Refactoring 》中说:“如果要重构,基本前提是要进行可靠的测试。” 这是否意味着如果您没有测试,就不应该重构?

马丁·福勒(Martin Fowler):您应该将其视为走钢丝的绳索。如果您擅长走钢丝,而且走不高,那么您可以尝试一下。但是,如果您以前从未走过钢丝,并且经过了尼亚加拉大瀑布,那么您可能想要一个好的网。

来自http://www.artima.com/intv/refactorP.html

我以前是在没有单元测试的情况下编写PHP的。然后,经过多年使用Java进行单元测试的实践,我发现如果没有单元测试,我将无法处理比PHP中的单个页面复杂得多的事情。原因?生产力。没有单元测试,我就无法信心十足地进行重构–这意味着要么A)我将不得不拆掉更多东西并从头开始处理所有事情,要么B)我将不得不处理丑陋的旧代码。

竞标时,您需要考虑时间进行测试吗?是的。看起来很直觉会花费更多时间吗? 是的,再次。正如其他一些答案所粗略估计的那样,您可能需要比没有单元测试的情况多估计50-100%

然而!...

  • 您将更早发现并解决规格漏洞
  • 这意味着您将开发出更清洁,更可靠的规格
  • 您将能够快速而自信地对规格更改做出响应
  • 您将减少错误
  • 您的错误将被更快更容易地发现

结果,您的估计将更加准确。如果按小时收费,您将给客户留下更多印象,并能够提高费率。如果您按固定费率收费,则每小时可以赚更多的钱。

如果不进行测试,您的估算值很可能是垃圾。错误,更改顺序和重新定义对于准确估算都是很糟糕的。测试是最小化这三个因素的关键!


3

对于要花多长时间,没有一个简单的答案。

但总的来说,如果这是一个简短的项目:我想说,加上良好的单元测试,开发所需的时间是不进行单元测试的开发时间的1.75-2倍。对于更长的项目,可能是25%到30%?

我建议编写代码之前进行单元测试。通过这种方式,构建单元测试支架实际上已成为设计过程的一部分,因此,您不应该考虑浪费时间进行单元测试,而应该通过构建单元测试来帮助您设计组件。出色的产品以及构建后的测试的存在,可以使您更轻松地确保保持这种状态。必须先编写单元测试,这有助于专注于实际需求,这为我们提供了一种清晰的方法来测试我们是否完成(通过单元测试),并帮助我们“尽早测试并经常测试”。

至于PHPUnit...。自从我使用它已经有一段时间了,我的印象是它功能强大,但是在真正完善之前可能还需要更多的工作。

不过,如果我想在这里交流一下:请不要在项目结束时将单元测试视为一种形式。我认为,仅此而已,就毫无价值。


3

到目前为止,答案是非常详尽的,因此,我只想加一个未涵盖的问题:由于使用PHPUnit而产生的额外时间将是

  1. 首先,因为您正在学习它,并且
  2. 增强对非测试开发时间的信心。

不处理表示的单元测试模型类非常简单。您为每个类编写一个测试,在这些测试用例中,您可以直接实例化和配置一个对象以测试特定的方法/功能。一旦安装并运行了PHPUnit,就可以使这些测试快速进行。

单元测试网页可能更加棘手。如果您使用Zend Framework,Symfony,Smarty或任何其他MVC引擎,则使PHPUnit与它们配合使用可能会花费更多时间。我们使用Zend Framework,我花费了大量时间来建立基础类来测试控制器和隔离地查看脚本。考虑到该项目的规模,您最好从开始ControllerTestCase

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.