以前作ったplenvsetupというツールについて簡単なテストをかいた話(もしくはTravisでshell scriptをテストする方法についての試行錯誤)
相当前の話ではあるけど、ぼくはplenvsetupというツールを作って公開している。
これが何をするものなのかについては上記のブログ(ぼくの旧ブログ)を参照していただくとして、ツールとしては幸せな事に、Perl入学式の環境構築ツールとしてご利用いただいている。大変ありがたい話である。
Perl入学式での失敗
が、実は先日このPerl入学式で、このplenvsetupがうまく動かない、ということがあった。tsucchiさんをはじめとした様々な方のご協力を受け調査した結果、bashで実行すべきところが、shで実行されてしまっていたことがわかった。
直接的な原因としては、Perl入学式のドキュメントがそうなっていたため、ということではあるのだが、そもそも、plenvsetup公開当時のブログエントリ上でもそのようにかかれており、公開当初はshでも動作していたが、いくつかのアップデートを経ているうちに、bashないしzshを要求するようになっていたのだ。
「そうだ、テストをかこう!」
これはテストがないことに幾分原因があると判断し、急遽plenvsetupのgitレポジトリをgithubに用意(それまでは何とgistしかなかった)。travis-ciでテストを行うべく、.travis.ymlの作成に取りかかった。
が、plenvsetupはshell scriptである。一体どうやってtravisでテストを実行させるのか・・・
野蛮な方法で切り抜ける
数分考えたのちに導き出された回答、それは「.travis.yml内でscriptを定義して、死ななければtest成功」という非常に野蛮な方法であった。
.travis.ymlでは、scriptという項目を配列として指定でき、それぞれの項目ごとにexit値を見ている。つまりここでアサーションが行われると捉えることができる。そして、テスト単位を各shell環境ごとに分離し、結果として以下のような.travis.ymlが出来上がった。
language: perl
perl:
- 5.12
before_install:
- sudo apt-get update -qq
- sudo apt-get install -qq zsh
script:
- SHELL=$(which bash) bash test/01_bash.t
- SHELL=$(which zsh) zsh test/02_zsh.t
見るからに野蛮である。が、僕にはその時、この方法以外は思いつかなかった。
もしモアベターな方法があれば、ぜひ@ytnobodyまでメンションください。
すこし調べてみた
http://stackoverflow.com/questions/20449707/using-travis-ci-for-testing-on-unix-shell-scripts
どうやらlanguageのところをbashとかすればいいらしい。