RSpec とか Capybara の Example 内で使いたいメソッドをクラス単位でまとめて使いやすくする gem を書いた。
これ
先週の gem は 80 行ぐらいだったんですが、今回は 40 行です。
なぜ
入社してからこっち、ずっと Vue.js で SPA 制作という業務に従事していましたが、UI 系の宿命で (一部しか) テストがない。
そんななかで、わりと分岐の多い (難しくはない) 実装をすることになって、これは手作業では (変更の都度に) 確認しきれんなということで Capybara に出張ってもらっていました。テスト維持コスト問題というものがあるので、業務リポジトリには入っていない、ローカルでのみ存在する Capybara です。かわいいよ。
そんななかで find
や all
を直書きしていると、途中での変更抜きにしても、見栄えがとてもつらいことになります。
経路によっては他の Example にも出てくるので、メソッド化をするわけですが、しかし、ページごとにちがう submit_button
があったりするので、 registration_page_submit_button
や shopping_cart_submit_button
など、なんとかして名前をかえていく必要がありまして、これが読みづらい。
というわけで Registration.submit_button
や ShoppingCart.submit_button
というように簡単にわけられるようにしました。
例
これが
def registration_page_submit_button find('button', text: 'Register Now!') end def shopping_cart_submit_button find('button', text: 'Buy Now!') end feature 'register then buy' do scenario do visit '/resistration' # input data to some form registration_page_submit_button.click visit '/cart' # input data to some form shopping_cart_submit_button.click end end
こうなる
class RegistrationPage < RSpecMethodGrouping::Base def submit_button find('button', text: 'Register Now!') end end
class ShoppingCart < RSpecMethodGrouping::Base def submit_button find('button', text: 'Buy Now!') end end
feature 'register then buy' do scenario do visit '/resistration' # input data to some form RegistrationPage.submit_button.click visit '/cart' # input data to some form ShoppingCart.submit_button.click end end
よみやすい!
かどうかは人によるかと思いますが、メソッドの管理がしやすくなったのでヨシとします。
この量ではわかりにくいかもしれませんが、他画面遷移 + 要素めちゃ多いとかになると、結構効いてきます。
テスト内の隠蔽どうなの問題
テストに使うデータを過度に隠蔽すると、テストの意図まで隠蔽されて、まるでわからないという問題があります。
しかし、これは、テストの主題ではなく、ページ内の要素を特定しておく (変更時はイッパツで対応できる) のが主目的なので、特に問題ないと思います。
もりもり Capybara でスクリーンショットを撮っていきましょう。