BDD:Asp.Netのロシア語プロジェクトに対するガーキン言語の適応

サードパーティのライブラリを使用せずに、人気のあるGherkinテスト記述言語をロシア語プロジェクトに適合させる方法を記述し、このアプローチを使用した経験も共有します。

記事は翻訳ではなく、最初から最後まで私の視点の説明です。 しかし、スティーブサンダーソンのブログは私が彼女のところに来るのを助けてくれました。 「Testing」とタグ付けされた彼の記事を読むことをお勧めします。



プロローグ



ソフトウェア開発におけるTDDアプローチは、太陽の下でその地位を獲得しました。 彼は人生の過程で、バグを検索する方法のカテゴリからアプリケーションのアーキテクチャを記述する方法のカテゴリに移り、徐々に自分自身を再考しました。 進化するTDDを有機的に補完する次のステップは、BDD-Behavior Driven Developmentです。



BDDの本質は、プログラマではなくドメインエキスパートの観点からアプリケーションアーキテクチャシステムを説明することです。これにより、フィードバックを受け取るプロセスを高速化し、ソフトウェアクリエーターとそのユーザー間の従来の言語の障壁を取り除くことができます。



システムをテストするためにBDDを使用する(または、今では慣例として相互作用シナリオを記述する)ことは、コードを記述するプログラマーだけでなく、実装の詳細を理解していないが、ユーザーの観点からシステムをよく知っているPMによっても行うことができます。 初心者にとって、BDDスクリプトはプロジェクトのドキュメントを理解するのに最も簡単で自然です。



最近では、BDDがWeb上でより頻繁に使用されています。そのほとんどは、そのシナリオモデルが要求と応答の原則にシームレスに適合するという事実のためです。



今はどんな感じですか



最も人気のあるBDDスタイルのツールは、Ruby用のCucumberと.NET用のSpecFlowです。 どちらもガーキン言語を使用しています。 外観は次のとおりです。 開発者は次のテキストを記述します。



Scenario: Show logged in user name

Given I am logged in as a user called "Vlad"

When I visit the homepage

Then the page header displays the caption ", Vlad!"









また、アクションごとに、対応する関数を作成します。



Given /I am logged in as a user called "(.*)"/ do |name|

create_user(name)

sign_in_as(name)

end



Then /the page header displays the caption "(.*)"/ do |caption|

page_header.should_contain(caption)

end









したがって、CucumberまたはSpecFlowは各ステップを解釈し、正規表現を使用してパラメーターを抽出し、対応するTestFixturesを実行できます。 その結果、人間の言語で完全に書かれ、プロジェクトの各参加者が理解できるテストスーツを取得します。



Given / When / Thenテンプレートは、シナリオを記述するために使用されます。Givenは、初期条件、When-操作、Then-最終結果を設定します。 すべてのスクリプトは特別な.featureファイルに収集され、ご想像のとおり、それらはプロジェクトの特定の機能に関連しています。



このアプローチが悪いのはなぜですか



まず、SpecFlowをインストールして使用する必要があります。 さらに、以下で説明するように、このようなツールは実際には必要ありません。すべてはVisual Studioツールを使用して実行できます。



第二に、SpecFlowにはロシア語の問題があり、キリル文字用に正しく構成するには、多くの努力が必要です。 ここで、彼らは、私たちはすべてITの専門家であり、英語を理解しており、コードにロシア語は必要ないと主張しています。 そうではありません。 ロシア語は、スクリプトの読みやすさを劇的に向上させ、ドメイン言語を英語に翻訳するという痛みを伴うプロセスを放棄できます



これをどのように異なる方法で行うことができますか?



とても簡単です。 しばらくの間、Visual Studioを使用すると、ロシア語を使用してクラスメソッドに名前を付けることができます。実際、これで十分です。 上記の例は次のように書くことができます。



[TestMethod]

public void ___()

{

___("Vlad");

_____();

____(", Vlad!");

}









指定された/ When / Thenパターンは、ここでIf / When / _に変換されます。 慣性により、このテンプレートの名前をIf / When / Thenに変更できますが、「メインページに移動すると「ページに」というテキストが表示されます」というフレーズは、「メインページに移動すると、ページに表示される」よりもオーガニックに見えますテキスト... "。 したがって、読みやすさを向上させるために、最後の単語「Then」を単に省略することをお勧めします。



これはすべて非常に簡単に機能します。各テストクラスは、必要なすべてのGiven / When / Thenステップが定義されているベースクラスから継承する必要があります。



統合テストを作成するとき、スクリプト関数を含むテストクラスの関連機能を組み合わせます。 これは、AccountIntegrationTestの外観です。



画像



統合テストをすでに作成している場合(たとえば、WatiNを使用している場合)、このプロセスがどれだけ簡素化されるかを理解できます。 フィードバックフォームを介してメッセージを送信するためのスクリプトは、次のようになりました。



[TestMethod]

public void _______()

{

string caption = U.GetRandomString();

string text = U.GetRandomString();



using (IE ie = new IE())

{

U.Logout(ie);

ie.GoToContacts();

ie.TextField("Caption").Value = caption;

ie.TextField("Text").Value = text;

ClickOnSendMessage(ie);

ie.Text.ShouldContain(" ");

Div div = U.GetLastUnreadMailMessageText(ie);

div.Text.ShouldContain(text);

}

}









そして、これが今どのように見えるかです:



[TestMethod]

public void _______()

{

___();

______();

_____("", " ");

_____("", " ");

______("");

__(" ");

__();

____(" ");

}









場合によっては、ステップを完了するためにコンテキストが必要です-前のステップの結果(「This_Let_Listen_contains_text」は作業「Admin_Recome_Letter」の結果を使用します)。 また、 protected object _lastActionResult;



として基本クラスで非表示にすることもできprotected object _lastActionResult;



必要に応じて彼に連絡してください。



しかし、それだけではありません。 また、テーブルでの作業を大幅に簡素化できます。 原則として、統合テストからおを作るのは彼らです。 アルバムにアップロードされた写真のリストを操作する例を次に示します(写真ファイルはダウンロードされ、そこから名前と説明を編集できます)。



画像



おわりに



ご覧のとおり、IDE自体を使用して、BDDアプローチを使用してWebプロジェクトをテストおよび説明するための強力なツールを構築できます。 時間が経つにつれて、基本クラスにギブ/タイミング/ Then-ステップの大規模なコレクションができます。これを使用して、ほとんどすべてのシナリオをサイトで構築できます。 必要に応じてステップのライブラリを補完し、通常のクラスとそのメソッドをリファクタリングするのと同じ方法でリファクタリングします。これらのステップは、ドメインロジックの言語で話をする必要があります。



All Articles