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

2022-08-30 22:30:09

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

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

因此,当我在 中有 4-5 个这样的实例时,我将为每个测试类生成 4-5 个浏览器实例。显然,这很快就会失控,特别是当我在部署前运行所有测试时。class allTheThingsTest extends DuskTestCase

就我而言,每个测试类一个浏览器实例是可以接受的,但我不知道如何实现这一目标。所以这就是我要问的:

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

答案 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();
    }
}

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


答案 2

推荐