orchestra/testbench-dusk

Laravel Dusk 测试辅助工具,用于包的开发

v9.7.1 2024-09-12 11:03 UTC

This package is auto-updated.

Last update: 2024-09-18 03:41:26 UTC


README

Testbench Dusk 组件是一个简单的包,旨在帮助您使用 Laravel Dusk 为 Laravel 包编写测试。

该包由 Konsulting Ltd 开发,并转移到 Orchestra 命名空间,我们将协助支持它。它处于早期开发阶段,欢迎提供反馈。

tests Latest Stable Version Total Downloads Latest Unstable Version License

版本兼容性

入门

在阅读以下文档之前,请花一些时间阅读以下文档

安装

要通过 composer 安装,请在终端中运行以下命令

composer require --dev "orchestra/testbench-dusk"

用法

要使用 Testbench Dusk 组件,您只需要扩展 Orchestra\Testbench\Dusk\TestCase 而不是 Laravel\Dusk\TestCase。由 Orchestra\Testbench\Dusk\TestCase 启动的 fixture 应用程序默认设置为遵循 Laravel 7 的基本应用程序骨架。

<?php

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

自定义主机和端口

默认情况下,Testbench Dusk 将在 http://127.0.0.1:8001 启动其自己的 PHP 服务器。

您可以通过替换 $baseServeHost$baseServePort 来自定义此设置,如下所示

<?php

class BrowserTestCase extends Orchestra\Testbench\Dusk\TestCase
{
    protected static $baseServeHost = '127.0.0.1';
    protected static $baseServePort = 9000;
}

带或不带 UI 运行

Dusk 3.5+ 提供了在无 UI(浏览器窗口)的情况下运行 Dusk 测试的能力,这是默认设置,通常稍微快一些。
您可以通过以下调用切换行为

// To show the UI during testing
\Orchestra\Testbench\Dusk\Options::withUI();

// To hide the UI during testing
\Orchestra\Testbench\Dusk\Options::withoutUI();

我们建议您将其放在一个 tests/bootstrap.php 文件中,类似于此包自己的测试设置,并用于 PHP 单元测试。

数据库

默认情况下,您可以使用 sqlitemysqlpgsqlsqlsrv 与 Testbench Dusk 一起使用,但是请注意,无法像在 TestbenchTestbench BrowserKit 中那样使用 sqlite:memory: 数据库。

如果您选择使用 sqlite,您可能希望使用 phpunit 配置或在 getEnvironmentSetUp() 方法上设置默认数据库连接为 sqlite

/**
 * Define environment setup.
 *
 * @param  Illuminate\Foundation\Application  $app
 *
 * @return void
 */
protected function defineEnvironment($app)
{
    $this->app['config']->set('database.default', 'sqlite');
}

注意:与 Laravel 文档相反,您不应使用 Illuminate\Foundation\Testing\DatabaseMigrations 特性,因为 testbench-dusk 会自行处理回滚

要创建 sqlite 数据库,只需运行以下代码

php vendor/orchestra/testbench-dusk/create-sqlite-db

高级用法

自定义测试期间使用的 Laravel App 实例

我们使用调用测试类来构建用于服务请求的应用程序。

有时您可能需要为单个测试对应用程序进行一些小的修改(例如,更改配置项)。

通过在测试中使用 tweakApplication 方法并传递一个闭包来应用,可以实现这一点。在测试结束时,您需要调用 removeApplicationTweaks 方法以停止更改应用于服务器。

一个示例测试(can_tweak_the_application_within_a_test)在 tests/Browser/RouteTest.php 测试文件中可用。

选择性运行 Dusk 测试

浏览器测试可能需要一段时间才能运行,因此您也可以在 phpunit.xml 文件中将您的测试分开,通过提供不同的测试套件,允许您按需运行浏览器测试。

例如

<testsuites>
    <testsuite name="Browser">
        <directory suffix="Test.php">./tests/Browser</directory>
    </testsuite>
    <testsuite name="Feature">
        <directory suffix="Test.php">./tests/Feature</directory>
    </testsuite>
    <testsuite name="Unit">
        <directory suffix="Test.php">./tests/Unit</directory>
    </testsuite>
</testsuites>

通过运行带有 --testsuite=Browser 选项的 phpunit 来仅运行您的浏览器测试。

您可以选择使用 defaultTestSuite="Unit" 选项设置默认测试套件。

故障排除

Chrome 版本

Facebook\WebDriver\Exception\SessionNotCreatedException: session not created: Chrome version must be between 70 and 73

如果测试报告以下错误,请运行以下命令

./vendor/bin/dusk-updater update

或者您也可以运行以下命令来检测已安装的ChromeDriver并在必要时自动更新它

./vendor/bin/dusk-updater detect --auto-update

在同一个测试套件中运行Dusk和标准测试台测试

当使用loadLaravelMigrations()并扩展Dusk测试类\Orchestra\Testbench\Dusk\TestCase的一些测试,而其他测试扩展“正常”测试类\Orchestra\Testbench\TestCase时,您可能会遇到以下错误:PHP致命错误:无法声明类CreateUsersTable,因为该名称已在...中使用

问题在于,在同一个测试运行中,从两个包的“骨架”中加载了迁移,并且Laravel的迁移类没有命名空间。

解决方案

请确保您的测试套件中的所有集成测试都使用相同的Laravel骨架(来自testbench-dusk的那个),无论它们扩展的是哪个基类,都可以通过在测试类中覆盖getBasePath()来实现。在您的基集成测试类中或可能在一个特质中完成这个覆盖,如果您需要在多个类中使用它。

/**
* Make sure all integration tests use the same Laravel "skeleton" files.
* This avoids duplicate classes during migrations.
*
* Overrides \Orchestra\Testbench\Dusk\TestCase::getBasePath
*       and \Orchestra\Testbench\Concerns\CreatesApplication::getBasePath
*
* @return string
*/
protected function getBasePath()
{
    // Adjust this path depending on where your override is located.
    return __DIR__.'/../vendor/orchestra/testbench-dusk/laravel'; 
}