0

仕様フローを使用してサービス インターフェイスをテストしたいと考えています。

このサービスは、他のサービスをテストするためにテストを実行するように設計されています。私がやりたかったことは、いくつかの要求メッセージを送信し、応答を返して検証することです。

以下のサービス契約を使用してテストしたいこのデータがあるとしましょう。.

var testData = new TestData
        { Definition = new TestDefinition
            {
            Steps = new List<TestStep>(){ new TestStep{StepId = "1",  Actions = new List<TestAction>()
                                            {new TestAction{ActionType = TestActionType.SendRequest, Parameters = new Dictionary<string, string>(){{"MessageId", "1"}}},
                                            }
                                    } ,
                                new TestStep{StepId="2",Actions=new List<TestAction>
                                            {new TestAction
                                                     {ActionType=TestActionType.GetResponse,
                                                        Parameters=new Dictionary<string, string>()
                                                            {{"MessageId","2"},{"Wait","30000"}} }}}}
            },
            Requests = new List<Request>()
                {new Request(){
                            MessageId = "1", 
                            Content = new List<Element>()
                                { new Element{Key= "TransactionID.Value", Value = "XX0001"},}}},
           Response = new List<Response>{new Response
                        {MessageId="2", ElementValidations = new List<ValidationRule>
                                {new ValidationRule
                                        {Element=new Element{ Key = "TransactionID.Value",,
                                                     Value="XXX0006"},Description="Failed to match [Transaction ID] value",}}}

DataContract は次のとおりです。

[DataContract]
public class TestData
{
    [DataMember]
    public TestDefinition Definition { get; set; }

    [DataMember]
    public List<Request> Requests  { get; set; }

    [DataMember]
    public List<ExpectedResponse> Response { get; set; }

}

[DataContract]
public class TestDefinition
{
    [DataMember]
    public string TestId { get; set; }

    [DataMember]
    public List<TestStep> Steps { get; set; }

}

[DataContract]
public class Request
{
    [DataMember]
    public string TransactionId { get; set; }

    [DataMember]
    public string TransactionType { get; set; }

    [DataMember]
    public List<Element> Content { get; set; }
}

[DataContract]
public class TestStep
{
    public TestStep()
    {
        Timeout = 60000;
    }
    [DataMember]
    public ICollection<TestAction> Actions { get; set; }

}

Scenario、Given、When、Then という特定のキーワードを使用した仕様フローの使用。シナリオとして設定できるもの、与えられた、いつ、そしてその後。

これが私がやろうと思っていることです:

  1. シナリオ前【DB設置】
  2. 与えられた ["ID は (.*) テーブルで見つかりました"]
  3. 【送信するデータをテーブルに用意する】場合 上記のリクエストデータ
  4. 次に、[ループして着信応答を検証します]

これにアプローチするための良い方法を設計するのを手伝ってくれる人がいますか?

ありがとうございました。

4

1 に答える 1

0

Given Whenとの定義については、http://dannorth.net/introducing-bddThenを読むことから始めることをお勧めします。

一般に、

与えられた

与えられたものはあなたが保証できるものです。実際には、これは多くGivenの場合、インスタンスを作成し、値を注入して物事を正しい状態にする場所であることを意味します。モッキングを使用している場合、これも間違いなくここで作成されます。

いつ

Givenこれらは、テストが成功した状態から、テストが成功すると予想される状態に移動するアクションを実行するための手順です。

それで

これは、コードが期待どおりであることを確認するときです。

そして最後に、

シナリオ

Givenここで、 s、Whens、およびsを組み立ててThenまとまりのあるテストを作成します。

そして今、あなたの例のために

これが不明確である場合は申し訳ありませんが、このデザインがどのように機能するかを本当に理解するのに十分な詳細がないと思います.

1.Before scenario [Db set up]BeforeScenarioデータベースをセットアップする可能性が あることをお勧めします。それは一つの方法です。個人的には、テスト フレームワーク内でデータベースを使用することはありません。MS/Oracle などでは、データベースがデータを格納および取得することをテストする必要はないと確信しています。複数のテストを実行すると問題が発生することがわかります。並行して、実行順序をテストし、それを既知の状態にリセットできるようにします。代わりにそれをモックします。

このメモでは、ここでも WCF コントラクトを定義しています。ここでも、WCF がプロキシを取得し、チャネルを使用して相手側と通信することを信頼できます。したがって、ほとんどのテストでは、複雑なアーキテクチャをすべてセットアップする必要はなく、オブジェクトのインスタンスを直接呼び出すだけです。SpecFlow を使用している場合でも、単一の単体テスト (1 つのクラスのみで、多くの場合 nUnit/MSTest を介して並行して実行される) からクラスのコラボレーション (結局のところ最も一般的な機能) まで、さまざまなレベルのテストを作成できます。 、最終的な統合レベルのシェイクダウンまでずっと。WCF スタック全体を作成している場合は、統合レベルのテストが毎回合格するとは思わないでください (ポートのオーバーラップなどが発生するため)。

2.Given ["Id is found on (.*) table"]この時点では、何もテストしないでください。テストを開始する準備ができるように、システムを状態にする必要があります。データベースについて何も定義していないため、シナリオに追加する実装の詳細も非常に貧弱です。代わりに、これが、上記の質問の最初のコード ブロックで説明されている状態にサーバーを配置する必要があるポイントであることをお勧めします。Given the standard starting stateまたはもっと意味のあることを言うかもしれませんGiven that we can handle XX0001 requestsが、 の中で[Binding]これを設定します。

3.When [Prepare data to send in a table] Ex. The request data above おそらくそうではありません。繰り返しますが、テストを実行するメソッドを持つコントラクトを定義していません (ただし、 でほのめかしましたvalidate the incoming response by looping)。非同期設計の場合 (つまり、テスト対象を送信しTestDefinition、フラグをチェックしてテストが終了したかどうかを確認し、テストが終了したら結果を取得する) When、データを送信してからつまり、ループする必要がある場合 (もっと良い方法があります)、ここでも実行してください。

4.Then[validate the incoming response by looping] はい(ループを除く)。ここに結果があり、すべての属性/プロパティを検証して、それが期待どおりであることを確認できます。

これが初めての SpecFlow テスト スイートである場合は、もう少し単純なものから始めることをお勧めします。プロセス全体の 1 つの側面だけを取り上げ、そのシナリオを定義します。慣れてきたら、より複雑な例に向けて構築してください。

BDD は、ニーズに正確に適合する設計とアーキテクチャを見つけるのに役立つプロセスであることを忘れないでください。すべてのケースを処理できるような抽象的なフレームワークはまだ必要ないことに気付くかもしれませんが、少なくとも切り替えを行うと、新しいフレームワークが既存のコードも。

幸運を。

于 2013-08-06T17:58:33.907 に答える