8

C/C++ を使用した単体テスト: 単体テストを行ったことがない人や、Java/Junit から来た人に何を教えていますか?

あなたの観点から見て、多くの時間やストレス (特に C/C++ に関して) を節約する最も重要な教訓/覚えておく/練習することは何ですか?

4

7 に答える 7

8
  1. 単体テストは、チェックインのたびに自動的に実行する必要があります (または、書かれた後に忘れられた単体テストは単体テストではありません)。
  2. バグを修正する前に、単体テストを作成して公開します (失敗するはずです)。次に、バグを修正し、テストが緑色になったら喜んでください。
  3. テストを容易にするために、クラスの「美しさ」を少し犠牲にしても問題ありません (実際にはパブリックにするべきではないパブリック メソッドを提供するなど、テスト/モックに役立ちます)。
于 2008-10-21T11:41:45.800 に答える
7

これを読んで...あなたはとにかく.. 代替テキスト

于 2008-10-21T11:47:29.453 に答える
3

私は、テストクラスへの友情を自動的に付与するというこれらの推奨事項すべてに反対です...

個人的には、テストする必要があるクラスの内部にアクセスできるようにするために、次のことに集中することを好みます。

  1. 可能であれば、クラスのパブリック インターフェイスに依存してください。これは、パブリック インターフェイスをわずかに拡張してテストを容易にすることを意味する場合があります。これらの拡張機能と戦いすぎないでください。ただし、設計を動かしすぎないようにしてください...
  2. 「実際の」コードとテスト コードで使用できる監視インターフェイスを追加して、テスト中のコードを監視できるようにすることを検討してください。(これが設計プロセスの本当に良い部分であることが多いことに、今でも驚いています)。
  3. クラスの一部へのアクセスを「保護されたインターフェイス」を介して派生クラスに提供することを検討し、問題のクラスの「テスト可能な」バージョンを派生させて、インストルメント化およびテストすることができます。

要約すると、私は、テスト クラスとの包括的な友情よりも、テスト ポイントで設計されたものを見る方がはるかに好きです。もちろん、前者は後者よりも実行するのが難しいですが、私見では、より良いコードとより良いテストが得られます。

于 2008-10-21T16:57:52.387 に答える
2

テストのないレガシー コード ベースを処理する場合、(私がそうしなければならなかったように) 実装に単体テスト フレームワークを使用する機能テストから始めることになるでしょう。心配しないでください。あなたのコードは非常に相互に関連しているため、適切な単体テストを書くことはおそらく不可能です。また、現状に満足しないでください。機能テストが実施されたら、真の単体テストが可能になるようにリファクタリングする必要があります。あなたのコードはより良いものになるでしょう!

于 2008-10-21T13:44:42.387 に答える
2

ripper234 を言い換えて、いくつかのルールを追加したいと思います。

  1. すべてのモジュール (通常は DLL プロジェクト) には、個別の UT プロジェクトが必要です。すべての UT クラスは、プライベート メソッド/メンバーにアクセスするために必要なすべての DLL クラスのフレンドである必要があります。
  2. モジュールを変更する場合は、まず UT を変更してください。チェックインする前に、DLL とその UT の両方がコンパイル、リンク、および UT がクラッシュやエラーなしで実行されることを確認してください。チェックインする前に、すべてのモジュールに対してすべての UT を実行する必要はありません。これは時間の無駄です。
  3. すべての UT は、すべての DLL とともにナイトリー ビルドで自動的に再構築されます。すべての UT とモジュールは、ビルド中にコンパイルおよびリンクする必要があります。
  4. 夜間ビルドが成功すると、すべての UT が自動的に実行され、結果が要約されるはずです。
  5. すべての UT の結果を含む概要を開発者に投稿する必要があります。障害やクラッシュが発生した場合は、できるだけ早く修正する必要があります。
于 2008-10-21T12:04:33.197 に答える
1

最も重要な単一のレッスン:テストは、テストなしよりも優れています。

于 2008-10-21T13:23:05.080 に答える
1

単体テスト ケースは、1 つのことだけをテストする必要があります。

単体テスト ケースでワークフロー全体をテストするのは、C# や Java よりも C/C++ でよく見かけます。

おそらく、ほとんどの C/C++ xUnit フレームワークでは、テストケースを登録するためにいくつかの手順が必要なため、新しい機能を追加するときに、既存のテストケースに数行を追加するだけの誘惑が強くなるからです。

于 2008-10-21T13:37:57.687 に答える