読者です 読者をやめる 読者になる 読者になる

give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

自動化テストで気をつけること

システム開発

先日、会社のメンバーからテストの自動化に苦労しているという話を聞きました。
そういえば、一言で「テストの自動化」といっても結構奥が深いので、自動化テスト初心者が注意すべき点や重要なポイントをちょっと考えてみました。

自動化テストの注意点

  • どのような処理でもプログラムとして自動化できるプログラミングスキルを実装者が持っていること。
    • 結局、手作業でやっていることのほとんどをプログラムとして実装する必要があるからです。
  • いつでも、どこでも、誰が実行しても同じテスト結果が返ってくるようにテストを作成すること。
    • たとえば、テストの成功・失敗がシステム日時や外部ファイルやデータベース等に格納された不安定なデータに依存しているとテストがすぐに壊れます。
  • 壊れたテストを放置しないこと。
    • 少なくともソース管理システムにコミットしたファイルはすべてパスするようにしましょう。
    • 壊れたテストを放置すると、誰も自動化テストを信頼しなくなり、手動テストに戻ってしまいます。
  • 読みやすく、メンテナンスしやすいテストコードになっていること。
    • 何をテストしているのかわからない、どうしてパスしたりパスしなかったりするのかわからない、というテストコードは結局あとでお荷物になってしまいます。
    • そのためにもテストの単位はできるだけ小さくしましょう。複雑な大きなロジックをテストしようとすると、テストコードも複雑で大きくなりがちです。
  • テストしやすい設計になっていること。/テストのしやすさを考慮して設計すること。
    • たとえば、UIにゴリゴリとビジネスロジックが書いてあったりすると、テストの作成が非常に困難になります。最低限、UIとビジネスロジックは別々のレイヤーに分割すべきです。
    • 外部ファイルやメール送受信など、外部リソースへのアクセス部分もテストしにくいので、テスト容易性を考慮しましょう。例えばレイヤーを分け、外部リソースのアクセス部分はテスト時にモック化するなどの工夫が挙げられます。
  • 体系的なテスト手法を理解していること。
    • 言い換えれば、「多すぎず、少なすぎず、必要最小限のテストパターンを網羅していること」となります。
    • 少なすぎるとバグの発見率が低下し、テストを信頼できなくなります。
    • 多すぎると後のメンテナンスが大変です。(少なすぎるよりかはマシですが)
    • そのためには体系的なテスト手法の知識が必要になります。もちろんこれは自動化テストのみならず、手動でテストする場合も重要です。

まとめ

結局のところ、テストをスマートに自動化しようとするとそれなりの設計スキル、実装スキル、テストスキルが要求される、ということが分かると思います。
とはいえ、テストの自動化は苦労してでも習得する価値のある、非常に重要なプラクティスです。
やってみると分かりますが、自信を持ってプログラムの変更やリファクタリングができるので、どんどんコードの品質を上げていくことができます。
イマドキのエンジニアならMUSTで習得しておきたいスキルの一つだと言えますね。

参考文献

このあたりの話は以下のような書籍やリンクが参考になると思います。

テスト駆動開発入門

テスト駆動開発入門


xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))


⇒ごめんなさい、参考文献とか言っておきながら、実は読んだことがありません。。。世間的な評判から参考文献に挙げています。


レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)

  • 作者: マイケル・C・フェザーズ,ウルシステムズ株式会社,平澤章,越智典子,稲葉信之,田村友彦,小堀真義
  • 出版社/メーカー: 翔泳社
  • 発売日: 2009/07/14
  • メディア: 大型本
  • 購入: 40人 クリック: 595回
  • この商品を含むブログ (129件) を見る

⇒「テストしにくいコード」を「テストしやすいコード」にリファクタリングするテクニックが数多く載っています。


ユニットテストの保守性を作りこむ
⇒「読みやすくメンテナンスしやすいテストコード」を書く際の参考になります。*1


はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法


⇒自動、手動を問わない体系的なテスト手法を学ぶならこちら。本当はボーリス・バイザーのテスト本をオススメしたいところですが、内容が結構ヘビーなので、比較的読みやすいこちらを紹介しておきます。

*1:先日参加したXP祭り関西2011で使用されていたスライドです