動くドキュメントかつ自動テストとしての Geb スクリプト
Geb で動くドキュメントかつ自動テストな Geb スクリプトを作ってみようとトライしてみました。色々悶絶したので、それをメモしておきます。
※この日記エントリは Geb Advent Calendar 2016 に参加しています。
みなさん、ドキュメントを作成するの、好きですか?あるいは、テストコードをコーディングするの好きですか?それらは実コードのコーディングよりも重要で楽しいですか?
私は、できれば実コードの作成を優先し、ドキュメント作成やテストコード作成は低優先度で行きたい派です。
とはいえ、一般的に、あるいは経験的に、ドキュメント書いたりテスト書いたりしないとヒドイ事が起きるので、仕方なくドキュメント書いたりテスト書いたりしますですよね。
そこに Groovy 系列の Geb を使って解決しようとするのが今回の取り組みです。一般的に Groovy は Java コードよりも行数が少なくなるメリットがあるので、今回のようなテストコード作成には役立つことが期待できます。
ここから横道。読み飛ばしてOK。
なのですが、ところがですね、私は Groovy 習熟度が低かったので、色々ハマりました。 まず gradle 無しで 単純 groovy のみで、取り掛かってみようとしました。 すると、色々難易度上がります。 でも 最初の理解には 単体 groovy で、、、と頑張ったところ、色々ハマりました。奥が深いです。 さらに、途中で Ubuntu 16.04 に gradle インストールしようとして、それが引き寄せる groovy が入り、バージョン違いでナニガシ、、、 というように、真正面から色々ハマりました。 を一巡したところで、本文に戻ります。
ということで、まずは単純 Geb による「$」による要素アクセスのみを試して見ました。ドキュメント記述(そしてコンソール出力)には Ant タスクを利用しています。groovy から Ant タスクの echo を呼び出す、なんとも不思議な感触です。
@Grab('org.gebish:geb-core') @Grab('org.seleniumhq.selenium:selenium-java') @Grab('org.seleniumhq.selenium:selenium-chrome-driver') import geb.Browser import org.openqa.selenium.chrome.ChromeDriver {-> def home = System.properties['user.home'] System.setProperty('webdriver.chrome.driver', "${home}/apps/selenium/chromedriver" ) }() Browser.drive(driver:new ChromeDriver()) { def ant = new AntBuilder() ant.echo('サイトを開く') go 'http://www.yahoo.co.jp/' ant.echo('認証画面を開く') $("#siteinfo > li:nth-child(3) > a").click() ant.echo('トップ画面に戻る') $("#ygmhlog").click() }
そして、これが可読性のあるテストコードとドキュメントの合成例です。
まずは最初の一歩ではありますが、まあ Java に比べると確かにこの時点で既にコード量は減っていますね。