8

私は機能テストを書いており、以前のテストの通過に依存するテストを実行する必要があります。機能があるウィンドウを開くボタンがあるとしましょう。つまり、この機能をチェックするには、まずボタンの正しい動作 (つまり、ウィンドウを開くか、機能しないか) をチェックする必要があります。そのため、ボタンのクリックでテストが失敗した場合、機能ウィンドウをチェックするためのテストが実行されませんでした。テストを個別に書く - 私にとってはオプションではありません。私はこのようなものを見たいです:

describe "some tests" do
  open_result = nil

  it "should check work button" do
    click_to_button()
    open_result = window_opened?
    open_result.should == true
  end

  if open_result

    describe "Check some functional" do

      it "should check first functional"

      it "should check second functional"

    end

  end

end

この方法は rspec では機能しないことを知っています。私が見たいものを簡単に説明しただけです。rspecを使用して達成可能ですか? そうでない場合、他の方法 (gem など) はありますか?

4

1 に答える 1

14

RSpec は単体テストフレームワークとして設計されているため、完全な機能テストの動作を取得するのは少し難しいかもしれません。RSpec の哲学では、テストは独立していなければなりません。autotestを使用する場合は特に重要です。この場合、実行順序はまったく予測できません。悲しいけれど事実です。

$aそれでも、もちろん、グローバル ( )またはインスタンス ( @a、ここでは不明)変数を使用して、テスト間の状態を保存できます。とにかく、時間内に実行されるようにブロックに移動ifする必要があります。itキーワードを使用pendingして、前提条件が満たされない場合に失敗することなくテストを中断できます。

しかし

最善の解決策は、ゴールデン ハンマーアンチパターンを回避し、単体テスト フレームワークで機能テストを作成しないことだと確信しています。いくつかの個別の機能をテストしたくない場合。シナリオをテストしたい。そこで、いくつかのシナリオ テスト スイートを試すことをお勧めします。

見よ、キュウリ!使い方は簡単です:

  1. Ruby でパラメーター化されたシナリオのステップを定義し、RSpec スタイルで期待値を定義する
  2. シナリオを自然言語で記述します (そうです、英語だけでなく、ロシア語などでも構いません。正規表現の力はあなたの味方です)。

あなたの場合、次のfeatures/step_definitions/gui_steps.rbようなものがあります

Given /I pushed a button "(.*)"/ do |name|
    @buttons.find(name).click() # This line is pseudo-code, you know
end

ウィンドウの開口部などを確認するための同様のもの(を参照)。次に、定義されたステップを任意の方法で組み合わせることができます。たとえば、2 つのシナリオは次のようになります。

Scenario: Feature 1
    Given I pushed a button "go"
    And I focus on opened window
    When I trigger "feature 1"
    Then I should se "result 1" in text area

Scenario: Feature 2
    Given I pushed a button "go"
    And I focus on opened window
    When I trigger "feature 2"
    Then I should se "result 2" in text area

どちらの場合も、シナリオの一部のステップが失敗した場合 (たとえば、開いているウィンドウに焦点を合わせた場合、開いていない場合)、後続のステップは実行されません。おまけとして、何が起こったのか、どのステップで行われたのか、非常に詳細な出力が得られます (サイトの写真を参照)。

幸いなことに、常にすべてのステップを自分で定義する必要はありません。たとえば、Web アプリをテストする場合、「url/a/b/c に移動したとき」や「Then I should see text "foo" on the page」などの一般的な処理に webrat ステップを使用できます。どの GUI テスト フレームワークを使用しているかはわかりませんが、おそらくそのための手順がすでにあるので、Cucumber %framework name%でググることをお勧めします。そうでない場合でも、これらの手順を一度書くことは、RSpec から Cucumber を作成しようとすることより難しくありません。

于 2013-02-12T16:44:04.333 に答える