reqnroll-skill について
QA エンジニアやテストアーキテクト向けに、C# Reqnroll で Web と Android の BDD テストを作成するスキルです。Selenium 4、Selenium 3、Appium 2 の実行方法に加え、並列実行と TestMu AI のクラウドレポートを扱います。
主な機能
- 01Selenium 4・Selenium 3・Appium 2 のパターン
- 02Gherkin シナリオとステップ定義
- 03ScenarioContext によるドライバー共有
- 04NUnit の並列実行
- 05TestMu AI のクラウド状態レポート
- 06SpecFlow 移行ガイド
活用シーン
- 01C# BDD Web テストスイートの構築
- 02Android アプリのシナリオ自動化
- 03NUnit でのシナリオ並列実行
- 04SpecFlow プロジェクトの Reqnroll 移行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill reqnroll-skillインストール後、Claude Code で/reqnroll-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/appium-patterns.mdcloud-integration.mdplaybook.mdselenium-3-patterns.mdselenium-4-patterns.md詳細
概要
このスキルでは、QA エンジニアやテストアーキテクトが、C# で本番環境向けの Reqnroll BDD テストを作成する方法を説明します。Web およびモバイルの自動化を対象に、3 つの実行方法を取り上げます。手動でドライバーを管理する Selenium 4、Reqnroll.Actions プラグインを使用する Selenium 3、Android モバイル向けの Appium 2 です。いずれも TestMu AI(LambdaTest)のクラウドインフラストラクチャを対象としています。
Reqnroll は、現在も積極的にメンテナンスされている SpecFlow のオープンソース後継です。既存の SpecFlow プロジェクトは、NuGet パッケージと名前空間を置き換えるだけで移行でき、ステップ定義を書き直す必要はありません。
主な実行方法
フレームワークの選択: Selenium 4(手動の DriverFactory)、Selenium 3(IBrowserInteractions を使用する Reqnroll.SpecFlowCompatibility.Actions.LambdaTest プラグイン)、Appium 2(Appium.WebDriver、AndroidDriver)を使い分けます。
クラウドとローカル: LT_USERNAME と LT_ACCESS_KEY の環境変数を読み取り、hub.lambdatest.com(Web)または mobile-hub.lambdatest.com(モバイル)に接続します。[AfterScenario] 内で lambda-status JavaScript executor 呼び出しを行い、LambdaTest に成功/失敗を報告します。
並列実行: [assembly: Parallelizable(ParallelScope.Fixtures)] と [assembly: LevelOfParallelism(N)](NUnit)を使用します。ステップ定義クラス間で状態を共有するには、static フィールドではなく、Reqnroll の DI コンテナーから注入される ScenarioContext を使用します。
主な技術パターン
フィーチャーファイル(Gherkin)
各 .feature ファイルは、1 つのテストクラスに対応します。シナリオにはタグ(@tagName)を付け、dotnet test --filter "Category=tagName" で選択的にフィルターします。Background のステップはファイル内の各シナリオの前に実行されます。Scenario Outline は Examples テーブルを使用したデータ駆動テストを実現します。
ステップ定義
クラスには [Binding] を付けます。コンストラクターインジェクション(Reqnroll 組み込みの DI を使用)で、ScenarioContext または共有コンテキストオブジェクトを受け取ります。ファイルを小さく保つため、関心事ごとに [Binding] クラスを 1 つ使用します。正規表現ベースのステップパターンでは (.*) または型付きキャプチャ((\d+))を使用し、プリミティブ型に属性レベルの型コンバーターは必要ありません。
フック
[BeforeScenario] でドライバーを初期化し(ScenarioContext["driver"] に保存)、ベース URL に移動します。[AfterScenario] では _scenarioContext.TestError(Web)または TestContext.CurrentContext.Result.Outcome.Status(モバイル)を読み取り、driver.Quit() の前に lambda-status=passed/failed を出力します。
ScenarioContext によるドライバー共有
ドライバーは _scenarioContext["driver"] = driver として保存し、scenarioContext["driver"] as IWebDriver で取得します。これは並列実行に必須です。static なドライバーフィールドを使用すると競合状態が発生します。
明示的な待機
動的コンテンツには、ImplicitWait の代わりに Until(d => d.FindElement(locator)) を使う WebDriverWait を使用します。WaitAndFind(By) ヘルパーメソッドはデフォルトの 10 秒の待機をカプセル化します。クリック可能になるまで待つ場合は、WaitAndClick(By, int timeout) を使用します。
クラウド連携(TestMu / LambdaTest)
Web(Selenium 4)
var ltOptions = new Dictionary<string, object>
{
{ "build", "Build Name" },
{ "project", "Project Name" },
{ "w3c", true },
{ "selenium_version", "4.38.0" },
{ "sessionName", scenarioName },
{ "platformName", "Windows 11" }
};
var options = new ChromeOptions();
options.BrowserVersion = "latest";
options.AddAdditionalOption("LT:Options", ltOptions);
var driver = new RemoteWebDriver(
new Uri($"https://{userName}:{accessKey}@hub.lambdatest.com/wd/hub"), options);
モバイル(Appium 2)
var ltOptions = new Dictionary<string, object>
{
{ "build", "Build Name" },
{ "project", "Project Name" },
{ "w3c", true },
{ "app", "proverbial-android" }, // lt:// URI or pre-uploaded alias
{ "platformName", "android" },
{ "deviceName", "Galaxy.*" },
{ "platformVersion", "14" },
{ "isRealMobile", true },
{ "autoAcceptAlerts", true },
{ "autoGrantPermissions", true },
{ "sessionName", scenarioName }
};
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalAppiumOption("LT:Options", ltOptions);
var driver = new AndroidDriver(
new Uri($"https://{userName}:{accessKey}@mobile-hub.lambdatest.com/wd/hub"),
appiumOptions);
成功/失敗の報告
// Web (AfterScenario)
if (_scenarioContext.TestError == null)
((IJavaScriptExecutor)driver).ExecuteScript("lambda-status=passed");
else
((IJavaScriptExecutor)driver).ExecuteScript("lambda-status=failed");
// Mobile (AfterScenario)
bool passed = TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Passed;
((IJavaScriptExecutor)driver).ExecuteScript("lambda-status=" + (passed ? "passed" : "failed"));
品質チェックポイント
- フィーチャーファイルでは、LambdaTest のセッション名にもなる、説明的なシナリオ名を使用する
- ドライバーの共有には
ScenarioContextを使用する。並列実行で static フィールドを使用しない [assembly: Parallelizable(ParallelScope.Fixtures)]は任意の.csファイルで一度だけ宣言するLT_USERNAMEとLT_ACCESS_KEYは環境変数から読み取り、ハードコードしない- クラウド実行では、すべての
[AfterScenario]でlambda-status=passed/failedを出力する - 一時的な Appium の遅延を除き、無条件の
Thread.Sleepは使用せず、全体でWebDriverWaitを使用する - Appium のロケーターでは、XPath より先に
MobileBy.Id(resource-id)またはMobileBy.AccessibilityIdを使用する - クラウドデバイスのスロットを解放するため、必ず
[AfterScenario]でdriver.Quit()を呼び出す dotnet test --logger "console;verbosity=detailed"でシナリオごとの成功/失敗を表示する
リファレンス構成
reference/ ディレクトリには、詳細なプレイブックの各セクションが含まれています。
| ファイル | 内容 |
|---|---|
playbook.md | 実装ガイド全編:プロジェクトのセットアップ、3 つすべてのドライバーモード、並列実行、CI/CD、デバッグ用の表、ベストプラクティスのチェックリスト |
cloud-integration.md | LambdaTest の機能リファレンス、LT:Options のフィールド、トンネルのセットアップ、ビルド/セッションの命名、テストの可観測性 |
selenium-4-patterns.md | Selenium 4 のパターン:DriverFactory、複数ブラウザー、ChromeOptions/FirefoxOptions/EdgeOptions、失敗時のスクリーンショット |
selenium-3-patterns.md | Selenium 3 のパターン:Reqnroll.SpecFlowCompatibility.Actions.LambdaTest、IBrowserInteractions、reqnroll.actions.json の設定 |
appium-patterns.md | Appium 2 のパターン:AndroidDriver、AppiumOptions、ジェスチャーヘルパー、MobileBy ロケーター、アプリのライフサイクル |