TL; DR
優れた有用なテストを書くのは難しく、C ++でのコストは高くなります。経験豊富な開発者は、何をいつテストするかについての論理的根拠を共有できますか?
長い話
私はチーム全体でテスト駆動開発を行っていましたが、実際にはうまくいきませんでした。多くのテストがありますが、実際のバグやリグレッションがあるケースをカバーすることはないようです-通常、ユニットが相互作用しているときに発生し、孤立した動作からではありません。
これは多くの場合、ユニットレベルでテストするのが非常に難しいため、TDDの実行を停止し(開発を実際にスピードアップするコンポーネントを除く)、代わりに統合テストの対象範囲を増やすためにより多くの時間を費やしました。小規模なユニットテストは実際のバグをキャッチすることはなく、基本的にメンテナンスオーバーヘッドにすぎませんでしたが、統合テストは本当に努力する価値がありました。
今、私は新しいプロジェクトを継承しましたが、それをテストする方法を知りたいと思っています。ネイティブのC ++ / OpenGLアプリケーションであるため、統合テストは実際にはオプションではありません。しかし、C ++でのユニットテストはJavaよりも少し難しく(明示的にものを作成する必要がありますvirtual
)、プログラムはオブジェクト指向ではないため、いくつかのものをモック/スタブすることはできません。
テストを書くためにいくつかのテストを書くためだけに、すべてを引き裂いてオブジェクト指向化したいとは思いません。だから私はあなたに尋ねています:それは何のためにテストを書くべきですか?例えば:
- 頻繁に変更する予定の関数/クラス
- 手動でテストするのがより難しい関数/クラス?
- すでにテストが簡単な関数/クラス?
敬意を表するいくつかのC ++コードベースを調べて、テストがどのように行われるかを確認し始めました。今はChromiumのソースコードを調べていますが、コードからテストの理論的根拠を抽出するのは難しいと感じています。人気のあるC ++ユーザー(委員会、本の著者、Google、Facebook、Microsoftなど)がこれにどのようにアプローチしているかについて、良い例や投稿がある場合は、さらに役立つでしょう。
更新
これを書いて以来、私はこのサイトとウェブを探索しました。良いものを見つけました:
- 単体テストを行わないのはいつが適切ですか?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
悲しいことに、これらはすべてJava / C#中心です。Java / C#で多くのテストを作成することは大きな問題ではないため、通常は利益がコストを上回ります。
しかし、上で書いたように、C ++ではより困難です。特に、コードベースがそれほどオブジェクト指向でない場合は、ユニットテストのカバレッジを良好にするために、物事をひどく混乱させる必要があります。例えば、私が継承したアプリケーションにGraphics
は、OpenGLの上にある薄層の名前空間があります。すべてのエンティティをテストするには、すべてのエンティティがその機能を直接使用するため、これをインターフェイスとクラスに変換し、すべてのエンティティに挿入する必要があります。それはほんの一例です。
したがって、この質問に答えるとき、テストを書くためにかなり大きな投資をしなければならないことに注意してください。