RSpec は単体テストフレームワークとして設計されているため、完全な機能テストの動作を取得するのは少し難しいかもしれません。RSpec の哲学では、テストは独立していなければなりません。autotestを使用する場合は特に重要です。この場合、実行順序はまったく予測できません。悲しいけれど事実です。
$a
それでも、もちろん、グローバル ( )またはインスタンス ( @a
、ここでは不明)変数を使用して、テスト間の状態を保存できます。とにかく、時間内に実行されるようにブロックに移動if
する必要があります。it
キーワードを使用pending
して、前提条件が満たされない場合に失敗することなくテストを中断できます。
しかし
最善の解決策は、ゴールデン ハンマーアンチパターンを回避し、単体テスト フレームワークで機能テストを作成しないことだと確信しています。いくつかの個別の機能をテストしたくない場合。シナリオをテストしたい。そこで、いくつかのシナリオ テスト スイートを試すことをお勧めします。
見よ、キュウリ!使い方は簡単です:
- Ruby でパラメーター化されたシナリオのステップを定義し、RSpec スタイルで期待値を定義する
- シナリオを自然言語で記述します (そうです、英語だけでなく、ロシア語などでも構いません。正規表現の力はあなたの味方です)。
あなたの場合、次の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 を作成しようとすることより難しくありません。