SeleniumでのE2Eテストを何で書こうかなという話

別に深い話ではなくて個人でReactのテスト軽く書くときに何がいいかなとちょっと悩んだので。
Selenium WebDriverを使うのが前提としてどの言語で書こうかなと。

ユニットテストは普通に開発言語で書くべきだけど、E2Eテストは完全に外から見た振る舞いの確認なので開発言語と合わせる必要は無い。

で、結論を先に書くと個人的にRubyに慣れているというバックグラウンドがあるのでRubyでいいかということになった。
基本慣れてる言語でいいんじゃないかな。

チーム開発で得意言語にバラツキがあったりOSSで不特定多数が触ると言うことになると同じ言語にしといた方が無難かもだが。

言語の候補と検討

JavaScript(TypeScript)

  • 開発言語ということでなんとなく自然と候補に
  • しかし動かすまでが大変
    • JavaScript力足りないせいもあるかもだ
  • TypeScriptで書いてるとmochaやjasmineなどのテストライブラリがエラーの元になることがある
    • 型定義のパッケージを入れても直らない・・・
    • 余計な問題を招くのでむしろJavaScriptで書きたくない感が強まった
  • 色々と面倒なのでJavaScriptで書くというのはなしに
    • TypeScript使ってないなら良かったかも

Ruby

  • Test::Unitとの組み合わせであればサクッと動く
  • RSpecと組み合わせてもいいし
  • Capybara使った方がいいのかなと思ったけどなくても問題ないかとおもったのでこれは入れず
    • と言うかMacでcapybara-webkitがなんだか入らないので諦めた(qmake周りで失敗する)
    • Capybaraとは昔から相性が悪い

Python

  • Pythonはどこでも入ってるしサクッと動く。動かすまでが一番楽
  • フレームワーク使わないと操作がちょっとめんどくさいが薄いラッパーを書けば問題はない
    • Robot Frameworkというのがあるみたいだが、ちょっとピンとこなかった
  • Pythonでプロダクトコード書くならE2EテストもPythonでいいかな

おまけ E2Eテストを書く目的

だいたい以下の二点。

  • デグレ防止
  • 動作確認の自動化 => 高速化

まずは何か修正するとどこか別のところが壊れるというデグレを防ぐ目的。
CIで回せば完璧。

それと変更箇所の確認操作を自動化して開発をドライブするためにE2Eテストを書く。
微妙なUIの動きなど目視で確認しないといけない箇所はどうしようもないが、フォームから入力されたデータがきちんとDBに反映されたかどうかといった確認が楽になる。

あと後ろ向きな理由としては、慣れてない言語やフレームワークでユニットテスト書くの環境構築からしてしんどいな?という理由もあり、さほど複雑なものを作っていないこともあってE2Eテストで済ませる方針。

追記 PHP

Selenium Serverを事前にインストールしてテスト前に手動で起動しておく必要がありめんどい。

どうしてもPHPでという理由がなければRubyかPythonで動かした方が楽だと思う。