matt-czerner/http-smoke-testing

用于测试您Symfony项目中所有配置路由的HTTP smoke测试用例

10.0.1 2020-03-23 12:49 UTC

This package is auto-updated.

Last update: 2024-09-23 22:23:59 UTC


README

Build Status Downloads

此包允许您对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 相同的回调函数作为第二个参数。该函数将对每个具有匹配路由名称的 RouteConfigRouteInfo 进行调用。如果没有找到匹配的路由配置,将抛出 RouteNameNotFoundException
    此方法在您想为特定路由定义规则时非常有用(例如,登录到某个受保护的路由)。

在您的自定义回调函数中,您可以在 RouteConfig 上调用三个方法来更改测试行为。

  • 可以通过调用 skipRoute 在测试期间跳过此路由。
  • changeDefaultRequestDataSet 是配置路由的主要方法。它返回一个 RequestDataSet 对象,提供所需的设置器来更改实际行为。
    • setExpectedStatusCode 更改预期响应的 HTTP 状态代码。
    • setAuth 更改路由的认证方法。对于匿名访问,请使用 NoAuth,对于通过基本 HTTP 标头发送登录,请使用 BasicHttpAuth,或者使用 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(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 上联系我们 http://slack.shopsys-framework.com/

如果您想报告问题,请使用主要的Shopsys 存储库