如何重用Dusk测试浏览器实例?

amf*_*are 9 php laravel laravel-dusk

我在Laravel 5.4框架上的项目,我正在使用Dusk进行浏览器测试.我有一个页面,其中有几个部分我想独立测试,但是我遇到了一个问题,我必须为每个单独的测试启动一个新的浏览器实例,登录并导航到该页面.

public function testExample()
{
  $this->browse(function (Browser $browser) {
    $browser->loginAs(1)
            ->visit('/admin/dashboard')
            ->assertABC()
            ->assertXYZ();
  });
}
Run Code Online (Sandbox Code Playgroud)

所以当我有4-5个这样的时候class allTheThingsTest extends DuskTestCase,我每个测试类产生4-5个浏览器实例.显然这很快失控,特别是当我在部署前运行所有测试时.

就我而言,每个测试类的一个浏览器实例是可以接受的,但我无法弄清楚如何实现这一点.所以这就是我要问的问题:

  • 是否可以在单个测试类中记住/重用测试函数之间的浏览器实例?
  • 如果是这样,怎么样?

Den*_*ebe 1

我觉得通常您会希望为测试类中的每个测试使用一个新的浏览器实例,以便每个测试都以“新鲜”状态开始。基本上与 Laravel 的 DatabaseTransactions/RefreshDatabase 测试特征具有相同的目的。

但是,如果您不想每次/每个测试方法都登录,您可以尝试类似以下的操作:

class ExampleTest extends DuskTestCase
{
    /**
     * An single instance of our browser.
     *
     * @var Browser|null
     */
    protected static ?Browser $browser = null;

    /**
     * Get our test class ready.
     *
     * @return void
     */
    protected function setUp(): void
    {
        parent::setUp();

        if (is_null(static::$browser)) {
            $this->browse(function (Browser $browser) {
                $browser->loginAs(1);
                static::$browser = $browser;
            });
        }
    }

    /** @test */
    public function first_logged_in_use_case()
    {
        static::$browser->visit('/admin/dashboard')->assertABC();
    }

    /** @test */
    public function second_logged_in_use_case()
    {
        static::$browser->visit('/admin/dashboard')->assertXYZ();
    }
}
Run Code Online (Sandbox Code Playgroud)

我还没有对此进行测试,但本质上您正在创建一个静态类属性并向其分配一个已登录的浏览器实例。然后,您可以在类中的所有测试方法中使用相同的实例。