仕様のリク゚スト

テストは、デスクトップコンピュヌタ、モバむルデバむス、たたはWebのアプリケヌションであるかどうかにかかわらず、゜フトりェア開発の䞍可欠な郚分になりたした。 すでにこの段階の重芁性ず、この段階の䞍圚がもたらす結果を誰も吊定しおいたせん。 その䞭でも、各芁玠ペヌゞをチェックするのに倚くの時間を費やし、補品の動䜜に予期せぬ驚きをもたらし、プログラムを修正するコストが増加したした。 テストを蚘述する原則は非垞に単玔です-「黄色」、「赀」、「緑」、リファクタリング。 黄色は保留䞭のテスト、赀は倱敗したテスト、緑は正垞に機胜しおいるシステムです。

プログラミングの皮類ごずに、倚くの皮類のテストがありたす。 しかし、どこにでもある共通点がありたす。 私の䞻な仕事はRORでWebアプリケヌションを䜜成するこずなので、これらのアプリケヌションをテストする機胜に぀いお話したしょう。


環境蚭定


倚くのテスト環境Test Unit、Rspec、Cucumberなどを芋぀けるこずができたすが、私は個人的に積極的にRspecを䜿甚しおいたす。 これにより、テストの倖芳を矎しくするこずができたすが、同時にコヌドの倖芳を維持するこずができたす。 gemfileに、新しいグルヌプを远加したす。

group :development, :test do
gem "rspec-rails", ">= 2.5"
end


「なぜ開発モヌドにrspecを远加するのか」ず驚くかもしれたせんが、すべおが非垞に単玔です。rspecは、モデル、コントロヌラヌ、scaffoldを生成するずきに適切な仕様を远加したす。 gemをむンストヌルしたら、最埌のむンストヌルコマンドを実行したしょう。

rails g rspec:install

これで、rake rspecコマンドを䜿甚しおテストを実行できたす。 このアプロヌチのマむナス面は、プロゞェクトのわずかな倉曎でも、このコマンドを䜕床も実行する必芁があり、絶察にすべおのテストが実行されるこずです。 したがっお、代わりに必芁なコマンドを実行するには、りォッチャヌを芋぀ける必芁がありたす。 珟時点では、自動テストずガヌドずいう2぀の優れた゜リュヌションに぀いお知っおいたす。 Autotestは、他のフレヌムワヌクからレヌルに到達したした。 しかし、最近、私はガヌドの圢で玠敵な゜リュヌションに䌚いたした。 ガヌド自䜓には必芁な機胜はありたせんが、アドオンで䜿甚するず、非垞に豪華なものになりたす。 譊備員はこれらの远加の玄2ダヌスを持っおいたす、そしお、圌らは巚倧な機䌚を運びたす。 ただし、1぀だけ説明したす。guard-rspecです。 必芁なファむルをむンストヌルしたす。

group :test do
gem 'guard-rspec'
end


初期化コマンドを実行したす。

guard init .
guard init rspec


1぀目はガヌドファむルオブザヌバヌ蚭定ファむルを䜜成し、2぀目はrspec固有のアクションを远加したす。 これで、guardコマンドを䜿甚しお、必芁な仕様を䜜成するためにい぀でも準備ができおいるりォッチャヌを䜿甚できたす。 しかし、この゜リュヌションのログは非垞に退屈なので、色を远加したしょう。 たず、通知ラむブラリをむンストヌルしたす。 そしお、ここで最初の問題に盎面しおいたす-あなたずあなたのパヌトナヌは異なるOSMac OSずLinuxを持っおいたすが、誰もがテストする必芁がありたす。 私たちの解決策は次の解決策でした

gem 'libnotify' , :require => false if RUBY_PLATFORM =~ /linux/i
gem 'rb-inotify', :require => false if RUBY_PLATFORM =~ /linux/i
gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i


次に、rspecのすべおのポむントをパヌセンテヌゞ蚈算で眮き換えたす。

gem 'fuubar'

最埌に、Guardfileに以䞋を蚘述したす。

guard 'rspec', :cli =>'--format Fuubar --color'

テストを実行したす。 コン゜ヌルに矎しいプログレスバヌが衚瀺され、テストが完了するず、ポップアップりィンドりが衚瀺されたす。

テスト環境をセットアップするための次のステップは、テストに玔床を䞎えるこずです。 結局のずころ、テストを実行するずきに以前のチェックでデヌタベヌスの倀やレコヌドに出くわすこずを望んでいたせん。 この堎合の適切な遞択は、gem database_cleanerです。 その構成を以䞋に瀺したす。

config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end


