step argument transformations specflow tables
ステップ引数の変換とSpecflowテーブルのチュートリアル:
以前のSpecflowチュートリアルでは、 共有およびスコープ付きバインディング、フック、およびステップの再利用 詳細に。このチュートリアルでは、Specflowでのステップ引数変換について詳しく説明します。
お気軽にお読みください 初心者向けの完全なSpecflowトレーニングガイド 概念を明確に理解するため。 Specflowのステップ引数変換機能により、ユーザーはステップで提供されたパラメーターにカスタム変換を提供できます。
これにより、カスタムロジックを追加して、入力パラメーターを特定のパラメーターに変換できます。 例えば、 パラメータからクラスオブジェクトを直接作成し、変換関数から構築されたオブジェクトを返すことができます。
これから説明するSpecflowのもう1つの機能は、入力データを1つのステップで表形式で渡すことができるSpecflowテーブルであり、テーブルヘルパーは必要に応じてオブジェクトインスタンスに直接マップすることができます。
ビデオを見る:
これは、ステップ引数変換とSpecflowテーブルに関するビデオチュートリアルです。
学習内容:
ステップ引数の変換
引数の変換をよりよく理解するために、まずSpecflowがパラメーターとどの程度正確に一致するかを理解してみましょう。以前の記事で見たように、YouTubeの検索例では、シナリオを実行するためのパラメーターとして検索語を渡していました。
通常、パラメーターの一致は正規表現を介して行われ、一致する正規表現により、ステップで指定された検索語にメソッドパラメーターが設定されます。
まず、Specflowでサポートされているデフォルトの変換とは何か、および引数の変換が役立つ場合を理解してみましょう。
サポートされている変換
Specflowは、正規表現の一致後にデータ型自体を調べることにより、すぐに使用できる多くの変換をサポートします。文字列、整数、GUID、列挙型などの変換を自動的に処理できます。
以下のいくつかの例を見てみましょう。
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
上記のコードサンプルでは、ステップで渡すさまざまな入力タイプを強調表示しており、ステップの実装では、これらはそれぞれのデータ型に変換されています。
以下でこれらのステップの実装を見てみましょう(簡単にするために、提供された引数が自動的に期待されるタイプに変換されることを示すために、各ステップに対してコンソールを実行しました):
[Given(@'I have entered customer name as (.*)')] public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } [Given(@'I have entered customer account id as (.*)')] public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } [Given(@'I select sorting order as (.*)')] public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } [Then(@'I should see my account transactions')] public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } [Given(@'I select number of transactions to be displayed as (.*)')] public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
上記のシナリオを実行すると、期待されるデータ型への引数の自動変換が成功したことを示すことにより、出力はすべての値を正常に出力します。
出力は次のようになります。
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
引数の変換
これを理解するための実際の例を見てみましょう。サポート、あなたは与えられた時間を変換し、それを分に変換するアプリケーションを持っています。 例: ユーザー入力が1日–出力が– 1440の場合、ユーザー入力が1日2時間2分であれば、出力は1562になります。
ここで、さまざまなタイプの入力をサポートするには、入力のタイプに応じてさまざまなバインディング実装を作成する必要があることがわかります。 例えば: 日の部分だけを持つ入力の場合は、個別のステップの実装があり、日、月の部分を持つ入力の場合は、個別のステップの実装などがあります。
ステップ引数変換による単一ステップの実装でこれを実装する方法を見てみましょう。指定された入力は単純にタイムスタンプオブジェクトに変換され、ステップ変換と呼ばれる元のステップに戻されます。
これは、部分的に変換された値を呼び出しステップに返す、入力に対する第1レベルの正規表現スキャンと考えてください。
3つの異なる入力バリアントを持つ機能ファイルを見てください。完全なタイムスパンオブジェクトに変換して元に戻すことで、1回の変換が行われます。
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
上記のコード例で強調表示されている値を見てください。これらはすべてまったく同じ変換を処理し、最終結果は変換されたTimeSpan入力値になり、呼び出し元のSpecflowステップに返送されます。
以下の変換の実装を見てみましょう。
[StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')] public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
フレームワークがそれが変換バインディングであることを認識するためには、引数変換を実装するメソッドにStepArgumentTransformation属性を追加する必要があります。
引数の変換に関して注意すべきその他の重要な点は次のとおりです。
#1) ステップ引数の変換は、一致するステップごとに実行されます。つまり、ステップのタイプに関係なく、つまり、Given、When、Thenのいずれであるかに関係なく、一致する正規表現ごとに変換が行われます。
#二) 変換された出力の戻り値の型に応じて、実際の呼び出しステップに入力パラメーターに一致する戻り値の型がない場合、変換は行われません。
これが意味するのは、呼び出しステップが変換された入力を必要とするが、変換されたメソッドの戻り値の型と一致しないものとして入力のタイムスタンプが指定されている場合、正規表現の一致はオーバーライドされ、変換は行われません。
「Given」ステップの呼び出しの実装を見てみましょう。
private TimeSpan ts; [Given(@'I have entered (.*) into the timestamp to minute converter')] public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
ここで入力パラメータのタイプ、つまりTimeSpanを見てください。これは、これが他のタイプに変更された場合に変換ステップから返されるタイプと一致します。たとえば、Stringの場合、引数の変換は行われず、正規表現の一致は元のStep実装によってオーバーライドされます。
プロのヒント: ここで注意すべき重要な点は、変換する必要のあるテキスト全体を、ステップ引数変換を介してフィード/一致させる必要があるということです。したがって、Givenステップは、可能なすべての入力形式を1つの文字列にラップし、変換正規表現はそれをTimeSpanオブジェクトに変換して、元に戻します。スペックフローテーブル
Specflowテーブルは、値のリストをステップ実装関数に渡す方法です。以前の記事では、シナリオの概要と例を使用してデータ駆動型テストを実装する方法について説明しました。しかし、それは主にさまざまな入力でシナリオを実行することでした。
ここで、テーブルでは、データを提供しているステップの実装に、すべてのデータを表形式で一度に渡すことについてです。
たとえば、Student Management Systemをテストしていて、新しいStudentオブジェクトを作成するために、名、姓、年齢、生年月日などの多くの詳細を入力する必要がある例を考えてみます。
1つの方法は、この各情報を個別のステップとして渡すことです。これは基本的に多くの定型コードであり、各ステップで、テストが必要な同じオブジェクトを更新することになります。もう1つの方法は、複雑な正規表現を作成し、すべてのデータを同じステップで渡そうとすることですが、エラーが発生しやすく、不安定です。
ここでテーブルが助けになります。学生に関連するすべての入力データは、specflowのテーブル機能を介して、表形式で同じステップの実装に送信できます。
機能とステップの実装に関する以下のコードサンプルを見てみましょう。
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
上記のシナリオステップでは、テーブルデータが強調表示されています。
どのデバイスがネットワークアドレス変換(nat)を実行しますか?
Specflowには多くのTableHelperが用意されており、各フィールドを独自に解析するのではなく、ユーザーが指定した入力データからオブジェクトインスタンスを作成するなどの便利な機能を直接使用できます。
以下のステップの実装を見てみましょう。
private StudentInfo studInfo; [Given(@'I have entered following info for Student')] public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
上記の強調表示されたセクションを見てください。これは、StudentInfoオブジェクト全体(名、姓、年齢、生年月日などの学生データフィールドを含むPOCO)の1行の小さなコードです。
Specflowテーブルに関連するその他の機能/概念を以下に示します。
#1) テーブルは水平または垂直にすることができます。垂直テーブルはキーと値のペアに似ており、上記のシナリオでは名前と値のマッピングに似ていますが、水平テーブルにはオブジェクトのすべてのデータが1つの行に含まれています(例で見たように)。
#二) 垂直テーブルは単一の.NETオブジェクトにマップできますが、水平テーブルはオブジェクトのセットまたはコレクションにマップすることもできます。
#3) テーブル内の各フィールド値は、解析されたオブジェクト内の対応する単一のフィールドにマップされるため、アトミックである必要があります。
ここで注意すべき重要な点は、 自動生成 表形式データとのステップバインディングの場合、Specflowバインディングジェネレーターはそのような入力タイプを自動的に考慮し、それを有効な表形式データとして認識します。
結論
この記事では、Specflowの2つの重要で便利な概念について説明しようとしました。
最初のステップは ステップ引数の変換 これにより、Specflow引数のカスタム型変換が可能になり、定型コードが回避され(テストスクリプトがよりモジュール化され、論理的に見えるようになります)、2番目に確認した機能は次のとおりです。 スペックフローテーブル これは、ユーザーフレンドリーな表形式で1つのステップで多くのフィールド/データを渡す必要がある場合に便利です。
今後のチュートリアルでは、プロジェクトのすべての利害関係者が簡単に参照できるPicklesなどのオープンソースツールを使用して、Specflowを使用してさまざまな形式で美しいドキュメントを自動生成する方法について詳しく説明します。
前のチュートリアル | 次のチュートリアル
推奨読書
- MongoDBでのデプロイ:ステップバイステップのチュートリアル
- AppiumStudioのステップバイステップのインストールとセットアップ
- SpecflowとSeleniumWebdriverのエンドツーエンドの例
- QTPをALM / QCと統合するためのステップバイステップガイド
- Specflowの人気のあるインタビューの質問トップ15
- 高度なSpecflow共有およびスコープバインディング、フック、およびステップの再利用
- WindowsへのMongoDBのインストール:ステップバイステップガイド
- JIRAをqTestと統合する方法:ステップバイステップガイド