對于背景關系,我正在開發基于 RNG 的賽車模擬器,因為沒有更好的術語。用戶可以創建宇宙(想想現實生活中的國際汽聯),在宇宙中他們可以創建系列(想想 F1、F2、F3 等),并且在每個系列中他們可以創建季節。在其中的每一個中,用戶都可以創建其他模型;
在 Universe 中,用戶可以創建團隊和驅動程式。
在一個賽季中,用戶可以使用他們在任何 Universe 之外添加的電路、參賽者(基于他們在父 Universe 中創建的團隊)創建一個日歷,并且他們可以向這些參賽者添加驅動程式(基于創建的驅動程式),這我稱之為“陣容”。
我對這些關系的測驗越深入,我需要通過工廠創建的模型越多才能正確測驗,并且測驗運行所需的時間就越長。我有一個非常簡單的測驗來驗證 Universe 所有者可以將驅動程式添加到屬于該 Universe 的進入者;
test('a universe owner can add drivers to entrants', function () {
$user = User::factory()->create();
$season = createSeasonForUser($user);
$driver = Driver::factory()->for($season->universe)->create();
$entrant = Entrant::factory()->for($season)->create();
$this->actingAs($user)
->post(route('seasons.lineups.store', [$season]), [
'driver_id' => $driver->id,
'entrant_id' => $entrant->id,
'number' => 2,
])
->assertRedirect(route('seasons.lineups.index', [$season]));
$this->assertDatabaseCount('lineups', 1);
$this->assertCount(1, $entrant->drivers);
$this->assertCount(1, $season->drivers);
});
我有兩個輔助函式可以快速創建屬于特定用戶的系列和/或季節;
function createSeriesForUser(User $user): Series
{
return Series::factory()->for(Universe::factory()->for($user)->create())->create();
}
function createSeasonForUser(User $user): Season
{
$series = createSeriesForUser($user);
return Season::factory()->for($series)->create();
}
如您所見,為了測驗流程的一部分,我需要通過工廠創建六個模型(其中一些工廠有時會呼叫更多工廠)。我運行了五次測驗,對測驗的每個部分(工廠、實際請求和斷言)進行計時,工廠平均占用 1.9 秒,其余測驗占用 0.015 秒,這并沒有對我來說似乎不對。
理想情況下,我會在每個測驗檔案運行之前創建所有必需的資料庫條目,但我知道這是不好的做法。還有其他方法可以加快測驗速度嗎?可悲的是,我不能讓關系不那么嵌套或復雜,因為這些只是我正在構建的網站的要求。
或者,這種方法通常是否是測驗我的控制器功能的正確方法,還是可以以不同的方式完成?
為了不讓問題過于混亂,這里有一個包含所有當前工廠的 pastebin
uj5u.com熱心網友回復:
原來Faker的image()真的很慢。我將'avatar' => $this->faker->image(),我的 UserFactory 中的替換為'avatar' => null,,現在我的整個測驗套裝只運行了三秒多一點,如果我并行運行它們,則運行一秒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411819.html
標籤:
