tbaronnat / functional-test-bundle
与Symfony集成的简单功能测试包系统
v1.0.10
2024-03-18 11:08 UTC
Requires
- php: >=8.1
- ext-dom: *
- fakerphp/faker: ^1.5
- symfony/console: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/framework-bundle: ^6.0|^7.0
- symfony/security-bundle: ^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- symfony/test-pack: ^1.1
README
定义
此包调用配置中定义的所有路由。
它对此路由的“删除”、“创建”、“更新”和“索引”操作进行测试。
- “索引”操作将访问定义的路由,并检查其是否可访问。
- “创建”操作将使用有效值填写表单类型,并将表单提交到您的路由,并检查是否所有操作都成功。
- “更新”操作将使用有效值更新现有的表单类型,并将表单提交到您的路由,并检查是否所有操作都成功。
- “删除”操作调用您的DELETE路由,并检查所有操作是否成功。
如何使用
1. 在“tests”目录中创建一个控制器类,它扩展自AbstractControllerTest
2. 测试配置示例
tbaronnat_functional_test:
configs:
conf_admin:
userRepository: 'app.repository.admin_user'
firewall: 'admin'
userId: 1
conf_user:
userRepository: 'app.repository.user'
firewall: 'main'
userId: 1
options: #Any additional options that you want
option1: 'value1'
option2: 'value2'
params:
dashboard:
config: 'conf_user'
action: 'index'
controller: 'App/Controller/DefaultControllerTest' #The controller used to execute test
method: 'GET'
route: 'dashboard'
finalRoute: 'dashboard'
locale: 'fr_FR' #Used for example in form fill generator for phone number in selected country locale (default: en_US)
options: #Any additional options that you want
option1: 'value1'
option2: 'value2'
admin_dashboard:
config: 'conf_admin'
action: 'index'
controller: 'App/Controller/DefaultControllerTest'
method: 'GET'
route: 'admin_dashboard'
finalRoute: 'admin_dashboard'
admin_user_index:
config: 'conf_admin'
action: 'index'
controller: 'App/Controller/DefaultControllerTest'
method: 'GET'
route: 'admin_user_index'
finalRoute: 'admin_user_index'
admin_user_update:
config: 'conf_admin'
action: 'update'
controller: 'App/Controller/DefaultControllerTest'
method: 'POST'
route: 'admin_user_update'
routeParams:
id: 1
finalRoute: 'admin_user_update'
finalRouteParams:
id: 1
admin_user_delete:
config: 'conf_admin'
action: 'delete'
controller: 'App/Controller/DefaultControllerTest'
method: 'DELETE'
route: 'admin_user_delete'
routeParams:
id: 1
finalRoute: 'admin_user_index'
csrfProtection: false #important if you want that your "DELETE" tests works, disable csrf protections for forms
admin_user_create:
config: 'conf_admin'
action: 'create'
controller: 'App/Controller/DefaultControllerTest'
method: 'POST'
route: 'admin_user_create'
finalRoute: 'admin_user_index'
followRedirects: true
3. 添加选项以覆盖配置中的一些逻辑
在您的测试控制器中添加一些逻辑,并替换方法makeRequest的params以从数据库检索现有对象并将“id”替换为动态值。
这样,您可以不必指定要测试的对象的id
例如(如果您想使用它,我可以为它创建RouteParamsTestRepositoryTrait)
// Test configuration in tbaronnat_functional_test.yaml
// for route params "id" or "userId", put any value
config:
userRepository: 'app.repository.user'
firewall: 'main'
userId: 0
options:
repositoryMethod: 'findOneEnabledUser'
params:
admin_user_update:
config: 'conf_admin'
action: 'update'
controller: 'App/Controller/DefaultControllerTest'
method: 'POST'
route: 'admin_user_update'
routeParams:
id: '-'
finalRoute: 'admin_user_update'
finalRouteParams:
id: '-'
options:
repository: 'admin.repository.user'
admin_user_delete:
config: 'conf_admin'
action: 'delete'
controller: 'App/Controller/DefaultControllerTest'
method: 'DELETE'
route: 'admin_user_delete'
routeParams:
id: 1
finalRoute: 'admin_user_index'
csrfProtection: false
options:
repository: 'admin.repository.user'
repositoryMethod: 'findOneEnabledUser'
// ControllerTest:
use TBaronnat\FunctionalTestBundle\Traits\RouteParamsTestRepositoryTrait;
use TBaronnat\FunctionalTestBundle\Traits\UserConfigTestRepositoryTrait;
class DefaultControllerTest extends AbstractControllerTest
{
use RouteParamsTestRepositoryTrait;
use UserConfigTestRepositoryTrait;
protected function getTestParams(string $name, array $params): TestParamsInterface
{
$parameters = parent::getTestParams($name, $params);
$this->replaceIdRouteParams($parameters, 'id');
return $parameters;
}
protected function getTestConfig(string $configName): TestConfigInterface
{
$config = parent::getTestConfig($configName);
$this->replaceConfigUserId($config);
return $config;
}
}
4. 在项目中使用dama/doctrine-test-bundle以在每次测试后回滚所有数据库更新
带有dama的示例phpunit配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="tests/bootstrap.php">
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">src</directory>
</include>
</coverage>
<php>
<ini name="error_reporting" value="-1"/>
<server name="APP_ENV" value="test" force="true"/>
<server name="SHELL_VERBOSITY" value="-1"/>
<server name="SYMFONY_PHPUNIT_REMOVE" value=""/>
<server name="SYMFONY_PHPUNIT_VERSION" value="8.5"/>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled" />
</php>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<listeners>
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener"/>
</listeners>
<!-- Run `composer require symfony/panther` before enabling this extension -->
<extensions>
<extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
<!-- <extension class="Symfony\Component\Panther\ServerExtension" />-->
</extensions>
</phpunit>