All Your Bugs Are Belong To Ass

以前作った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とかすればいいらしい。

Created at
by
ytnobody
Last modified at
2014-06-03 16:01
by
ytnobody