facile-it / paraunit-testcase
Requires
- doctrine/orm: >=2.2.3,<2.6-dev
- liip/functional-test-bundle: ~1.3
- symfony/browser-kit: ~2.3|~3.0
- symfony/config: ~2.3|~3.0
Requires (Dev)
- phpunit/phpunit: ~4.0|~5.0
Suggests
- facile-it/paraunit: For parallel test running; it's faster!
README
警告:此包现已废弃;我们建议使用 dama/doctrine-test-bundle 作为替代。
用于测试带有 Doctrine 数据库隔离的 Symfony2/3 应用程序的 TestCase 和 HTTP 客户端
- 每个测试后无需手动清理数据库,这已经自动完成!
- 测试数据库中不再留下垃圾数据
- 随意使用您的 fixtures
- (有点) 更快的功能测试
要求
该包旨在用于 Symfony2/3+Doctrine 应用程序的功能测试。它仅适用于事务性数据库,因此仅适用于实体管理器,抱歉!
如果您需要测试需要身份验证的控制器,最好在测试环境中将安全性设置为 HTTP-basic,以加快测试速度并避免重新测试应用程序的登录功能;如果这对您不可行,请参阅 高级用法。
建议与 facile-it/paraunit 结合使用,以获得更快的测试!
安装
要使用此包,请使用 composer
- 从 CLI:
composer require --dev facile-it/paraunit-testcase
- 或者,直接在您的
composer.json
中
{
"require-dev": {
"facile-it/paraunit-testcase": "~0.4"
}
}
用法
此包提供了一个测试用例类,ParaunitFunctionalTestCase
:为了实现 每个测试方法的事务隔离,请从它扩展您功能测试类。
这样,您的测试在数据库上写入的任何内容
- 在测试方法的任何地方通常都是可读的
- 在测试方法结束时“遗忘”:顶级事务总是回滚
- 写入速度更快(实际上并没有真正到达数据库)
- 您的应用程序将表现得正常:它可以打开和关闭更多事务,并且当提交不正确或不完整的数据时将像往常一样失败
测试控制器
TestCase 提供了一些用于测试控制器操作的实用方法
getUnauthorizedClient()
:扩展的 Symfony HTTP 客户端,用于控制器测试(它可以在事务中读取,甚至在多个请求之间)getAuthorizedClient($user, $password)
:与之前相同,但具有 HTTP 基本认证getEM()
:Doctrine 的实体管理器(事务性)refreshEntity(&$entity, $entityManagerName = null)
:刷新实体的快捷方式,重新从数据库检索所有数据;如果您需要对实体执行一些断言并且想要确保读取的数据与数据库中持久化或回滚的数据相同,这非常有用。
测试 Console ContainerAwareCommand
我们还提供了一个简单的方法来并行测试 ContainerAwareCommand
控制台。要这样做,请使用 ParaunitFunctionalTestCase::runContainerAwareCommandTester()
方法,如下所示
class YourCommandTest extends ParaunitFunctionalTestCase
{
public function testYourCommand()
{
$output = $this->runContainerAwareCommandTester(
new YourCommand(),
[
'argument' => 'argumentValue',
'--option' => 0,
]
);
$this->assertContains('Execution completed', $output);
}
}
如果您想将实例化和执行分开(即如果您需要首先与容器交互),您可以使用 createContainerAwareCommandTester()
方法获取一个 ContainerAwareCommandTester
类,如下所示
class YourCommandTest extends ParaunitFunctionalTestCase
{
public function testYourCommand()
{
$commandTester = $this->createContainerAwareCommandTester(new YourCommand());
$container = $commandTester->getCommandContainer();
// do what you want to the container!
$commandTester->execute(
[
'argument' => 'argumentValue',
'--option' => 0,
]
);
$this->assertEquals(0, $commandTester->getStatusCode());
$this->assertContains('Execution completed', $commandTester->getDisplay());
}
}
注意:该方法返回的 ContainerAwareCommandTester
类扩展了 Symfony 的 CommandTester
类,因此您可以以相同的方式使用它(参见断言);唯一的区别是它提供与我们的测试用例或客户端相同的事务隔离级别。
## 高级用法在使用作为基础测试用例之前,可以更广泛地扩展 ParaunitFunctionalTestCase
- 通过扩展并使用
prepareAuthorizedClient(...)
钩子方法,在需要的情况下向客户端添加额外的身份验证和准备工作 - 如果你覆盖了
setUp()
和tearDown()
方法,请务必首先调用父方法