[cibase]Ruby のテスト自動化の可視化をサポートする minitest 継続的インテグレーションベースをリリースしました。

テストは重要!

テスト自動化は本当に重要です。

改めて言うことも無いという人も今や多いと思うんですが、特に僕がテスト自動化を必要とする理由を以下に挙げます。

  • 性格がおっちょこちょい!単純なミスを連発するなんて良くある話だ!
    • スクリプト言語(今回は Ruby なので)だと、よくやる変数名の単純な間違いだって動かさないとわからないぞ。
  • 動作対象にバリエーションがあるので一つの変更がどう波及するのかわかったもんじゃない!
    • 変更の度に全バリエーションを手動でテストする?それとも神様に運命を託すか…。いや、神様なんていない!(居たら俺に可愛い彼女ができてるはずだもん!!)
  • 一人で作っている。
    • 一人だから全バリエーションを手動でテストするなんて絶対にできないんだぜ!(そんな時間あったら彼女を作る時間に当てたいよ!泣)

今、集中的に作っているソフトウェアは mail2weblog(高機能メール投稿型モブログ)というもので、Ruby で作っています。

mail2weblog(高機能メール投稿型モブログ)は、メールを受け取ってブログへの投稿を仲介するソフトウェアです。

受け取り口はメールで、内部的には対応ブログ毎にアダプターがあり、それぞれの処理をする形になっています。


mail2weblog(高機能メール投稿型モブログ) にその存在するバリエーション

mail2weblog(高機能メール投稿型モブログ)を開発する際には、以下のバリエーションを気にする必要があります。

  • 動作環境
    • 利用するレンタルサーバ等。
    • より詳細には OS や Ruby のバージョン等
  • 受け取るメールの種類
    • 利用メールに応じて送信されてくるメールの書かれ方がバラバラ。
    • より詳細にはエンコーディングの方法や HTML/テキストメールや添付ファイルあり/なし等。
  • 投稿先ブログ
    • 標準化された API である metaWeblog API や AtomPub 等を利用しているが、何気にブログ毎に微妙に異なる部分がある!

このようにバリエーションはたくさんありますが、一人で作る以上、個別に作るのではなくなるべく共通化してソースコードは小さく抑えたいものです。

すると新しい問題への対処や機能追加の際に共通部分を触ることが多くあるわけです。

その場合、その影響がどのように波及するか、もちろんある程度予測します。しかし、予測はあくまで残念ながら予測です。

予測外のことが起こるんです。これがまた。


そこでテストの自動化!

というわけで、これらのバリエーションに耐えるためにテストの自動化を推進しています。

mail2weblog(高機能メール投稿型モブログ)は、メールを受け取り/ブログへの投稿をするというプログラムです。

下位のモジュールは直接動作(インスタンスを生成して、メソッドを呼び出す)させて結果を見ます。単純です。

mail2weblog(高機能メール投稿型モブログ)は、さらに踏み込んだテストも自動化しています。

  1. メールを送信する。
  2. システムを動作させる。
  3. ブログにアクセスし、投稿が反映されたかを確認する。
  4. 返信メールを受け取り、内容を確認する。

Ruby は net/smtp や net/http 等のモジュールが充実しているので、これらのプログラムを作ることは簡単です。

メール応答システムなのでウェブアプリケーション等のように画面遷移などが存在しないので、これらのテストが簡単だということのも実際にはあります。

mail2weblog(高機能メール投稿型モブログ)は、ステートレス(状態に持たない)ので送信−応答の種類×ブログ数のバリエーションでテストが完了します(性格にはさらにそれを動作環境毎に)。

ウェブアプリケーションの場合は、画面遷移により統合テストは爆発的に増えるのでこう簡単には行かないでしょうが^^;

そして、作ったテストは毎日サーバ上の cron で朝 6:30 と夜 21:00 に実行しています。

テスト環境は、「HYEC.ORG」というサーバを無料で利用させてもらっています。管理者の方がとても親切で使いやすいです。要望にも色々と応じてくれました。


テスト結果の可視化を行いたい

さて、テストを毎日動かしたらその結果が見たいですよね。

というわけで作り始めたのがテスト結果の可視化スクリプトです。

今回リリースした「minitest 継続的インテグレーションベース」というのがそれです。

以下のようにテスト結果の可視化ができます。1枚目は実行したテスト全体の概要です。2枚目は失敗したテストのエラーレポートです。エラーレポートでは対象行前後のソースも出力してくれます。

最初はログファイルをサーバからダウンロードして手動で読んでいたのですが、このスクリプトで簡単にテスト結果が見れるようになりました。

また、これは「minitest 継続的インテグレーションベース」に含めていないのですが、応用してブログごとのテスト結果を一覧で見れるようにもしています。

このリンクをクリックしたときにテストが成功しているか失敗しているかわかりませんが^^;

良くも悪くも一目で現状がわかるというのは良いことです。

せっかく作ったし、他の人の役に立てばということでオープンソースとして公開しています。使えそうと思った方は使ってみてください。