mcpField
R
reqnroll-skill

reqnroll-skill

github.com/lambdatestテスト・品質384131 回インストール2 週間前に更新
リポジトリ

reqnroll-skill について

QA エンジニアやテストアーキテクト向けに、C# Reqnroll で Web と Android の BDD テストを作成するスキルです。Selenium 4、Selenium 3、Appium 2 の実行方法に加え、並列実行と TestMu AI のクラウドレポートを扱います。

主な機能

  1. 01Selenium 4・Selenium 3・Appium 2 のパターン
  2. 02Gherkin シナリオとステップ定義
  3. 03ScenarioContext によるドライバー共有
  4. 04NUnit の並列実行
  5. 05TestMu AI のクラウド状態レポート
  6. 06SpecFlow 移行ガイド

活用シーン

  1. 01C# BDD Web テストスイートの構築
  2. 02Android アプリのシナリオ自動化
  3. 03NUnit でのシナリオ並列実行
  4. 04SpecFlow プロジェクトの Reqnroll 移行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/lambdatest/agent-skills --skill reqnroll-skill

インストール後、Claude Code で/reqnroll-skillを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
appium-patterns.md
cloud-integration.md
playbook.md
selenium-3-patterns.md
selenium-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.mdLambdaTest の機能リファレンス、LT:Options のフィールド、トンネルのセットアップ、ビルド/セッションの命名、テストの可観測性
selenium-4-patterns.mdSelenium 4 のパターン:DriverFactory、複数ブラウザー、ChromeOptions/FirefoxOptions/EdgeOptions、失敗時のスクリーンショット
selenium-3-patterns.mdSelenium 3 のパターン:Reqnroll.SpecFlowCompatibility.Actions.LambdaTest、IBrowserInteractions、reqnroll.actions.json の設定
appium-patterns.mdAppium 2 のパターン:AndroidDriver、AppiumOptions、ジェスチャーヘルパー、MobileBy ロケーター、アプリのライフサイクル

コメント