31

Visual Studio 2008 を使用して C++ アプリケーションを開発し、Boost.Test を使用して単体テストを行います。現時点では、単体テストを含む別のソリューションがあります。

コア ソリューションのプロジェクトの多くは、DLL を生成します。エクスポートされていないクラスをテストできないため、テスト範囲が限られています。

これらをテストする方法について、2 つのアイデアがあります。

  1. すべてをエクスポート
  2. テストを DLL 内に配置し (同じプロジェクトとソリューション)、Boost.Test の外部ランナーを使用します。

欠点が何であるかは完全にはわかりません。上記の番号 1 は、モジュール レベルのカプセル化を破り、番号 2 は、特定の構成にのみテスト コードを含めることが可能でない限り、はるかに大きな DLL になる可能性があります。

では、上記の方法には重大な欠点がありますか、それとも他の解決策を考えられますか?

4

4 に答える 4

16

この質問に対する Tom Quarendon の回答を拡張して、Simon Steele の回答のわずかな変形を使用しました。

  • テスト プロジェクトを作成します (好きなテスト フレームワークを使用します。私はCppUnitを使用します)。
  • あなたのtest_case.cppで、#include <header/in/source/project.h>.
  • テスト プロジェクトのプロパティ:
    • Linker->General で、ソース プロジェクト$(IntDir)を追加のライブラリ ディレクトリに追加します。
    • Linker->Input で、.objファイルを追加の依存関係に追加します。
  • [プロジェクト] -> [プロジェクトの依存関係] で、テスト プロジェクトからソース プロジェクトに依存関係を追加します。

繰り返しになりますが、唯一のメンテナンス オーバーヘッドは、ユニット テストの標準的なものです。つまり、テストするユニットへの依存関係を作成するためです。

于 2014-06-17T17:02:02.757 に答える
4

これに使用する解決策は、エクスポートされていない同じコードをテスト DLL にもビルドすることです。これにより、ビルド時間が長くなり、両方のプロジェクトにすべてを追加することになりますが、すべてをエクスポートしたり、テストをメインの製品コードに入れたりする手間が省けます。

もう 1 つの可能性は、エクスポートされていないコードを、エクスポートを含む DLL と単体テスト プロジェクトの両方で使用される lib にコンパイルすることです。

于 2011-03-31T08:16:08.183 に答える
2

解決策も探していましたが、次のほうが維持しやすいかもしれません。

「ユニット テスト デバッグ」などの新しいビルド構成を DLL プロジェクトに追加し、構成タイプを「静的ライブラリ .lib」に変更します (「一般」->「構成タイプ」)。

次に、このプロジェクトに単体テストの依存関係を追加するだけで、新しいビルド構成「単体テスト デバッグ」を使用すると、すべてがリンクするようになります。単体テストにリリース ビルドを使用している場合は、リリースの最適化を使用して別の構成を追加する必要があります。

したがって、このソリューションの利点は次のとおりです。

  • 低保守コスト
  • 単一の DLL/静的ライブラリ プロジェクト
  • .obj ファイルに手動でリンクする必要はありません

欠点:

  • 追加の構成プロファイルでは、ビルド環境 (CI) でいくつかの変更が必要になります
  • コンパイル時間の増加

更新: 実際には、別のアプローチを使用することになりました。

既存のすべてのプロジェクトに、新しい「テスト デバッグ」/「テスト リリース」構成を追加しました。

.exe/.dll プロジェクトの場合、元の main.cpp のコンパイルを無効にし、テスト フレームワーク (gtest など) をインスタンス化してすべてのテストを実行するものに置き換えました。通常の構成 (リリース/デバッグ) でコンパイルし、テスト構成でのみ有効にします。

.lib プロジェクトには、新しい「テスト デバッグ」/「テスト リリース」構成もあり、そこでスタティック ライブラリを .exe ファイルに変換し、テスト フレームワークをインスタンス化してテストとテスト自体を実行する main.cpp を提供します。テスト関連のファイルは、リリース/デバッグ構成でのコンパイルから除外されます。

于 2015-08-25T12:40:08.083 に答える
0

すべてのファイルが含まれる場所で、次のような定義を作成してみてください。

#define EXPORTTESTING __declspec(dllexport)

次のように、dllexport の代わりに使用します。

class EXPORTTESTING Foo 
{
 ...
};

その後、リリース DLL をビルドするためのフラグをオフにすることができますが、単体テスト可能な DLL についてはオンのままにします。

于 2013-01-17T20:30:02.770 に答える