BTSを作ろうと思ったきっかけ
BTSを作ろうと思ったきっかけは、以下のエントリに書いたような不満があったためです。
もともとExcelの一覧表でバグを管理していたのですが、プログラマの数が当初よりも多くなり、Excelのブック共有を使った運用が限界にきました。
ソシム
売り上げランキング: 288737
ちょうど単体テストから結合テストへ移行するフェーズの時期だったため、Webで動作するバグ管理システムを作ってみようと考えました。
巷で人気のあるtracやRedmineを使うことも考えましたが、なるべくバグ管理の運用フローを変えずに、そのままExcelからWebへ移行できることを重視し、スクラッチで作ることにしました。
BTSに必要な機能
BTSを作るにあたって、BTSに必要な機能は何かと考えた結果、最低でも以下の機能が必要でした。
- バグの登録、更新
- キーワードによる検索
- バグのステータス管理
- メールによる通知
- CSVファイルのエクスポート
- 統計情報の収集
これらの機能をWindows Server上で動作するASP(classic asp) + SQL Server Expressで実装しました。
以下では、これら機能について掘り下げてみたいと思います。
バグの登録、更新
BTSはバグを管理するシステムなので、バグの登録ができないとはじまりません。
ここで気をつけたのが、バグIDの連番管理の仕組みです。複数のブラウザから同時にバグの登録が行われてもバグ番号の付番の一貫性が保たれなければなりません。
具体的には、classic aspのapplication lock*1による同時実行制御の仕組みを使いました。application lockを使うと、特定の処理を複数のクライアントが同時に実行できない(同時に実行するのは必ず1クライアント)という制限をかけることができます。これによってバグ番号の付番の一貫性が保たれるようにしました。
キーワードによる検索
キーワードによる検索は、過去に発生したバグや類似のバグを検索するために必須の機能です。数百、数千というオーダのバグを一覧から1つずつ探していては時間がいくらあっても足りません。
ここで目指したのはGoogleのような検索機能です。ユーザがデータの格納場所(DB上のカラム)を意識することなく、すべてのカラムから目的のキーワードを含むバグ情報を検索できるようにしました。
具体的には以下のサイトにあるようなロジックで、複数のカラムを結合したフィールドに対してlike検索*2することでカラムを意識しない検索を実現しました。
バグのステータス管理
バグ管理では、1つ1つのバグがどのような状態なのかを一目で把握できるようにステータスを分けることが必要です。
ステータス管理は、Redmineのステータスを参考にしました。
メールによる通知
バグの登録時にはメンバ全員にメールを飛ばします。これによって、同じようなバグの重複登録を防ぎます。
メールを通知するタイミングに苦慮したのですが、あまり頻繁に飛ばしすぎてもみんな見なくなってしまうので、新規登録時のみ通知するようにしました。
classic aspではCDO.Messageというオブジェクトを使うとメール送信ができます。
CSVファイルのエクスポート
データベースに登録されたバグ情報をCSVファイルにエクスポートできる機能は意外と重要でした。
というのも、僕より年代が上の世代はExcelを好み、また得意としています。Sierでは猫も杓子もExcelです。CSVファイルでエクスポートすることができれば、Excelで簡単に開けて、編集することができます。
統計情報の収集
日ごとにバグが何件発生したか、どの機能でバグが多いかなどを収集して、グラフで見える化する機能も実装しました。
Web上でグラフ化するにあたり、jQueryプラグインであるjqPlotを使いました。jqPlotの良いところはIEでも動くところです。
バグの原因となったプログラムソースとSVNの統計情報なんかを組み合わせると、またおもしろいかもしれません。
Webデザイン
Webデザインについては、Bootstrapを使って今風なデザインにしてみました。Twitter Bootstrapをフレームワークとして使うと、Webデザインが苦手なプログラマの方もさくっとオシャレなWebアプリケーションを作成することができます。
おわりに
BTSは作っておわりではなく、運用をどうやって回していくと効果的かを、実際に使いながら考えて行くことが大事だと思いました。
実装については、今は便利なJavaScriptライブラリが豊富にあり、大抵のことは簡単にできるようになっています。既存のBTSを使うのも1つの手ですが、スクラッチで現場に合うものを作ってみるのも良いかなと思いました。
関連エントリ
*1:ASP講座 11章 [ Application オブジェクト ]
*2:パフォーマンス的に微妙かもと思いましたが、数千件なら問題なく動いています