19

私はかなり新しいソフトウェア開発者で、現在、数年前に開始された既存の C++ プロジェクトに単体テストを追加する作業を行っています。技術的な理由ではないため、既存のコードを変更することはできません。私のすべてのモジュールの基本クラスには、データの設定/取得、および他のモジュールとの通信のためのメソッドがたくさんあります。

個々のモジュールごとに単体テストを行いたいだけなので、すべてのモジュール間通信方法に既定の値を使用できるようにしたいと考えています。つまり、別のモジュールがアクティブかどうかをチェックする Ping() メソッドの場合、実行しているテストの種類に基づいて true または false を返すようにしたいと考えています。私は Google Test と Google Mock を調べてきましたが、非仮想メソッドのモックをサポートしています。ただし、説明されているアプローチ ( http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods ) では、元のメソッドを「テンプレート化」して、実際のオブジェクトまたはモック オブジェクトを取り込む必要があります。前述の要件により、基本クラスでメソッドをテンプレート化することができないため、これらの仮想メソッドをモックする別の方法が必要です

基本的に、モックしたいメソッドはいくつかの基本クラスにあり、単体テストしてモックを作成したいモジュールはその基本クラスの派生クラスです。ベース Module クラスとテストしたいモジュールの間に中間モジュールがあります。

アドバイスをいただければ幸いです。

ありがとう、

JW

編集:より具体的な例

私の基本クラスはrootModuleと言えます。テストしたいモジュールはleafModuleです。rootModule を継承する中間モジュールがあり、leafModule はこの中間モジュールを継承します。

私の leafModule では、rootModule クラスで定義された非仮想 GetStatus(moduleName) を呼び出す doStuff() メソッドをテストしたいと考えています。どういうわけか GetStatus() を作成して、選択した定型値を返す必要があります。モッキングは私にとって初めてのことですが、モックオブジェクトを使用することは正しいアプローチですか?

4

3 に答える 3

14

非仮想関数を置き換える方法はいくつかあります。1 つは、それらを再宣言し、テストしたい非仮想関数の異なるセットごとに新しいテスト実行可能ファイルをコンパイルすることです。それはほとんどスケーラブルではありません。

2 番目のオプションは、テスト用に仮想化することです。ほとんどのコンパイラでは、コマンドラインで何かを定義できるため、コードを -DTEST_VIRTUAL=virtual または -DTEST_VIRTUAL でコンパイルして、テスト中かどうかに応じて仮想または通常のいずれかにします。

使用可能な 3 番目のオプションは、非仮想関数をモックできるモック フレームワークを使用することです。私は HippoMocks (中立性に関する免責事項など) の作成者であり、最近、X86 プラットフォームでプレーンな C 関数をモックする機能を追加しました。これは、少しの作業で非仮想メンバー関数に拡張でき、探しているものになります。コンパイラが関数の使用と定義の両方を一度に確認できる場合、関数がインライン化され、モックが失敗する可能性があることに注意してください。これは特に、ヘッダーで定義されている関数に当てはまります。

通常の C 関数のモックで十分な場合は、そのまま使用できます。

于 2010-05-18T13:41:46.547 に答える
2

1つのアプローチは、テスト用にさまざまなソースを指定することです。本番ターゲットが使用しているとしましょrootModule.hrootModule.cpp。テストターゲットにはさまざまなソースを使用してください。インクルードパスを変更して別のヘッダーを指定すると、#include "rootModule.h"実際にが読み込まれますunittest/rootModule.h。次に、rootModuleを心ゆくまでモックします。

于 2010-02-26T06:10:58.367 に答える