PHP中TDD和/或BDD的状态是什么?

时间:2009-02-10 00:53:16

标签: php testing tdd bdd

在PHP世界中,测试的广泛性,支持性,开发性如何?与Java相提并论?那里有Ruby / Rails?我用Google搜索并发现测试框架存在,但我想知道它们是否被广泛使用。

主要的PHP IDE是否具有Eclipse Java工具或NetBeans的Ruby / Rails工具的内置测试运行器?测试是否像Rails一样构建在PHP的MVC框架中?

我问,因为我工作的小组想聘请某人为他们开发PHP应用程序。我担心质量和维护,因为我可能会被要求支持这件事。

9 个答案:

答案 0 :(得分:44)

至少有两个成熟的,独立的JUnit样式测试套件,分别名为PHPUnitSimpleTest

就MVC框架而言,Symfony有自己的测试框架lime,Code Igniter有一个unit_test库,CakePHP依赖于前面提到的SimpleTest。

我知道Zend Studio内置了对PHPUnit测试的支持,PHPUnit和SimpleTest都有命令行运行器,因此可以集成到任何工作流程中。

如果开发人员希望利用它们,PHP世界中的工具就在那里,而智能商店也会利用它们。

警告是您投诉PHP课程的标准。有两个PHP社区; PHP作为构建软件的平台,PHP作为与Web服务器,Web浏览器和数据库交互的方式,在We​​b上生成类似应用程序的东西。它不是黑白相间的东西,更像是连续统一体;在软件开发人员方面,更多的单元测试和TDD支持和使用在任何其他平台上。在“拼凑一堆我不理解但仍能得到结果的人”中,这是闻所未闻的。

有许多非框架/自定义框架遗留PHP代码,很难获得有用的测试工具。 PHP也很容易适用于依赖于运行浏览器环境的模式。除了我自己的观察之外,我没有任何证据支持这一点,但很多关心测试的PHP商店最终都依赖于验收测试(即Selenium)来代替实际的单元测试,测试优先等发展。

在您的具体情况下,采访您的团队将要雇佣的开发人员。

  1. 询问他们使用的单元测试框架

  2. 要求他们概括地描述他们开发新功能及其支持测试的真实世界示例

  3. 请他们概括地描述他们的测试失败的时间以及他们为解决问题所采取的措施的现实世界示例

  4. 您对他们将要描述的具体情况不太感兴趣,并且对他们在一般情况下讨论他们的代码测试知识的方式更感兴趣。

答案 1 :(得分:11)

每当我使用XUnit样式工具TDD项目时,我都很难在正确的位置找到我的头。我发现使用专为行为驱动开发而设计的工具或“Specification by example”使我更容易do TDD right - 即专注于设计,暴露意图和describing behaviour in specific contexts 测试。

那就是说,我想在会话中介绍pecs。来自项目现场的自述文件。

  

pecs是一个微小的行为驱动开发库,适用于PHP 5.3,la RSpec或JSpec。

如果您已经使用过JSpec或更好,Jasmine-BDD(对于JavaScript),描述行为的佩奇风格应该非常熟悉。我发现这种风格非常适合组件级规格。如果您正在寻找功能级别规范(故事或用户验收测试)的PHP工具,请考虑Behat

回到佩奇,这是一个从佩奇项目网站中剔除的例子:

describe("Bowling", function() {
  it("should score 0 for a gutter game", function() {
    $bowling = new Bowling();
    for ($i=0; $i < 20; $i++) {
      $bowling->hit(0);
    }
    expect($bowling->score)->to_equal(0);
  });
});

是的,这是一个PHP规范。通过pecs源代码,看起来作者能够通过利用PHP 5.3 +,Lambdas和闭包中的新热点来解决这个问题。所以我想这意味着你不能在任何基于PHP的项目中使用pecs&lt; 5.3(仅供参考)。

另外,pecs不像PHPUnit或SimpleTest那样成熟。但是,我认为PHP社区中BDD的支持者应该支持像pecs这样的工具的增长,这些工具鼓励“通过示例进行规范”或BDD,而不会因为必须使用传统的XUnit测试工具而产生混淆。

这些天我在Python中比PHP工作更多。但是,下次我选择一个PHP项目时,如果我有一个像pecs这样的成熟的,社区支持的工具来制作软件的规范,我将非常高兴。

答案 2 :(得分:5)

我对Behat / Mink http://behat.org

有过惊人的体验

我同意其他人的PHP作为一个单元测试平台不是一个有趣或经验BDD是最好的方式,如果你使用任何PHP框架

作为repo构建工具缠绕在作曲家周围是最大的绊脚石,但我们能够使用Behat Mink Selenium Webdriver独立服务器jar作为一个惊人的设计和回归测试工具。我们曾经在Jenkins服务器上运行我们的CakePHP应用程序的回归套件,但事实证明它不是那么“快速失败”

现在我们的工作流程如下: 用小黄瓜创造故事 精炼故事 写入功能并删除任何新的步骤defs 开始编写php解决方案来测试 然后在最后我们有一个工作特性或错误修复与bdd测试覆盖它

我们设置了一个带有Behat设置的Ubuntu VM并将其复制到每个工作站。我们将它融入我们的流程中。我们只需更改运行测试,然后开始编写新内容。

我们写了一个shell脚本来自动运行mysql转储并在每个特性之前加载它们,这使得重构代码变得轻而易举。

Mink WebAssert类为您提供验证行为所需的所有断言 常规会话/ CommonContext类非常适合使用css或xpath。

我之前使用过Capybara / WebDriver和Java和Rails项目,发现与Behat相比,设置开销/学习曲线太高了。