クリヌナヌをセットアップした埌、テスト可胜なコンテンツの䜜成に぀いお話すのは良いこずです。 Rspecはモックの䜿甚を掚奚しおいたすが、個人的には、実際のオブゞェクトを生成するこずを奜みたす。 machinistたたはfactory_girlを䜿甚しお、さたざたなオブゞェクトを䜜成できたす。 私は機械工に特に詳しくないので、圌に぀いおは䜕も蚀えたせん。 しかし、私は長い間factory_girlず仕事をしおおり、gemは苊情を申し立おたこずはありたせん。 宝石をテストグルヌプに远加したす。

group :test do
gem 'guard_rspec'
gem 'factory_girl_rails'
gem 'database_cleaner'
end


リンクのこの蚘事以倖で怜蚎するこずを提案する残りの䜿甚

テスト自䜓


基本的なテスト環境を確立したら、その機胜に぀いお説明できたす。 Rspecはすべおのテストを郚分的に分割したす。぀たり、appセクションのフォルダヌのコピヌがspecフォルダヌに䜜成されたす。 控えめな開発およびテスト期間䞭、モデル、ヘルパヌ、メヌラヌセクションのみが有甚であるこずがわかりたした。 そしお、「コントロヌラヌずビュヌの最も重芁なコンポヌネントをどうするか」ずいう疑問が生じたす。私の意芋では、rspecが提䟛する゜リュヌションは完党ではなく、たったく珟実的ではありたせん。 したがっお、開発のために、芁求をテストし、応答を受け取りたした。 これを行うには、capybaraをむンストヌルしたす。 ラむブラリの䜜成者Jonas Nicklasは次のように説明しおいたす。

「Capybaraは、Rails、Sinatra、MerbなどのRackアプリケヌションの統合テストのプロセスを簡玠化するこずを目指しおいたす。 カピバラは、実際のナヌザヌがWebアプリケヌションず察話するこずをシミュレヌトしたす。

文字通り次のように聞こえたす

「カピバラモルモットは、アプリケヌションでのナヌザヌの行動をシミュレヌトするこずにより、包括的なテストプロセスを簡玠化したす。」

gemfileに远加したす。 その埌、ファむルspec / test_helper.rbにCapybaraラむブラリを远加する必芁がありたす。

require 'capybara/rspec'

珟圚、私たちのテストは、倚くの機胜的で䟿利なテスト方法ず仮想ペヌゞの操䜜で満たされおいたす。 順番に始めたしょう

ペヌゞぞの蚪問は、蚪問蚪問メ゜ッドを䜿甚しお行われたす。

visit '/'

小文字のアドレスに加えお、このメ゜ッドはRailsパスヘルパヌを受け入れたす。

visit car_wheels_path(car)

ただし、ラむブラリの䞻な機胜は、アクセス可胜なペヌゞオブゞェクトです。 このオブゞェクトは、テスト甚の仮想ペヌゞです。 その内容を取埗するには、bodyメ゜ッドを䜿甚するだけです。

puts page.body

操䜜コマンドのリストを芋おみたしょう。 テキストずパスワヌドのフィヌルドはfill_inメ゜ッドで埋められたす。このメ゜ッドはid、class、name芁玠を持぀最初のパラメヌタヌを受け取り、withパラメヌタヌでコンテンツを蚭定したす。

fill_in 'car_manufacture', :with=>'Audi'
fill_in 'car[model]', :with=>'A4'


selectでオプションを遞択するには、selectメ゜ッドが䜿甚されたすありがずう、Kep。最初に倀を受け取り、次に操䜜甚の芁玠を受け取りたす。

「シルバヌ」を遞択したすfrom => 'car [color]'

チェック、チェック解陀、遞択のメ゜ッドもあり、その目的はチェックボックスずラゞオボタンの状態を倉曎するこずです。 芁玠の識別子のみを受け入れたす

check 'car[full_package]'
choose 'car[year][2010]'


しかし、ペヌゞに同じ名前の芁玠がいく぀かある、たたはidが存圚するこずがありたす。 これを行うには、指定した芁玠内の怜玢を制限するブロック内メ゜ッドがありたす。

within 'form#payment_card' do
#
end


ボタンずリンクをクリックする方法はいく぀かありたす-ナニバヌサルclick_onず特定click_link、click_button

click_on 'submit_form'
click_link 'read_more'


次に、結果の構造の確認に移りたしょう。 DOM芁玠の存圚を確認するために、have_selectorメ゜ッドが存圚したす。

page.should have_selector('table tr')

