unicorn/lumen-testbench

Laravel包开发测试辅助工具orchestra/testbench的Lumen分支


README

Testbench组件是一个简单的包,旨在帮助您编写Laravel包的测试,尤其是在涉及路由时。

Build Status Latest Stable Version Total Downloads License

版本兼容性

入门指南

在阅读本说明书的其余部分之前,请花些时间阅读Laravel官方文档中的包开发部分,如果您还没有做的话。

安装

通过Composer安装,请在终端运行以下命令

composer require --dev "orchestra/testbench"

使用

要使用Testbench组件,您只需扩展Orchestra\Testbench\TestCase而不是PHPUnit\Framework\TestCase。由Orchestra\Testbench\TestCase启动的app脚本是预定义的,遵循Laravel 6的基础应用程序结构。

<?php

class TestCase extends Orchestra\Testbench\TestCase
{
    //
}

自定义服务提供者

要加载您的包服务提供者,请覆盖getPackageProviders

protected function getPackageProviders($app)
{
    return ['Acme\AcmeServiceProvider'];
}

自定义别名

要加载您的包别名,请覆盖getPackageAliases

protected function getPackageAliases($app)
{
    return [
        'Acme' => 'Acme\Facade'
    ];
}

重写setUp()方法

由于Orchestra\Testbench\TestCase替换了Laravel的Illuminate\Foundation\Testing\TestCase,如果您需要自己的setUp()实现,请务必调用parent::setUp()

/**
 * Setup the test environment.
 */
protected function setUp()
{
    parent::setUp();

    // Your code here
}

设置环境

如果您需要在应用程序启动过程中早期添加某些内容(在注册服务提供者和启动服务提供者之间执行),则可以使用getEnvironmentSetUp方法。

/**
 * Define environment setup.
 *
 * @param  \Illuminate\Foundation\Application  $app
 * @return void
 */
protected function getEnvironmentSetUp($app)
{
    // Setup default database to use sqlite :memory:
    $app['config']->set('database.default', 'testbench');
    $app['config']->set('database.connections.testbench', [
        'driver'   => 'sqlite',
        'database' => ':memory:',
        'prefix'   => '',
    ]);
}

使用注解设置环境

Testbench Core 4.4新增功能:使用@environment-setup注解自定义针对每个测试的getEnvironmentSetUp的使用。

protected function useMySqlConnection($app) 
{
    $app->config->set('database.default', 'mysql');
}

protected function useSqliteConnection($app)
{
    $app->config->set('database.default', 'sqlite');
}

/**
 * @environment-setup useMySqlConnection
 */
public function testItCanBeConnectedWithMySql()
{
    // write your tests
}

/**
 * @environment-setup useSqliteConnection
 */
public function testItCanBeConnectedWithSqlite()
{
    // write your tests
}

内存SQLite连接

为了减少设置配置,您可以在getEnvironmentSetUp下设置或通过在PHPUnit配置文件中定义,使用testing数据库连接(:memory:sqlite驱动程序)来减少设置。

<phpunit>

    // ...

    <php>
        <env name="DB_CONNECTION" value="testing"/>
    </php>

</phpunit>

重写控制台内核

您可以通过重写resolveApplicationConsoleKernel方法轻松地交换应用程序启动时的控制台内核。

/**
 * Resolve application Console Kernel implementation.
 *
 * @param  \Illuminate\Foundation\Application  $app
 * @return void
 */
protected function resolveApplicationConsoleKernel($app)
{
    $app->singleton('Illuminate\Contracts\Console\Kernel', 'Acme\Testbench\Console\Kernel');
}

重写HTTP内核

您可以通过重写resolveApplicationHttpKernel方法轻松地交换应用程序启动时的HTTP内核。

/**
 * Resolve application HTTP Kernel implementation.
 *
 * @param  \Illuminate\Foundation\Application  $app
 * @return void
 */
protected function resolveApplicationHttpKernel($app)
{
    $app->singleton('Illuminate\Contracts\Http\Kernel', 'Acme\Testbench\Http\Kernel');
}

重写应用程序时区

您也可以轻松地覆盖应用程序默认时区,而不是默认的"UTC"

/**
 * Get application timezone.
 *
 * @param  \Illuminate\Foundation\Application  $app
 * @return string|null
 */
protected function getApplicationTimezone($app)
{
    return 'Asia/Kuala_Lumpur';
}

使用迁移

包开发者应使用ServiceProvider::loadMigrationsFrom功能来自动处理包的迁移。

$this->artisan('migrate', ['--database' => 'testbench'])->run();

使用Laravel迁移

默认情况下,Testbench不会执行默认的Laravel迁移,包括userspassword_resets表。要运行迁移,只需添加以下命令即可

$this->loadLaravelMigrations();

您还可以通过添加--database选项来设置特定的数据库连接。

$this->loadLaravelMigrations(['--database' => 'testbench']);

运行测试迁移

要运行仅用于测试目的且不是您包一部分的迁移,请将以下内容添加到您的基测试类中

/**
 * Setup the test environment.
 */
protected function setUp()
{
    parent::setUp();

    $this->loadMigrationsFrom(__DIR__ . '/database/migrations');
    
    // and other test setup steps you need to perform
}
注意事项和考虑事项
  • 您的迁移文件必须符合Laravel的约定,例如0000_00_00_000000_create_package_test_tables.php
  • 您可以选择将迁移文件夹放在tests/database/中。
  • 您可以选择更改测试迁移类的名称,使其与发布名称不同,例如从 CreateUsersTable 更改为 CreateUsersTestTable,否则您可能会遇到 Composer 类加载器冲突。

使用模型工厂

Testbench 包含 withFactories() 方法,允许您为测试套件注册自定义模型工厂路径。

$this->withFactories(__DIR__.'/factories');

示例

要查看包括如何设置配置在内的测试工作示例,请检查文件

替代测试

还有扩展 Testbench 的第三方包

故障排除

未找到支持的加密器。密钥和/或密钥长度无效。

RuntimeException: No supported encrypter found. The cipher and / or key length are invalid.

此错误仅会在您的测试套件需要使用加密器时发生。要解决此问题,您可以在 phpunit.xml 中添加一个虚拟的 APP_KEY 或使用特定的密钥到您的应用程序/包。

<phpunit>

    // ...

    <php>
        <env name="APP_KEY" value="AckfSECXIvnK5r28GVIWUAxmbBSjTsmF"/>
    </php>

</phpunit>

为什么 Testbench 不包含任何 App 类。

Testbench 移除所有类的原因是为了确保您在开发 Laravel 包时永远不会依赖于它。例如,App\Http\Controllers\ControllerApp\User 类很容易添加,但这些问题在于这些类可以是

  • 移除,移动到其他位置,如 App\Models\User,或者
  • 使用 php artisan app:name Acme 重命名,这将 App\User 重命名为 Acme\User

类 'GuzzleHttp\Client' 未找到

如果您计划在 Laravel 7 中使用新的 HTTP 客户端,则需要将 guzzlehttp/guzzle 包含在您的包的 composer.json 中。

composer require "guzzlehttp/guzzle=^6.3.1"

我们无法保证 laravel/laravel 中的任何要求始终保持不变。开发者可能会移除任何可选要求,例如 guzzlehttp/guzzlefideloper/proxyfruitcake/laravel-corslaravel/tinker

在 Laravel 5.4 上测试后缺少浏览器套件支持

orchestra/testbench 替换为 orchestra/testbench-browser-kit,并遵循安装指南