答案 3 :(得分:4)

除了Alan已经提到的库/框架之外,你还可以使用mod_perl的Apache :: Test,我将其用作线束。它允许我非常简单地将测试集成到我的发布过程中。线束使用TAP输出(测试任何协议)来确定测试是通过还是失败,使用Test::Simple或Test :: More(PerlPHP等库)。

开箱即用Apache :: Test支持在Perl和PHP中编写测试。在我自己的项目中,需要一点bit of trickery和大量的阅读才能真正实现它,但Test::More in PHP的实现是内置于线束中的。运行用PHP和Perl编写的所有测试都是通过一个命令完成的,并且沿途的任何失败都是Apache :: Test,但最好的是它可能出错了。

关于这一切的很棒的部分是你甚至可以使用PHPUnit或Simple-Test以及前两个测试框架。通过在每个相应的库中运行测试,您可以使用Test :: More的PHP实现(甚至是测试stdout的Perl)并吐出TAP以便您的线束进行解释。

请务必阅读Apache::Test文档和mod_perl guide to running Apache::Test。另外,我发现文章here非常有帮助。

作为一个简单的示例,您可以在极少数代码中设置Perl中的测试,这些代码将贯穿您网站上的所有网页(包含链接)并验证所有结果中的“200 OK”响应和没有任何解析错误:

#!perl

use strict;
use warnings;

use Apache::Test qw(:withtestmore);
use Apache::TestRequest;
use Test::More;
use Test::WWW::Mechanize;
use WWW::CheckSite::Validator;
use WWW::CheckSite::Spider;

plan 'no_plan';

my $config = Apache::Test::config();
my $host = "http://". Apache::TestRequest::hostport($config) || '';

my $s = WWW::CheckSite::Spider->new(
    uri => $host,
    ua_class => 'Test::WWW::Mechanize',
);
my $m = $s->current_agent;

while (my $page = $s->get_page) {
    is($m->status(), "200", $m->uri() ." retrieved successfully.");
    $m->content_lacks("Parse Error", $m->uri() ." does not contain syntax errors.");
}

答案 4 :(得分:3)

在过去的项目中,我使用过PHPUnit,这让我想要了。 PHPUnit +命令行运行测试, 因为编写测试花了太多时间,速度不够快,而且似乎以我不喜欢的方式限制了代码的样式(对象更容易测试,所以它似乎有点像赞成对象)。

Selenium是我们讨论过的解决方案,但从来没有开始发挥作用,我认为我们真的会从这种输出级测试中受益。

在这个最新的项目中,首席程序员采用了更多功能的编程方法,因为我们一直在修改软件。当我提到我想通过TDD进行编码时,他在一天或更短的时间内制定了一个自定义解决方案,我认为这对我来说就像使用PHPUnit一样有效。此外,他真正开始关注面向对象与功能编程的问题。

第一个项目,从零开始,在底层,面向对象编码,大型单元测试框架,它变得单一,并迅速陷入困境。第二个项目,完善的CMS软件,具有5年的历史和旧代码,但功能编程范例和简单的测试框架(我们实际上经常使用php断言)使它变得更简单,而不是增加复杂性。

第二个项目也没有达到实现Selenium的目的(我仍然认为它会有所帮助),但函数式编程方法使得处理代码内测试变得更容易。

答案 5 :(得分:3)

我刚刚发现了这个问题,而我仍处于“研究阶段”,正在弄清楚发生了什么。我刚刚发现Ruby on Rails的一些东西叫做“Cucumber”http://cukes.info/

它本质上是Ruby的“故事驱动开发”,很可能是功能测试领域的黄金标准,至少就我在旅行中所见。 (我把它公之于众,所以专家可以纠正我,如果我错了)

作为Cucumber语言的一个例子,你有一些非常类似于SQL的东西。 BUT 似乎更具人性化。从cukes首页他们的语言看起来像这样:

 Scenario: Add two numbers
      Given I have entered 50 in the calculator
      And I have entered 70 in the calculator
      When I press add
      Then the result should be 120 on the screen

以上将编译并作为测试运行。

现在这是回答有关PHP的问题的所有序言 - BDD&amp; TDD。

在回应上述评论时,PHPUnit将允许进行单元测试,并根据此博客文章:http://sebastian-bergmann.de/archives/738-Support-for-BDD-and-Stories-in-PHPUnit-3.3.html还支持“故事风格”BDD测试。

为了扩展上述关于“SIMPLETEST”的答案,ST系统有一个用于浏览器自动化的内置浏览器对象类,而PHPUnit具有SELENIUM浏览器自动化的扩展http://seleniumhq.com(优势) Selenium与SimpleTest相比,Selinium将运行任何页面上的JavaScript,而SimpleTest则不会。)

我希望您发现这些信息很有用,因为这是几个月的个人研究和上述技术的实际尝试和错误的结果。如果有专家可以澄清并提高我对上述内容的理解,我欢迎反馈。

  • 亚历。

答案 6 :(得分:2)

Michael Booth对两种语言的BDD测试功能的比较:

http://mechanicalrobotfish.com/posts/117-ruby-vs-php-bdd-beauty-contest-no-contest

总结说,此时PHP BDD工具和文化还不发达。

当然,与知识(书籍,视频,文章,博客文章)或工具(Rspec,Shoulda,Factory Girl,Mocha,Cucumber)相比,Ruby程序员可以获得的内容没有任何可比性。

答案 7 :(得分:0)

现在我正在为BDD测试开发“Spectrum”框架:https://github.com/m-haritonov/spectrum

答案 8 :(得分:0)

您可能想查看PHPStorm。我喜欢在IDE中使用PHPUnit的测试运行器。