うちのチームのプログラマーはテストが好きかどうかは分からないけど「これよく見つけたなー」と思うようなバグを見つけてくるからテストがうまいと思う。で、なんでうまいのか考えているのだけど「毎日1時間、システムレベルのテストをしている」のが、うまくなる要因の一つなんじゃないか。
— miwa (@miwa719) 2019年6月24日
医用機器(自社製品)のソフトウェア開発に従事して、あと数年で30年になります。いろんなチームに所属し、多くの開発者と一緒に仕事してきましたが、現在所属しているチーム(うちのチーム)のプログラマーはテストがうまいです。プログラマー時代の自分と比較してもそう思いますし、『ソフトウェアテスト』という側面から製品開発を考えられるようになった今の自分から見てもそう思います。いいバグを見つけたなぁ…(素晴らしい)と思うことが多々あります。
うちのチームのプログラマーはなぜテストがうまいのか。いくつかの要因が思い浮かびましたが、その中でも「毎日1時間、システムレベルのテストをしている」のが大きいのではないかと考えました。この記事では、タイトルから期待される結論(なぜうまいのか)を書くつもりはないのですが(ごめんなさい)システムレベルのテストをすることで得られそうなことをメモしておこうと思います。プログラマーがこんなにテストしてるチームはこれまで見たことがありません。これを15年以上もやってるってすごくないですか?*1
プログラマーが毎日システムレベルのテストをしている
うちのチームのプログラマーは全員、毎日1時間「テストの時間」が割り当てられています。テストの時間は朝会終了後の10:00〜17:00まで。好きな時間に勝手にやるスタイルではなく予め決まっていて、時間割表(テストPC * 6時間)はびっしり埋まっています。プログラマーAさんは10:00〜11:00(テストPC-001)、プログラマーBさんは14:00〜15:00(テストPC-002)のように。プログラマーCさんがテストPC-003の前に座ったら、わざわざ時計を見なくても(ああ、もう16時か)と分かるくらいに常態化しています。
この記事での「システムレベルのテスト」は「テストPC(ほぼほぼ実機環境)の前に座り、お客さまが使うのと同じようにソフトウェアを触るテスト」のことです。JSTQB*2で定義されている「システムテスト」とはすこし違うかもしれません。
テストは『本日のおすすめテスト』*3に従って実施します。テストケースに書いてある通りに操作して期待する結果になるかどうかを確認し、テスト結果を登録します。時間がきたら(テストが途中でも)おしまいです。そんなにビックリするようなことはしていないと思います。
システムレベルのテストをすることで得られそうなこと
- 自分が開発していない製品、機能そのものを知ることができる
わたしたちの製品はそこそこ大きいこともありソフトウェアに関する部分だけでも複数のチームで開発しています。ひとつのチームが複数の製品を同時に開発しているので、プログラマーがシステムレベルのテストをするということは、自分以外のプログラマーが作った製品、機能も当然触ることになります。
- お客さまがどのように使うのか(ワークフローなど)を知ることができる
- 実機での処理速度感
- システムレベルで見たときのバックグラウンド処理(特に他のチームが開発しているもの)を知ることができる
- 実際の現場に近いユーザーデータ環境がどういうものかを知ることができる
開発PCだと少なめのデータやお決まりのテストデータで試すことが多いのではないでしょうか。 - 意地悪テストの残骸を見ることができる
テストPCはテスターも使っています。テストPCを触るということはテストの残骸(データや操作履歴など)を目にすることになるので、どのようないじめ方をしているのかを知ることができます。 - 開発履歴を知ることができる
テストケースからその機能の開発履歴(開発日記)が簡単に辿れるようになっています。どのような経緯で開発(設計、実装)してきたのか、関わったプログラマーは誰で、いつどんな変更が入ったのか、過去にどのようなバグが検出されたのか、どのように修正したのか…などがわかります。実際、開発日記を読みながらテストしているプログラマーの姿をよく見かけます。
テストケースに書いてないことも試している
先ほど「テストケースに書いてある通りに操作して期待する結果になるかどうかを確認し、テスト結果を登録します。」と書きました。でも「テストの時間」にプログラマーが検出したバグを見るとテストケースに書いてないことも試しています。テストケースを誤読して偶然見つけたものもありますが「これ、絶対バグを見つけにいってるでしょ」と思うものも多いです。どういう心境でテストしているのでしょうね。「テストの時間」はプログラマーの帽子を脱ぎ、テスターの帽子をかぶっているのでしょうか。
おわりに
うちのチームのプログラマーはテストがうまい自慢と「システムレベルのテストをすることで得られそうなこと」をメモしました。毎日テストをしているからテストがうまくなる(訓練みたいなもの)とも思いましたが、それだけではないのも実は分かっていて、いつか言語化できたらいいなと思っています。