この記事は「Reqnroll × Playwrightで始めるE2Eテスト入門」シリーズの一部です。
ReqnrollのStepDefinitionの書き方(C#)
Reqnrollでは、Featureファイルに書いたシナリオを実際のテストコードに結び付けるために StepDefinition(ステップ定義) を作成します。
StepDefinitionは、Featureファイルの Given / When / Then の文章に対応する C#メソッドです。
この記事では、Reqnrollの StepDefinitionの基本的な書き方を解説します。
この記事でわかること
- StepDefinitionとは何か
- StepDefinitionの基本構文
- Featureファイルとの対応方法
- パラメータの受け取り方
StepDefinitionとは
StepDefinitionとは、Featureファイルに書かれたステップを C#のコードに対応させる仕組みです。
Featureファイル
Given ログイン画面を開く
When メールアドレス "test@example.com" を入力する
Then ダッシュボード画面が表示される
この文章に対応するC#コードを書きます。
[Given(@"ログイン画面を開く")]
public async Task OpenLoginPage()
{
}
[When(@"メールアドレス ""(.*)"" を入力する")]
public async Task EnterEmail(string email)
{
}
[Then(@"ダッシュボード画面が表示される")]
public async Task DashboardDisplayed()
{
}
StepDefinitionクラスの作成
StepDefinitionは クラスとして作成します。
例
using Reqnroll;
[Binding]
public class LoginSteps
{
}
[Binding] 属性を付けることで、Reqnrollが StepDefinitionクラスとして認識します。
StepDefinitionの基本構文
StepDefinitionでは 属性(Attribute) を使ってFeatureファイルの文章と対応付けます。
例
[Given(@"ログイン画面を開く")]
public async Task OpenLoginPage()
{
}
ここで
[Given]
は、Featureファイルの Givenステップに対応します。
同様に以下の属性があります。
| 属性 | 対応するステップ |
|---|---|
[Given] | 前提条件 |
[When] | 操作 |
[Then] | 結果 |
Featureファイルとの対応
Featureファイル
Scenario: 正しい情報でログインできる
Given ログイン画面を開く
When ログインボタンをクリックする
Then ダッシュボード画面が表示される
StepDefinition
[Given(@"ログイン画面を開く")]
public async Task OpenLoginPage()
{
}
[When(@"ログインボタンをクリックする")]
public async Task ClickLoginButton()
{
}
[Then(@"ダッシュボード画面が表示される")]
public async Task DashboardDisplayed()
{
}
Featureファイルの文章と 完全に一致するステップが実行されます。
正規表現によるマッチング
StepDefinitionでは 正規表現を使って文章をマッチさせます。
例
[When(@"メールアドレス ""(.*)"" を入力する")]
public async Task EnterEmail(string email)
{
}
Featureファイル
When メールアドレス "test@example.com" を入力する
"(.*)" の部分が パラメータとして取得されます。
パラメータの受け取り方
Featureファイル
When メールアドレス "test@example.com" を入力する
StepDefinition
[When(@"メールアドレス ""(.*)"" を入力する")]
public async Task EnterEmail(string email)
{
Console.WriteLine(email);
}
この場合
email = test@example.com
がメソッドに渡されます。
複数のパラメータ
複数の値を受け取ることもできます。
Featureファイル
When ユーザー名 "test" とパスワード "1234" を入力する
StepDefinition
[When(@"ユーザー名 ""(.*)"" とパスワード ""(.*)"" を入力する")]
public async Task EnterLoginInfo(string username, string password)
{
}
Playwrightと組み合わせる例
ReqnrollではStepDefinitionの中で Playwrightなどのテストツールを呼び出します。
例
[When(@"メールアドレス ""(.*)"" を入力する")]
public async Task EnterEmail(string email)
{
await _page.Locator("#email").FillAsync(email);
}
[When(@"ログインボタンをクリックする")]
public async Task ClickLoginButton()
{
await _page.Locator("#login-button").ClickAsync();
}
このようにして ブラウザ操作を自動化します。
StepDefinitionを書くときのポイント
ステップは短くする
1つのStepDefinitionは 1つの処理にします。
例
メール入力
パスワード入力
ログインクリック
Featureファイルと同じ文章にする
文章が一致しないとステップが実行されません。
例
Feature
ログインボタンをクリックする
StepDefinition
ログインボタンをクリックする
共通処理はまとめる
同じステップを複数のScenarioで使うことができます。
例
ログイン画面を開く
StepDefinitionの配置例
一般的なプロジェクト構成は次のようになります。
Tests
├ Features
│ └ Login.feature
│
├ Steps
│ └ LoginSteps.cs
│
└ Hooks
└ PlaywrightHooks.cs
まとめ
ReqnrollのStepDefinitionは、Featureファイルのステップと C#コードを結び付ける重要な仕組みです。
基本的な流れは次の通りです。
- Featureファイルにシナリオを書く
- StepDefinitionで対応するメソッドを書く
- Playwrightなどのテストコードを実装する
この仕組みを使うことで、読みやすいBDD形式のE2Eテストを作成できます。
