如何在PHP中进行集成测试?

31

我目前正在对我的代码进行单元测试(使用PHPUnit和Jenkins),但我已经阅读了很多关于集成测试的内容。

  • 是否有任何工具可以在PHP中执行此操作(最好是自动化)?

  • 如何实现它?是否有任何好的教程可供参考?

3个回答

15
多年以后……现在有一个框架叫做Codeception,你可以用它来进行单元测试、集成测试和功能测试
Codeception使用PHPUnit作为其测试的后端。因此,任何PHPUnit测试都可以添加到Codeception测试套件中。
单元测试中,您将模拟数据库访问、文件系统、HTTP请求和其他组件,以隔离代码并使其更快。
集成测试不需要执行独立的代码,这意味着您将真正使用这些组件,并检查输出/结果是否符合预期。
举个例子,请看来自Codeception DOC的这个集成测试示例:
<?php
function testSavingUser()
{
    $user = new User();
    $user->setName('Miles');
    $user->setSurname('Davis');
    $user->save();
    $this->assertEquals('Miles Davis', $user->getFullName());
    $this->tester->seeInDatabase('users', ['name' => 'Miles', 'surname' => 'Davis']);
}

5
基本上,实现单元测试之外的另一种方法是实现模拟测试,这些测试不仅仅测试单个单元,更像是将一组单元绑定在一起,并将它们视为一个逻辑单元,应以某种方式行为,同时提交一些输入或调用方法。
其中一个可能的库是谷歌代码库中的yaymock,它是一个 php5 模拟库。
进一步的集成测试更多地只是测试整个系统的行为。基本的事情是设置一个测试环境并在部署应用程序后进行测试。您可以使用单元测试框架或模拟库来进行此类测试。随您的意愿。在您的情况下,详细的集成测试是基于数据库中的某些数据和预期的可能的“HTML”输出的 HTTP 请求。
要自动化此过程,您可以使用一些持续集成框架...... Hudson、Arbit 或 phpUnderControl。有一个非常好的tutorial,介绍了如何使用 hudson 设置 php 和一些不错的测试插件。它还提到了一些有用的插件,例如代码覆盖率检查等,这些插件可以集成到环境中。

使用yaymock相比内置的PHPUnit功能有什么优势吗? - JoshB
Mock库是专门为测试对象方法调用链而设计的。单元测试不是。项目页面中有一个维基页面,其中展示了一些示例,演示了这些测试([UsingMockObjects](http://code.google.com/p/yaymock/wiki/UsingMockObjects)),您将看到与普通单元测试相比的优势。但是要明确的是,模拟测试并不能替代单元测试。 - fyr
谢谢你。这似乎是正确的方法。 - JoshB
3
嘲弄依赖库(通过嘲笑它们)不会将其从被测试的代码中删除,因此实际上不再测试集成吗? - fideloper
你说得没错,“mocking”总是会削减一些东西。可能是一个库,可能是一个模块,也可能是一个依赖的后端系统,但如果不这样做,你只能进行正向测试。另一个方面是覆盖率。通过“mocking”事物,你还应该注意确保你的系统覆盖率仍然很高。 - fyr
在我看来,你不能依赖于模拟服务/控制器层。它不会受到任何外部软件的影响,因此它不是与任何东西集成。例如,如果你运行一个Web应用程序,你需要一个正在运行的“服务器进程”(初始措施-响应时间/压力阈值-它可能会崩溃),以及对网络协议的序列化/反序列化(基本上是解释浏览器GET/POST负载到你的控制器),还需要一组定义好的“顺序操作”(可能针对各种控制器/端点-因此将它们一起测试-集成)。 - mschr

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接