5

「外部ウェブサイトから記事をインポートする」という機能があります。最初のシナリオでは、外部 Web サイトからリンクのリストをインポートするテストを行います。

Feature: Importing articles from external website
  Scenario: Searching articles on example.com and return the links
    Given there is an Importer
    And its URL is "http://example.com"
    When we search for "demo"
    Then the Importer should return 25 links
    And one of the links should be "http://example.com/demo.html"

私の手順では、@result配列に 25 個のリンクがあります。

2 番目のシナリオでは、リンクの 1 つを取得して、記事が正しく解析されているかどうかをテストします。

明らかに、私は毎回外部 Web サイトにアクセスしたくありません。特に最初のシナリオが通過した今はなおさらです。

最初のシナリオで HTTP リクエストを行わずにテストを続行するには、どうすればよいですか? または、実際の結果セットを操作し続けることができるように、一度実行し@resultて残りのシナリオで配列を保持する必要がありますか?

4

6 に答える 6

9

これを意図的に行うのは非常に困難です。テスト間で状態を共有することは、特にテストを順番に実行することを強制するため、一般的に非常に悪いことです(最初のシナリオは、Cucumberが明示的にサポートするものではなく、後続のシナリオの前に実行する必要があります)。

私の提案は、テスト戦略を再考することです。テストで外部サービスをヒットすると、実行速度が遅くなり、信頼性が低下します(外部サービスがダウンするとどうなりますか?)。この場合、webmockやvcrのようなものを使用して、実際のサイトから期待するのと同じ応答を返す偽のバージョンの外部サイトを作成することをお勧めしますがパフォーマンスや使用不可の心配。

于 2012-06-23T08:16:01.827 に答える
3

技術的に使用可能であることがわかりました

ステップ定義で @@global_variable を使用して、グローバル状態を共有します。

ただし、他の人が指摘するように、それは良い考えではないかもしれません。

同様のシナリオでログイン手順を繰り返さないようにしました。繰り返しますが、それは良い習慣ではないかもしれません。本当に必要なときにトリックを使用する

于 2013-11-01T23:42:17.013 に答える
2

シナリオ間で状態を共有しないでください。シナリオは、システム全体の意図された動作の一部を記述し、1 つのシナリオのみを実行できる必要があります。たとえば、テスト スイート全体を実行して、1 つのシナリオが失敗したことがわかった場合、その 1 つのシナリオだけを実行して何が問題なのかを調査できるはずです。

外部システムに接続しようとするため、問題が発生します。それはお勧めできません。テストスイートの実行が遅くなるだけでなく、テストが制御できない外部システムに依存するようになります。外部システムが実行されていない場合、テストは実行されていません。外部テストに期待するデータが含まれていない場合、自分のシステムにバグがなくても、テストは失敗します。そして、テストする必要があるものに基づいて外部システムにあるものを制御するのではなく、外部システムにあると期待するものによってテストを制御することになります。

代わりに、外部システムをモック化し、モック化されたシステムが提供するものをシナリオで制御できるようにする必要があります。

Scenario: Query external system
    # These two lines setup expected data in a mocked version of the external system
    Given there the system x contains an article named "y"
    And the article contains the text "Lorep ipsum"
    When I query for article "y"
    Then I should see the text "Lorem ipsum"

このシナリオは、そこに何が必要かを明示的に指定するため、外部システムの実際のデータとは無関係です。さらに重要なことは、独自のシステムがどのように動作するべきかを明確に説明しているということです。

その形式のシナリオは、利害関係者に伝達することもできます。利害関係者は、それらの外部システムに存在するテスト データを事前に知らなくても、シナリオを検証できます。

適切なフレームワークを実行するには時間がかかる場合がありますが、最終的にはそれだけの価値があります。

于 2012-06-23T08:50:44.380 に答える