shopsys/http-smoke-testing

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

v14.0.1 2024-09-13 07:58 UTC

This package is auto-updated.

Last update: 2024-09-25 11:41:46 UTC


README

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 进行匿名访问,使用 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

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