$30 off During Our Annual Pro Sale. View Details »

ちょうどよい Rails E2E テスト/enough-good-rails-e2e-test

ちょうどよい Rails E2E テスト/enough-good-rails-e2e-test

Rails には system test (spec) と呼ばれる、Capybara を使った自動ブラウザテストの仕組みが備わっています。これはとても便利で強力なテストではありますが、けして万能ではありません。実行時間が長くなりがちですし、テストコート量も多くなりメンテナンスが大変です。

Ruby でのこのレイヤのテストの先駆けであろう Cucumber からの歴史を振り返りながら、「ちょうどよい」活用の度合いを考えたいと思います。

MOROHASHI Kyosuke

February 01, 2020
Tweet

More Decks by MOROHASHI Kyosuke

Other Decks in Programming

Transcript

  1. 7 &

  2. ‣ 3BJMTతϢχοτςετ ‣ PS%#ʹ΋ґଘ͠ͳ͍ϩδοΫͷςετ  ‣ ϦΫΤετςετ ‣ γεςϜςετ ‣

    PS34QFDͷ TQFD ‣ #%%͸ςετ͔ɺΈ͍ͨͳͷ࿩͸ࠓ೔͸ԣʹ͓͍͓͖ͯ·͢Ͷ ςετʹ΋৭Μͳछྨ͕͋Δ 
  3. ‣ ߴϨϕϧͳϔϧύʔϝιουΛ༻ҙ͢Δɻ ‣ ʮϩάΠϯϑΥʔϜʹ஋ΛೖΕͯαϒϛοτʯ͔ΒʮϩάΠϯ͢Δʯͱ͍͏ؾ࣋ͪ ιϦϡʔγϣϯར༻ऀͷ໨ઢʹཱͭ  def login_as(user) visit signup_or_singin_path

    click_on '登録済みの方はログイン' fill_in 'メールアドレス', with: user.auth.email fill_in 'パスワード', with: COMMON_TEST_PASSWORD 
 click_on 'ログイン' end
  4. ‣ ͱ͍͏Πϝʔδ͕͋Δ͕ɺҙ֎ͱͳ͍ ‣ ݱࡏͷ࢓ࣄ3BJMTΞϓϦͰ΋AHJUHSFQTMFFQA͕݅ͩͬͨ ‣ $BQZCBSBͷߴϨϕϧϝιουΛ࢖͏ͱɺΫϦοΫର৅΍
 ݕূ͢ΔςΩετ͕ݱΕΔ·ͰࣗಈͰ଴ͬͯ͘ΕΔ ‣ DMJDL@PO΍IBT@DPOUFOUͳͲɺ$BQZCBSB"1*Λ࢖͏ ‣

    ೥ ݪจ೥ ͷهࣄ͕ͩɺߟ͑ํ͸ࠓͰ΋௨༻͢Δ ‣ IUUQTQPTUEDDXSJUFSFMJBCMFBTZODISPOPVTJOUFHSBUJPOUFTUTXJUIDBQZCBSB ൪֎+4ඇಉظॲཧͷλΠϛϯάͰࣦഊ͠TMFFQ͢Δͷ͕ۤ௧ 
  5. ‣ ࣮ߦ͕͔͔࣌ؒΓ͗͢Δ ‣ ศར͗ͯ͢όϦσʔγϣϯͳͲ΋ςετ࢝͠Ίɺςετέʔε͕૿͑͗͢Δ ‣ ֎෦ϓϩηεͱ ϒϥ΢βͳͲ ͷ௨৴͕ൃੜ͢ΔͷͰͲ͏ͯ͠΋஗͍ ‣ ϞσϧͷϢχοτςετͰͰ͖Δ΍ͭ͸ͦͬͪͰ΍ͬͨ΄͏͕͍͍Ͱ͢Ͷ

    ‣ σʔληοτΞοϓ͕େมʹͳΓ͕ͪɺͱ͔ ‣ શ෦ͭͳ͛ΔͨΊɺσʔλҰࣜ·Δ͝ͱඞཁʹͳΓ͕ͪ ‣ ݸผͷืΔ࿩͸࠙਌ձͰ ͦΕҎ֎ʹ΋৭ʑେม͚ͩͲ 
  6. 

  7.  #langage: ja フィーチャ: ログインしてユーザーを識別できる ユーザーとして、 ログイン機能などで自分の情報を識別したい なぜなら、メッセージなどを「自分のもの」として区別したいからだ シナリオ: ユーザ登録してログインする

    前提 "新規ユーザー登録"ページを表示している もし "ログイン名"に"moro"と入力する かつ "Eメール"に"[email protected]"と入力する かつ "作成"ボタンをクリックする ならば "こんにちはmoroさん"と表示されていること Given('"{word}"に"{word}"と入力する') do |field, value| fill_in field, with: value end
  8.  #langage: ja ... シナリオ: 新規登録後につぶやくことができる 前提 ユーザー"moro"として新規登録する もし "内容"に"ブリおいしいです。"と入力する

    ならば "ブリおいしいです。"と表示されていること かつ "つぶやき: 1件中1件"と表示されていること Given('ユーザー"{word}"として新規登録する') do |username| fill_in 'ログイン名', with: username fill_in 'Eメール', with: '#{username}@example.test' click_on '新規登録' end
  9. ࣗવݴޠޠኮͱίʔυޠኮΛ͚ۙͮͯΈͨྫ  let(:user) { create(:user) } let(article) { create(:article) }

    scenario 'ヘッダメニューからマイページ行けてfav履歴に遷移できる' do user.fav(article) login_as(user) within('nav.header-nav') do click_on 'マイページ' end click_on 'お気に入りの記事' expect(page).to have_content(article.title) end