この記事は「Reqnroll × Playwrightで始めるE2Eテスト入門」シリーズの一部です。
ReqnrollのHooksとは?シナリオ前後で処理を実行する方法を解説(.NET)
BDDテストフレームワーク Reqnroll では、テストシナリオの実行前後に共通処理を実行する仕組みとして Hooks が用意されています。
例えば次のような処理を自動化できます。
- テスト開始前にブラウザを起動
- 各シナリオ前にログイン処理を実行
- シナリオ終了後にスクリーンショットを取得
- テスト終了後にリソースを解放
この記事では ReqnrollのHooksの基本と使い方 を解説します。
Hooksとは
Hooksとは、テストの特定のタイミングで自動実行されるメソッドです。
Reqnrollでは以下のようなタイミングで処理を実行できます。
| Hook | 実行タイミング |
|---|---|
| BeforeTestRun | テスト全体の開始前 |
| AfterTestRun | テスト全体の終了後 |
| BeforeFeature | Feature開始前 |
| AfterFeature | Feature終了後 |
| BeforeScenario | シナリオ開始前 |
| AfterScenario | シナリオ終了後 |
| BeforeStep | Step実行前 |
| AfterStep | Step実行後 |
Hooksを使うことで、すべてのテストで共通の初期処理や後処理をまとめて管理できます。
Hooksクラスの作成
Hooksは通常、専用クラスを作って定義します。
using Reqnroll;
[Binding]
public class Hooks
{
[BeforeScenario]
public void BeforeScenario()
{
Console.WriteLine("シナリオ開始");
}
[AfterScenario]
public void AfterScenario()
{
Console.WriteLine("シナリオ終了");
}
}
ポイント
[Binding]属性を付ける- Hookメソッドに属性を付ける
- クラス名は自由
このクラスは StepDefinitionと同様に自動で読み込まれます。
BeforeScenario
BeforeScenario は シナリオの開始前に実行されるHookです。
[BeforeScenario]
public void Setup()
{
Console.WriteLine("テスト準備処理");
}
よくある用途
- ブラウザ起動
- テストデータ作成
- ログイン処理
例えば Microsoft Playwright を使う場合は、ここでブラウザを起動するケースが多いです。
AfterScenario
AfterScenario は シナリオ終了後に実行されるHookです。
[AfterScenario]
public void TearDown()
{
Console.WriteLine("後処理");
}
よくある用途
- ブラウザ終了
- スクリーンショット保存
- テストデータ削除
E2Eテストでは 後処理の管理がとても重要になります。
BeforeStep / AfterStep
各Stepの前後でもHookを実行できます。
[BeforeStep]
public void BeforeStep()
{
Console.WriteLine("Step開始");
}
[AfterStep]
public void AfterStep()
{
Console.WriteLine("Step終了");
}
用途例
- Stepログ出力
- 失敗時スクリーンショット
ただし Step単位で実行されるため処理が重くなりやすいので注意が必要です。
Feature単位のHooks
Feature単位でもHooksを設定できます。
[BeforeFeature]
public static void BeforeFeature()
{
Console.WriteLine("Feature開始");
}
[AfterFeature]
public static void AfterFeature()
{
Console.WriteLine("Feature終了");
}
ポイント
- staticメソッドで定義する
主な用途
- DB接続準備
- テスト環境セットアップ
Hooksを使うメリット
Hooksを使うと次のメリットがあります。
共通処理をまとめられる
すべてのStepDefinitionに書く必要がなくなります。
例
- ブラウザ起動
- ログイン処理
- DB初期化
テストコードがシンプルになる
StepDefinitionは テスト内容だけを書く構造になります。
Scenario: ログインできる
Given ログインページを開く
When ログインする
Then ダッシュボードが表示される
環境準備などはHooksで管理できます。
テストの保守性が上がる
例えばブラウザ起動方法を変更したい場合も
Hooksを1箇所変更するだけで済みます。
PlaywrightとHooksの組み合わせ例
E2EテストではHooksで Playwrightのブラウザを管理することが多いです。
using Microsoft.Playwright;
using Reqnroll;
[Binding]
public class PlaywrightHooks
{
public static IPage Page;
private static IBrowser browser;
private static IPlaywright playwright;
[BeforeScenario]
public async Task BeforeScenario()
{
playwright = await Playwright.CreateAsync();
browser = await playwright.Chromium.LaunchAsync();
var context = await browser.NewContextAsync();
Page = await context.NewPageAsync();
}
[AfterScenario]
public async Task AfterScenario()
{
await browser.CloseAsync();
playwright.Dispose();
}
}
これにより
- シナリオ開始 → ブラウザ起動
- シナリオ終了 → ブラウザ終了
という流れを自動化できます。
まとめ
ReqnrollのHooksは テストの実行タイミングに応じて処理を自動実行する仕組みです。
主に以下の用途で使用されます。
- テスト前の準備
- テスト後の後処理
- ログ出力
- ブラウザ管理
特に Microsoft Playwright などのE2Eテストツールと組み合わせると非常に便利です。
Reqnrollを使ったE2Eテストでは、Hooksを使ったテスト環境管理が基本パターンになるため、必ず理解しておきましょう。
