E2Eテストの保守性を高めるための工夫

>100 Views

March 28, 24

スライド概要

profile-image

ユニークビジョン株式会社のエンジニアです

関連スライド

各ページのテキスト
1.

E2Eテストの保守性を高めるための工夫 2024年03月19日 ユニークビジョン株式会社 ⽵内俊暁

2.

⾃⼰紹介 ‧CRMチーム所属(Customer Relationship Management) ‧アンケートデータなどを活⽤して、企業と顧客の関係強化を⽀援する部⾨ ‧技術について ‧仕事柄、SQLに慣れ親しんでます ‧データ分析とE2Eテストが最近のトレンドです ‧趣味について ‧ボルダリングをかれこれ2年やってます Copyright ©Unique Vision Company, All Rights Reserved.

3.

イントロ ‧UVではリードタイム短縮を⽬指して実験的にE2Eテストの導⼊を⾏っている。 ‧ユーザビリティーのテストというよりは、テスト⾃動化に重点を置いている。 ‧ツールとしてはPlaywrightを使っている。 ‧CI/CDにも導⼊することができ、安定して稼働できるようになってきた。 ‧今回は、E2Eテストの安定化に有⽤だと感じた⼯夫を紹介したいと思います。 Copyright ©Unique Vision Company, All Rights Reserved.

4.

1. Playwrightの紹介 2. PageObjectモデル 3. TestIDの管理 4. データベース操作 5. 最後に Copyright ©Unique Vision Company, All Rights Reserved.

5.

Playwrightの紹介 ‧TypescriptやPythonなどの⾔語でケースを記述できるE2Eテストツール ‧Auto-wait、コード⽣成、UIモードなど便利な機能が搭載されている ‧Microsoftがサポートしており、Azureのサービスにもなっている Copyright ©Unique Vision Company, All Rights Reserved.

6.

テストコード

7.

UIモードでのテスト

8.

1. Playwrightの紹介 2. PageObjectモデル 3. TestIDの管理 4. データベース操作 5. 最後に Copyright ©Unique Vision Company, All Rights Reserved.

9.

PageObjectモデル ‧E2EテストはUIやDOMに依存するために⼀般的に壊れやすいと⾔われている ‧PageObjectモデルというデザインパターンを使うことで、テストコードと画⾯の結合を 薄められる ‧Playwrightが⽣成してくれるコードをそのまま使うのは悪⼿だと考えている Copyright ©Unique Vision Company, All Rights Reserved.

10.

結合の⾼いコード ‧要素のプロパティや階層にテストコードが依存してしまっている ‧DOMの変更による影響範囲が⼤きく、またテストコード⾃体を改修するためにテストの 信頼性低下をまねく Copyright ©Unique Vision Company, All Rights Reserved.

11.

結合の低いコード ‧ページをオブジェクトに対応して、画⾯上の機能をメソッドとして切りだす。 ‧ログインの機能を切り出すことで、テストコードが要素に依存しなくなっている。 ‧画⾯デザインに変更があっても、切り出したメソッドのみを変更すればよい。 Copyright ©Unique Vision Company, All Rights Reserved.

12.

1. Playwrightの紹介 2. PageObjectモデル 3. TestIDの管理 4. データベース操作 5. 最後に Copyright ©Unique Vision Company, All Rights Reserved.

13.

TestIDの活⽤ ‧ボタンの名前などでDOM要素を取得しようとしても、⼀意に決まらない場合がある e.g. ⼀覧画⾯のフォームやボタン ‧要素にIDを割り当てて取得するのがよい。そのためのメソッドをPlaywrightが提供して くれている。 <button data-testid=”LOGOUT_BUTTON”> ログアウト </button> logoutButton = page.getByTestId(“LOGOUT_BUTTON”) await logoutButton.click() Copyright ©Unique Vision Company, All Rights Reserved.

14.

TestIDの⾃動⽣成 ‧TestIDを管理するのが少し⾯倒くさい。 ‧社内で使われている⾃動⽣成ツールを使って、TestIdをまとめたファイルを⽣成する仕組み を導⼊した。 ‧TypescriptオブジェクトとしてTestIDを⽣成すると、補完が効いて便利 “kbns”: [ “lname”: “ヘッダー”, “pname”: “header”, “values”:[ { “lname”: “ログアウトボタン ”, “pname”: “logout-button” } ] export const TESTID = { HEADER_LOGOUT_BUTTON: ‘header-logout-button’, } Copyright ©Unique Vision Company, All Rights Reserved.

15.

1. Playwrightの紹介 2. PageObjectモデル 3. TestIDの管理 4. データベース操作 5. 最後に Copyright ©Unique Vision Company, All Rights Reserved.

16.

データベースの操作 ‧画⾯の操作だけに限定すると、データの状態に依存してテストが不安定になってしまう ‧単体テストではデータのCRUDを⾏うので、E2Eテストでも同様のことを⾏えばよいと考 えている。 ‧テスト環境で実施するのであれば、⽔平分割できる範囲でデータの初期化やCRUDを⾏ えばよい。 ‧UVのシステムでは、企業という単位で(少なくとも意味的に)⽔平分割されている Copyright ©Unique Vision Company, All Rights Reserved.

17.
[beta]
Fixtureの活⽤
‧DBクライアントを扱うときには、playwrightのFixtureという機能を活⽤するのが良い
‧ブラウザやページと同様に、テストケースごとに初期化されたDBクライアントを⽤意してく
れる

test(‘ユーザー取得 ’, async({page, client} => {
.
.
.
await getUser( {id: 1}, client );
.
.
})

Copyright ©Unique Vision Company, All Rights Reserved.

18.

1. Playwrightの紹介 2. PageObjectモデル 3. TestIDの管理 4. データベース操作 5. 最後に Copyright ©Unique Vision Company, All Rights Reserved.

19.

最後に ‧E2Eテストも⼯夫をすれば安定したテストとして稼働できるはず ‧ざっくりとした⼯数 ‧PageObjectモデル作成やヘルパー関数の作成: 2h / ページ ‧テストコード作成: 20m 〜 30m /個 ‧テスト⾃動化に重点をおいて話したが、他にも有⽤な使い⽅がありそう e.g. ページごとのアクセス権限のテスト Copyright ©Unique Vision Company, All Rights Reserved.