ウェブアプリケーションのJSのテストするのにCasperJS使ったら便利だった.
CasperJSはPhantomJSにテスト用ユーティリティがついて便利になったやつ.
JS,MVCできれいに書いてると,Modelの単体テストとかできるけど,昔ながらの感じだと,ここをクリックしたらこれが表示されること,みたいなテストを書くことになる.けどライブラリとかいろいろあってどれを使えばよいか分からなくて敷居が高い.CasperJSを使ったらこれだけで完結してテスト書ける.
PhantomJSは単なるブラウザだけど,CasperJSはテストのフレームワークとか,DOMのテスト関数とかがついてる.
非同期なタスクの実行の仕組みも入ってて,casper.thenっていうのを順番に書いていくと,順番に呼んでくれて,click()して,casper.thenしたら,ページ遷移したら次のページに移動してる.スタックになってて,thenの中でthenしたらまずそのthenをやってからもとのスケジュールに戻る.PhantomJS書いてるとスケジューリングクラスを毎回自作してて独自の世界観みたいになってた.
テストできるだけでなくて,スクレイピングするための便利機能がいろいろ入ってて,PhantomJSより便利.逆に,ウェブサーバーの機能とかは削られてる.
以前,PhantomJSでウェブアプリケーションの動作チェックするスクリプトを書いたときは,素のPhantomJSを使って,ここで5秒待つとか,jQueryがロードされるのをタイマーで待つとかしていて,可読性が低く,何を確かめたいのか分かりにくかった.
CasperJSで書くと,ここをクリックしてここをクリックするとこういう文字が出る,とか文字の通りに書けて,いい感じだった.
CasperJSで診断メーカーの人気の診断をランダムに受診するの書いてみた.冗長な部分がなくてすごい.click()してthenしたらページロードが終わったら次に行ってるのが便利.
#! /usr/bin/env casperjs # ./shindan_casper.coffee '趣味はマリンスポーツです' casper = do (require 'casper').create casper.start 'http://shindanmaker.com/c/list?mode=hot', -> href = @evaluate -> links = (document.querySelectorAll '.list_title') links[Math.floor (do Math.random * links.length)].href casper.open href casper.then -> @echo @getTitle() casper.fill '#form', u: casper.cli.args[0] @click '#form input[type="submit"]' casper.then -> result = @evaluate -> document.querySelector('#forcopy textarea').value @echo result do casper.run
実行結果見たい人いないと思うけどこんな感じ.実行結果はどうでもいい.
% ./shindan_casper.coffee '趣味はマリンスポーツです'
その代償に俺は……
そwwのww代ww償wwにww俺wwはww死wwぬ。 http://shindanmaker.com/381600
2012年1月にPhantomJSでランダムに受診するの書いてた.このときはよい書き方が分かってなくて,switch phantom.state
とかして,when 2
とかしてた.これはださい.
テストも同じ雰囲気で書ける.ここに例が載ってる.例では勝手にGoogleのテスト書いてる.
今日は,デプロイ済のstaging環境の挙動のテストを書いて,リリース前に動かしてみる,というのを書いた.診断メーカーの例と同じくらい簡潔に書けてよかった.
ローカルのRailsと協調してテストみたいになると,ちょっと導入がめんどうになる.
Rails起動してからlocalhost:3000にアクセスしてテストとか書けると思う.CasperJSで操作したあとDBの状態を調べるとかはこれだけでは書けないけど,それはあきらめるか,何かと組み合わせて使うことになると思う.
手でポチポチやって観察してたのが自動でテストできるようになると,魂のステージが一段階上がった感じがする.
本当はローカルで起動したサーバーをテストするとか,Jenkinsで動かすとか,いろんなブラウザで実行するとかしないといけないけど,まずはこれくらいでも書けると安心さがだいぶちがう.とっかかりとしては良いと思う.おすすめです.