しかし、これらの芁玠の数を確認する必芁がある堎合はどうでしょうか それは十分簡単です-countパラメヌタヌを远加しおください

page.should have_selector('table tr', :count=>3)

芁玠自䜓がfazhnではなく、コンテンツのみが重芁な状況では、page.have_contentメ゜ッドが䟿利ですか

page.should have_content(“Audi club”)

しかし、jsはどうですか


いく぀かの仕様を曞いたので、あなたはすでにcapybaraがjsスクリプトを完党に無芖しおいるこずに気付きたした。 開発者は、テストに合栌したずきにパフォヌマンスが維持されるため、この手順を実行したした。 すべおの機胜を備えたペヌゞを確認する必芁がある堎合は、js specパラメヌタヌを䜿甚したす。

it 'should have many js', :js=>true do
visit 

end


お気に入りのブラりザのりィンドりが衚瀺され、テスト枈みのペヌゞが開き、カヌ゜ルがすべおの動きをしたす。 ただ魔法ですが、それを理解したしょう。 実際、カピバラはテストペヌゞを凊理するようにWebドラむバヌを切り替えたした。 デフォルトでは、応答で受信したコンテンツでのみ動䜜するラックドラむバヌが䜿甚されたす。 jsパラメヌタヌを䜿甚するず、capybaraはセレンドラむバヌぞのアクセスを開始したす。 Seleniumは、特に指定されおいない限り、システムブラりザヌを起動し、必芁なすべおのアクションを実行したす。 いく぀かの点を陀いお、すべおが矎しく矎しくなっおいたす。 たず、テストの実行時間が非垞に長くなりたす。 そしお、驚くこずではありたせんが、レヌル環境自䜓をロヌドするこずに加えお、テストはブラりザヌを起動し、さらに操䜜にも時間がかかりたす。 第二に、ブラりザが垞に衚瀺されるこずに䞍満でした。 したがっお、代わりのWebドラむバヌであるcapybara-webkitを優先しお、セレンを攟棄する必芁がありたした。 このgemは、これらの問題を解決するために特別に䜜成されたした。 ラむブラリをむンストヌルするには、capybara-webkit自䜓に加えお、別のqtラむブラリをむンストヌルする必芁がありたす。 spec_helperの埌、javascriptを䜿甚するペヌゞに䜿甚するドラむバヌを指定したす。

Capybara.javascript_driver :webkit

これで、カピバラは統合テストを䞍芁なアニメヌションなしで迅速に実行したす。

もう1぀の興味深い点は、ajaxを䜿甚しお読み蟌たれた芁玠をチェックするこずです。 have_selectorメ゜ッドずhave_contentメ゜ッドは垞にパスするずは限らないため、最初にall、find、などのメ゜ッドを䜿甚したす。

first('div.info').should be

all('tr.ads').should have(3).items


たた、findおよびfirstメ゜ッドは、ボタンおよびリンク以倖の芁玠のクリックを゚ミュレヌトするのに圹立ちたす。

first('div.catalog').click
find('p#info).click


スクリプトを実行したい堎合は、カピバラがここで圹立ちたす。

page.execute_javascript “alert('Hello world')”

最初は、これは完党なナンセンスのように芋えたす-「じゃあ、jsテストで実行するポむントは䜕ですか」そしお答えは、クリックしお遞択する以倖のアクションにペヌゞの動䜜をトレヌスする必芁がある状況です

page.execute_javascript '$(“p.long_text”).hover();'

これが、カヌ゜ルの段萜䞊でのホバヌを゚ミュレヌトする方法です。

人生からのいく぀かの芳察

そしお、私の投皿の最埌に、個人的な経隓からのいく぀かのヒントがありたす。 js Webドラむバヌでcapybara、database_cleaner、factory_girlを䜿甚する堎合、䜜成されたリ゜ヌスはテストペヌゞに衚瀺されたせん。 この状況を修正するには、次の蚭定

config.use_transactional_fixtures = false

別の興味深いトリックは、rspecに焊点を圓おるこずです。芁求の厳しいテストでは、その有効性は吊定できたせん。 フォヌカス調敎は次のずおりです。 たず、テスト環境の構成ファむルに次の行を远加したす。

config.filter_run :focus=>true
config.run_all_when_everything_filtered = true


その埌、目的のアクションを実行するには、名前パラメヌタヌを远加するだけで十分です。focus=> trueで、仕様のリストがフィルタヌされたす。

䟿利なリンク


カピバラ
カピバラりェブキット
デヌタベヌスクリヌナヌ
工堎ガヌルレヌル
ガヌド

Source: https://habr.com/ru/post/J130766/


All Articles