プロジェクトに自動テストを導入しようとして、失敗を繰り返した体験談です。
前提
テストケースはエクセルで管理され、QAがマニュアルで実施している。
リリースから時間が経過しており、機能もテストケースも肥大化。
テスト工数が大きい関係でリリース間隔は長め。
自動化テストを導入すべき、という声は定期的に上がり、
それらの技術についてプレゼンしても反応は悪くないが、実際に導入すると定着しない。
原因(と予想しているもの)
一応対処できたもの
テストの実行が手間
対策として自動実行を検討。
タイミングとして以下の3つを検討した結果、3番目を採用。
1. [見送り]git hookでコミット実行実時にテスト差し込み、テスト通ったらコミット処理
各人のローカル開発環境に干渉する必要がある。
テストケースの実行時間に制限が出てくる。
2. [見送り]Pull Request作成時にテスト開始、テスト通ったら結果をPull Requestにコメント反映
コミット時よりは緩いが、それでもテストケースの実行時間に制限が出てくる。
3. [採用]マージ時にテスト開始、結果を失敗したときのみチャットに通知
リモートで完結するため、開発者のアクションを妨げない。
代わりに検知が遅くなるので、修正が遅くなりがち。
コードがテストしにくい書き方になっている
数千行のクラス、数百行の関数など。
そのためテストが大変書きづらい。
既存コードすべてをリファクタリングすることは現実的ではなかったため、対策として以下2点を実施。
1.自然言語で記述できるBDDフレームワーク採用
ケースの作成は楽になったものの、後述のテストを書く時間の問題によりケースが増えず廃止。
2.画面のscreenshotによる画像差分テスト採用
ある程度のバグの事前検知に貢献。
ただし画面全体に対するスクリーンショットだったため変化に非常に弱く、
期待値の更新を頻繁に行わなければならないというメンテナンスコストの高さと、
後述する時間がないことによるテスト失敗状態が続いたことが重なり運用停止。
対処できなかったもの
機能実装で手一杯でテストを書く時間がない
そもそも開発が遅れることが多く、テストを書く余裕がない。
また、既存テストが壊れた場合も治す余裕がなく、自動実行と通知の仕組みがあっても、後回しにしてしまい、
結果としてテスト失敗通知を無視するようになってしまう。
自動テストを導入することで長期的には生産性は上がるはずが、
移行時の生産性低下を乗り越えられない。
開発者自身があまりテストをしないため、自動テストを書くモチベーションが沸かない
楽をするためにがんばる、というのをモチベーションにできない。
品質向上、生産性向上、という名目は分かる。
※これは原因としては弱め。
振り返りと次回挑戦時の注意点
・興味のない人には不便を掛けず、興味ある人は移行できるように、というのはいい人ぶろうとしすぎた。
他の人を説得するコストを惜しむべきではなかった。
・もう少し定量的なデータを集めて説得材料を作るべきだった、かもしれない。
- 現在の手動テスト実行工数(これはある)と自動化後の手動テスト実行工数+自動テスト実行工数
→手動テストをすべて置き換えるものではない、としか説明していない。
- 自動テストで品質を上げることで生産性が上がるので結果的にテストを書く時間はロスにならない、という根拠
→交差するグラフはよく見るけど実績値があるか
- 自動テストのメンテナンスコスト
- 学習コスト
※この記事は事実を基にしたフィクションです。実在の人物、団体とはあまり関係ありません。