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

时间:2017-06-20 15:59:24

标签: php laravel laravel-dusk

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

引用laravel文档:

  

有时,您可能希望将某些内容绑定到应该只解析一次的容器中,并且应该在后续调用容器时返回相同的实例:

$this->app->singleton('FooBar', function($app)
{
    return new FooBar($app['SomethingElse']);
});

答案 1 :(得分: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();
    }
}

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