背景
Jenkins で回している回帰テストの結果(失敗)をタイムリーに知りたい。
これまでもメールや社内 SNS に通知を流していましたが、他の情報に埋もれがち。
ということで、合成音での通知の仕掛けをつくってみました。
構成
こんな感じです。
音声合成の事前準備
MacOSX Lion からは、say コマンドで合成音を生成することができます。
$ say "Hello World!"
デフォルトだと英語話者ですが、日本語話者 (Kyoko) モデルをインストールすることで、
日本語の合成音も発話させることができます。
日本語音声インストール
リンゴマーク → システム環境設定 → スピーチ → テキスト読み上げ → カスタマイズ から
日本語の "Kyoko" チェックボックスをクリックして OK。
これで日本語音声のモデルがインストールされます。
試してみましょう。
$ say -v Kyoko 今日も一日がんばるぞい
日本語の音声が出てきました!
これでテスト結果を喋ってもらえばよさそうです。
回帰テストの結果取得
Jenkins でキックするシェルの中で成功/失敗の判定をしてもよいのですが、開発用の Jenkins サーバから自分の Mac に対してリクエストは受けたくありません。ということで、最新結果を定期的に取得するような構成にしました。
最新のテスト結果は JSON や XML などで取得できるので、それをパースしてあげましょう。
今回は cheerio-httpcli を試してみたかったので無駄にスクレイピングして結果を取得しています。
良い子はマネしないでください。
var client = require('cheerio-httpcli');
var fs = require('fs');
client.fetch('対象のURL', { q: 'node.js' }, function (err, $, res) {
// ナンバーの取得
var breadCrumbs = $('ul#breadcrumbs li.item a.model-link').text();
var buildNum = breadCrumbs.replace(/^.+\#/,"");
// テスト結果文字列の取得
var resultCountText = $('td#main-panel div div').text();
var result = resultCountText.replace(/^\s+/,'').split("\n");
for (var i=0, len=result.length; i<len; i++) {
result[i] = result[i].replace(/^\s+/g,'');
}
// 数値を取り出す
var testCaseNum = result[2].replace('個のテスト','');
var failedCaseNum = result[0].replace('個の失敗','');
// 成功していた場合
if ("0" === failedCaseNum) {
console.log("0");
return;
}
// 失敗した場合はテキストに出力
var outputText = 'ほげほげテストのナンバー' + buildNum + 'で、' + testCaseNum + '件のテストケース中' + failedCaseNum + '件が失敗しています。確認お願いします。';
fs.writeFileSync('sample.txt', outputText, encoding='utf8');
console.log("1");
});
status=`node check.js`
if [ $status = 1 ]; then
say -v kyoko < sample.txt
sleep 5
else
echo "ほげほげの回帰テストは差分がないか成功しています。"
fi
これで、失敗があった場合に合成音が再生されるようになります。
cron に登録するもよし、while でぶん回すもよし。
結果
自席の周辺にミーティングスペースがあるので、人が集まっている時間に突然、機械音でアラートがあると「なんだなんだ?」と注意を引けるようになりました。
また、全然違う作業をしていても回帰テストの失敗が音として聞こえるので、とりあえず何かが起きていることは自分プラスαには分かります。
費用対効果としては悪くないかな、と思います。