1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Screenplay Pattern で実現する堅牢な UI テストアーキテクチャ

1
Posted at

はじめに

UIテスト自動化の王道といえば Page Object Model (POM) です。しかし、プロジェクトが大規模化すると、以下のような課題に直面します。

  • Pageオブジェクトの肥大化: 1つのクラスにメソッドが集中し、メンテナンスが困難になる。
  • DRY原則の崩壊: 複数のページにまたがる共通操作の置き場所に困り、コードが重複する。
  • ツールの密結合: SeleniumからPlaywrightへの移行など、エンジンの変更がコードの全面書き換えを意味する。

これらの課題を解決するのが、SOLID原則をテスト設計に持ち込んだ Screenplay Pattern です。

1. Screenplay Pattern とは何か?

Screenplay Pattern は、「誰が(Actor)」「何ができるか(Ability)」に基づき、「何を遂行するか(Task/Interaction)」を組み立てる設計パターンです。

2. 核心アーキテクチャ:5 つの要素

Screenplay Pattern は、映画の劇本(スクリプト)のように 5 つの要素で構成され、それぞれが厳密な役割を持っています。

  • Actor(役者): テストの主体。Abilities を保持し、Tasks/Interactions を実行し、Questions に答えます。
  • Ability(能力): Actorが持っている技術的な手段(ブラウザ操作、API実行など)。下位の操作を Invoke(呼び出し) します。
  • Task(タスク): ビジネスプロセスを表現する高レベルの抽象。複数の Interactions で構成(Made up of)されます。
  • Interaction(相互作用): 原子的な操作(例:クリック)。Abilities によって実行可能になり、直接システムと対話します。
  • Question(問い): システムの状態を取得する手段。Abilities を利用してシステムの状態を確認し、Actorに「答え」を提供します。

3. アーキテクチャと実行フロー

Screenplay Pattern の各コンポーネント間の関係性は、以下のフロー図で表されます。この設計により、ビジネスロジック(Task)と技術詳細(Ability)が完全に分離されます。

このフローの美しさは、InteractionQuestionAbility を介してシステムを操作・確認する点にあります。Actorは自身の「能力」を駆使して「問い」に答える(Answers)形式をとるため、ブラウザエンジンが Selenium であろうが Playwright であろうが、上層の Task は一切変更する必要がありません。


4. Pythonによる実装例(Selenium/Playwright共存)

Pythonの強力なライブラリ ScreenPy を使うと、このアーキテクチャを容易に実装できます。

Abilityの注入

Actorに対して、実行時にどちらのブラウザエンジン(Ability)を使うかを決定します。

# Seleniumを使用する「能力」をJamesに与える
james = Actor.named("James").who_can(BrowseTheWebWithSelenium.using(driver))

# Playwrightを使用する「能力」をPaulに与える
paul = Actor.named("Paul").who_can(BrowseTheWebWithPlaywright.using(page))

共通タスクの実行

Actorがどのエンジン(Ability)を持っていても、ビジネスロジック(Task)の呼び出し方は完全に共通化されます。

# Actorは自分の能力(Ability)を使ってタスクを遂行する
# ビジネスロジック(Task)はエンジンの詳細を知る必要がない
actor.attempts_to(
    Login.as_admin(),
    Search.for_item("Python Testing")
)

# システムの状態を確認する(ActorがQuestionに答える)
actor.should(See.the(Text.of(WELCOME_MESSAGE), ReadsExactly("Welcome!")))

5. Screenplay Pattern 導入のメリット

  1. 究極の再利用性: タスクは小さな独立したクラス(Interactionsの集合)であるため、レゴブロックのように組み合わせが可能です。
  2. メンテナンス性: UIの変更があった際、修正箇所は特定の Task または Interaction に限定され、他のロジックに影響を与えません。
  3. 高い可読性: コード自体が「James attempts to Login as admin(ジェームズが管理者としてログインを試みる)」と自然言語で記述されるため、生きた仕様書として機能します。

まとめ

Screenplay Pattern は、単なるデザインパターンではなく、「テストをソフトウェアエンジニアリングとして構築する」ための指針です。「ActorがAbilityを使ってTaskを遂行し、Questionに答える」という厳密な構造 に従うことで、複雑なUIテストも劇的に管理しやすくなります。

特に、SeleniumからPlaywrightへの移行を検討しているチームや、長期的な保守が必要な大規模プロジェクトにとって、このパターンは救世主となるでしょう。


参考リンク:

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?