shopsys / http-smoke-testing
用于测试您Symfony项目中所有配置路由的HTTP smoke测试用例
Requires
- php: ^8.3
- doctrine/annotations: ^1.10.4
- phpunit/phpunit: ^9.5.20
- symfony/dependency-injection: ^3.4|^4.0|^5.0
- symfony/framework-bundle: ^3.4|^4.0|^5.0
- symfony/http-foundation: ^3.4|^4.0|^5.0
- symfony/routing: ^3.4|^4.0|^5.0
Requires (Dev)
- php-parallel-lint/php-parallel-lint: ^1.3.1
- shopsys/coding-standards: 14.0.1
Conflicts
- symfony/dependency-injection: 3.4.15 || 3.4.16
- 16.0.x-dev
- 15.0.x-dev
- 14.0.x-dev
- v14.0.1
- v14.0.0
- 13.0.x-dev
- v13.0.0
- 12.1.x-dev
- 12.0.x-dev
- v12.0.0
- v11.1.0
- dev-master / 11.0.x-dev
- v11.0.0
- 10.0.x-dev
- v10.0.5
- v10.0.4
- v10.0.3
- v10.0.2
- v10.0.1
- v10.0.0
- 9.1.x-dev
- v9.1.3
- v9.1.2
- v9.1.1
- v9.1.0
- 9.0.x-dev
- v9.0.4
- v9.0.3
- v9.0.2
- v9.0.1
- v9.0.0
- 8.1.x-dev
- v8.1.2
- v8.1.1
- v8.1.0
- 8.0.x-dev
- v8.0.0
- 7.3.x-dev
- v7.3.7
- v7.3.6
- v7.3.5
- v7.3.4
- v7.3.3
- v7.3.2
- v7.3.1
- v7.3.0
- 7.2.x-dev
- v7.2.2
- v7.2.1
- v7.2.0
- 7.1.x-dev
- v7.1.1
- v7.1.0
- 7.0.x-dev
- v7.0.1
- v7.0.0
- v7.0.0-beta6
- v7.0.0-beta5
- v7.0.0-beta4
- v7.0.0-beta3
- v7.0.0-beta2
- v7.0.0-beta1
- v7.0.0-alpha6
- v7.0.0-alpha5
- v7.0.0-alpha4
- v7.0.0-alpha3
- v7.0.0-alpha2
- v7.0.0-alpha1
- v1.1.0
- v1.0.1
- v1.0.0
- dev-alpha
- dev-rc-15-0-0
- dev-pt-yaml-standards-vol-2
- dev-rc-12-0-0
- dev-tl-fix-failing-12-0-builds
- dev-mg-js-translations-fix
- dev-mg-split-repo
- dev-rc-11-1-0
- dev-mg-deployment
- dev-mg-project-cold-fusion
- dev-mg-remove-manifests
- dev-tl-fix-project-base
- dev-rc-11-0-0
- dev-rc-10-0-5
- dev-rk-fw-uprage-from-10-to-11-part-3
- dev-rc-v9-1-3
- dev-rc-10-0-4
- dev-rc-10-0-3
- dev-rc-10-0-2
- dev-rc-10-0-1
- dev-mg-fw-933-remove-rootdir
- dev-mg-release-lock
- dev-mg-remove-twig-extension
- dev-rk-fw-1019-api-query-name-in-symfony-profiler
- dev-rk-fw-uprage-from-10-to-11-part-1
- dev-rk-fw-uprage-from-10-to-11-part-2
- dev-rc-10-0-0
- dev-mg-upgrade-php8
- dev-mg-remove-be-api-integration
- dev-rv-fw-837-doctrine-upgrade
- dev-rv-fw-847-migrations-tests
- dev-mg-php-versions
- dev-rv-fw-810-fix-actions
- dev-mg-improve-entity-extension
- dev-rc-v9-1-2
- dev-mg-allow-dependency
- dev-mg-fix-phpstan-packages
- dev-mg-force-proxy-manager-version
- dev-mg-update-node
- dev-origin/tl-phpstan-all-packages
- dev-tl-release-9-1-1
- dev-ds-coding-standards-allow-symfony-5-higher
- dev-tl-remove-package-builder
- dev-tl-github-actions-for-packages
- dev-rc-v7-3-7
- dev-ds-fix-ecs
- dev-mg-update-helios-elfinder
- dev-tp-allow-coding-standards-for-symfony5
- dev-rc-v9-1-0
- dev-rc-v9-0-4
- dev-mg-php74-only
- dev-tl-fix-docker-limits
- dev-rc-v9-0-3
- dev-ds-more-coding-standards
- dev-ds-ecs-path-fix
- dev-rc-v9-0-2
- dev-ds-eof-new-line
- dev-ds-phpstan-lvl-5
- dev-tl-fix-phpstan
- dev-rc-v9-0-1
- dev-ds-fixed-framework-standaards
- dev-tl-add-psr-14
- dev-rc-v8-1-2
- dev-rc-v9-0-0
- dev-tl-fix-current-customer-user
- dev-tp-js-fixes
- dev-vitek-rostislav-patch-3
- dev-tg-grunt-webpack
- dev-tp-symfony4
- dev-rv-eur-on-first-domain
- dev-tp-update-composer
- dev-ds-easier-elastic-extensebility
- dev-rc-v8-1-1
- dev-rc-v8-1-0
- dev-tp-npm-link
- dev-mg-weird-flex-but-ok
- dev-ds-fix-project-base-dependency
- dev-ds-fix-sed-macos
- dev-mg-graphql-categories
- dev-tl-rv-datafixtures-refactoring
- dev-ds-kubernetes-simplify
- dev-ds-kubernetes-simplify-test
- dev-rv-extended-classes-fixer
- dev-rv-phpstan-lvl4
- dev-ds-test-install-script-automatically
- dev-rc-8-0-0
- dev-ss-api-import-products
- dev-do-version-lock
- dev-rc-v7-3-3
- dev-rc-v7-3-4
- dev-rc-v7-3-5
- dev-rc-v7-3-6
- dev-ss-api-separated-from-default-project-base
- dev-do-elastic-structure-deploy
- dev-mg-fix-k8s-https
- dev-ph-price-calculation
- dev-ph-redis-clients
- dev-rc-v7-3-0
- dev-tl-fix-tests-bc-break
- dev-tl-removed-tests-bc-break
- dev-tl-united-non-bc-break-service-injections
- dev-ss-tl-api-products
- dev-tl-end-support-php-71
- dev-bb-flysystem-volume-driver
- dev-bb-initcontainer-owner-fix
- dev-bb-multidomain-sitemap
- dev-do-mg-mail-attachments
- dev-do-phpstan-upgrade
- dev-ph-phing-test
- dev-rv-read-model-bck
- dev-jg-redis-cache
- dev-mg-elastic-filtering
- dev-bb-ecs-hotfix
- dev-do-fixtures-project-base
- dev-jg-form-ordering
- dev-mg-multiple-cron
- dev-rv-better-php-doc-parser-config
- dev-rv-upgrade-ecs
- dev-mc-cdn-bucket
- dev-sspooky13-pt-yaml-standards
- dev-do-product-export-fix
- dev-mc-ph-google-cloud-bundle
This package is auto-updated.
Last update: 2024-09-25 11:41:46 UTC
README
此包允许您对Symfony应用程序进行简单的HTTP smoke测试。
基本上,它为应用程序路由器提供的每个页面(控制器操作)生成一个HTTP请求,然后断言返回的HTTP响应码是否正确。
虽然这不是一个非常复杂的检查,但它可以回答一个基本问题 "它是否运行?"。它防止您在修改共享代码时在一些看似无关的页面上触发 500 服务器错误。此外,在初始配置后,它几乎是无需维护的,因为它会自动检查任何新的路由。
此存储库由shopsys/shopsys monorepo维护,有关更改的信息请参阅monorepo CHANGELOG.md。
安装
将包添加到您的应用程序中的require-dev
composer require --dev shopsys/http-smoke-testing
此包内部使用PHPUnit来运行测试。这意味着您需要正确设置您的phpunit.xml
。幸运的是,Symfony附带示例配置。将您的项目根目录中的phpunit.xml.dist
重命名为phpunit.xml
(在Symfony 2中为app/phpunit.xml.dist
)应该足够了。
注意:如果您在项目中未找到该文件,请检查Symfony Standard Edition中的示例。
使用
创建一个新的PHPUnit测试,扩展\Shopsys\HttpSmokeTesting\HttpSmokeTestCase
类,并实现customizeRouteConfigs
方法。
您可以通过以下方式运行您的测试
php vendor/bin/phpunit tests/AppBundle/Smoke/SmokeTest.php
(或Symfony 2中的php bin/phpunit -c app/phpunit.xml src/AppBundle/Tests/Smoke/SmokeTest.php
)
警告:此包通过执行实际请求来检查所有路由。 非常重要,不要在生产数据上执行它。 您可能会无意中删除或修改您的数据或第三方服务上的真实请求。 即使您实现了保护应用程序免受副作用的方式(例如,数据库事务包装),您也不应该在生产数据上执行测试。
示例测试类
namespace Tests\AppBundle\Smoke; use Shopsys\HttpSmokeTesting\Auth\BasicHttpAuth; use Shopsys\HttpSmokeTesting\HttpSmokeTestCase; use Shopsys\HttpSmokeTesting\RouteConfig; use Shopsys\HttpSmokeTesting\RouteConfigCustomizer; use Shopsys\HttpSmokeTesting\RouteInfo; use Symfony\Component\HttpFoundation\Request; class SmokeTest extends HttpSmokeTestCase { /** * @param \Shopsys\HttpSmokeTesting\RouteConfigCustomizer $routeConfigCustomizer */ protected function customizeRouteConfigs(RouteConfigCustomizer $routeConfigCustomizer) { $routeConfigCustomizer ->customize(function (RouteConfig $config, RouteInfo $info) { // This function will be called on every RouteConfig provided by RouterAdapter if ($info->getRouteName()[0] === '_') { // You can use RouteConfig to change expected behavior or skip testing particular routes $config->skipRoute('Route name is prefixed with "_" meaning internal route.'); } }) ->customizeByRouteName('acme_demo_secured_hello', function (RouteConfig $config, RouteInfo $info) { // You can customize RouteConfig to use authentication for secured routes $config->changeDefaultRequestDataSet('Log in as "user".') ->setAuth(new BasicHttpAuth('user', 'userpass')); }); } /** * @param \Symfony\Component\HttpFoundation\Request $request * @return \Symfony\Component\HttpFoundation\Response */ protected function handleRequest(Request $request) { $entityManager = self::$kernel->getContainer()->get('doctrine.orm.entity_manager'); // Enclose request handling in rolled-back database transaction to prevent side-effects $entityManager->beginTransaction(); $response = parent::handleRequest($request); $entityManager->rollback(); return $response; } }
文档
默认情况下,测试会对每个路由进行请求,不使用任何身份验证或提供任何参数,并期望响应具有HTTP状态码200 OK。
要更改此行为,您必须在测试中实现方法customizeRouteConfigs(RouteConfigCustomizer $routeConfigCustomizer)
。
RouteConfigCustomizer
提供了两种方法来自定义单个路由请求
customize
接受回调函数function (RouteConfig $config, RouteInfo $info) {...}
作为唯一参数。这将在每个RouteConfig
以及从您的路由器收集的RouteInfo
上调用。
此方法在您想要为多个路由定义一般规则时非常有用(例如,跳过所有以下划线开头命名的路由)。customizeByRouteName
接受一个路由名称或路由名称数组作为第一个参数,以及与customize
相同的回调函数作为第二个参数。这个函数会在每个与匹配的路由名称一起的RouteConfig
和RouteInfo
上调用。如果找不到匹配的路由配置,则会抛出RouteNameNotFoundException
。
此方法在您想为特定路由定义规则时非常有用(例如,登录到某个受保护的路由)。
在您的自定义回调中,您可以在 RouteConfig
上调用三个方法来更改测试行为
- 可以通过调用
skipRoute
来跳过测试中的此路由。 changeDefaultRequestDataSet
是配置路由的主要方法。它返回一个RequestDataSet
对象,提供了更改实际行为的所需设置器。setExpectedStatusCode
更改预期响应的 HTTP 状态代码。setAuth
更改路由的认证方法。(使用NoAuth
进行匿名访问,使用BasicHttpAuth
通过基本 HTTP 头部登录或使用AuthInterface
实现您自己的方法。)setParameter
通过名称指定路由参数的值。addCallDuringTestExecution
添加一个在测试执行前调用的回调函数function (RequestDataSet $requestDataSet, ContainerInterface $container) { ... }
。
(对于需要访问与测试方法相同实例的容器的代码非常有用,例如,将 CSRF 令牌作为路由参数添加)
addExtraRequestDataSet
可以用来测试同一路由上的更多请求(例如,以登录用户和匿名用户身份测试受保护的路由)。返回一个RequestDataSet
,您可以使用与从changeDefaultRequestDataSet
返回的结果相同的方式使用它。所有配置的选项都将扩展默认请求数据集的值(即使您在添加额外的RequestDataSet
之后更改了默认的RequestDataSet
)。
注意:所有三个 RouteConfigCustomizer
方法都接受 string $debugNote
作为参数。 这对于描述您的配置更改的原因非常有用,因为当测试失败时,它可能有助于您进行调试。
此外,您可以在您的 HttpSmokeTestCase
实现中覆盖这些方法,以进一步更改测试行为
setUp
以更改启动内核的方式(例如,使用不同的选项启动它)。getRouterAdapter
以更改负责从您的应用程序收集路由和生成 URL 的对象。createRequest
如果您对从RequestDataSet
创建Request
的方式有特殊要求。handleRequest
以在您的应用程序中自定义处理Request
(例如,您可以在数据库事务中包装它,以便回滚到原始状态)。
注解
为了让烟雾测试配置更加简单,您可以使用注解。
DataSet
用于根据提供的参数设置预期的状态码。
@DataSet(statusCode=404, parameters={
@Parameter(name="name", value="Batman")
})
- 参数
parameters
(可选)statusCode
(可选,默认 =200
)
参数
参数定义了指定参数的值。
@Parameter(name="name", value="Batman")
- 参数
name
(必需)value
(必需)
跳过
标记测试为跳过
@Skipped()
您可以直接将其添加到控制器方法中。请参阅Shopsys\HttpSmokeTesting\Test\TestController
中的示例。
注意:您应避免在相同的路由上使用与通过changeDefaultRequestDataSet()
配置相同的注解。这可能会导致意外的行为。
故障排除
在非现有路由上测试不失败
PHPUnit 默认不会在警告上失败。在phpunit.xml
中设置failOnWarning="true"
可以解决这个问题。
贡献
感谢您对Shopsys HTTP Smoke Testing包的贡献。我们一起让Shopsys平台变得更好。
此存储库为只读。如果您想报告问题和/或发送拉取请求,请使用主要的Shopsys仓库。
请在贡献之前检查我们的贡献指南。
支持
当您遇到困难或需要帮助时,该怎么办?最好的方法是加入我们的Slack。