2011-07-21 3 views
1

私は、vC++ 6.0で書かれた大きなコードベースを管理することに専念しています。コードの一部に対してユニットテストを構築する必要があります。私はCPPUnitをセットアップして、私のプロジェクトで動作します。私が直面している問題のDLLは次のとおりです。従来のアプリケーションは、10個の静的ライブラリと99%のコードを含む1つの巨大な実行可能なMFCアプリケーションで構成されています。私の単体テストフレームワークは同じワークスペース内の別のプロジェクトで実行されており、10のライブラリをテストします。すべての問題はありません。参照は大丈夫です。大型MFCアプリケーションで同じことをしようとすると、アプリケーション用のDLL。テストコードをアプリケーションの内部に直接入れないで、アプリケーションを単体テストする方法はありますか?ユニットCPPUnitでレガシーC++コードをテストする

答えて

1

あなたは、あなたがそうであるように続けていく必要があります。

  1. あなたはライブラリを参照する一つのテストアプリケーションを持っています。
  2. これらのライブラリも参照する1つのメインアプリケーションがあります。

コードをメインアプリケーションから既存のライブラリに移動するか、コードを新しいライブラリに移動することをお勧めします。テストアプリケーションは、アプリケーションを参照することなく、より多くのコードにアクセスできます。

アプリケーションのソースが、main()を定義する1つのモジュールと、テストアプリケーションによってテストされるライブラリ内のすべてのもので構成されている場合は、いつ完了したかを知っています。

0

実行可能ファイルとリンクする方法はわかりません。ビジネスロジックをDLLに移動し、アプリケーションを「フロントエンド」として残すことでコードをリファクタリングすることが最も明白な解決策になります。ただし、レガシーコードであるため、単体テストの目的でコードを単純に複製する方が適切です。これは理想的ではなく、MFCアプリケーションであるため簡単ではないかもしれません。

+1

user655261ライブラリをリファクタリングしてコードを移動しようとします。 @チャドはコピーコードの部分に同意しない。私はこの方法でユニットテストが意味を失うと思っています... –

+1

私は必ずしもそれに同意するわけではありませんが、 "レガシーコード"を与えても、リファクタリングはほとんど常に嫌われています。 – Chad

+1

ユニットテスト*を*リファクタリングする前に、それらを貴重なテストにしています! –

1

私のユニットテストの経験は、通常は逆です。テスト用のプロジェクトを作成し、他のプロジェクトからコードをインポートします。

おそらく関数がエクスポートされていないため、MFCアプリケーションにリンクできません。それらは存在しますが、DLLとは異なり、他のアプリケーションと通信する手段はありません。

0

メインアプリケーションをテストするには、テストするソースファイルを含むテストプロジェクトを設定できます。これは、VC6でどれほど簡単に達成できるかわからないのですが、VS2005以降ではかなり簡単です。

だからあなたのソリューションでは、あなたがこのような構造で終わる:何らかの理由であなたは2つのプロジェクトでソースファイルを含めることができない場合

MyLegacySystem.sln 
    MyApplication.proj 
    Main.cpp 
    BusinessRules.cpp 
    MyApplicationUnitTests.proj 
    UnitTestsMain.cpp 
    BusinessRules.cpp 
    BusinessRulesTests.cpp 

、あなたが呼び出すことによって、あなたのテストプロジェクトにソースを引くことができますプリプロセッサマジック:

BusinessRulesStub.cpp: 
#include "..\src\BusinessRules.cpp" 

ただし、これは基本的には一時的な修正です。すでに提案したように、コードのほとんどは別々のライブラリに展開されるべきです。

0

プロジェクトをリファクタリングしてビジネスロジックを新しい静的ライブラリに移動できない場合は、テストプロジェクトをプロジェクトの中間オブジェクトファイルにリンクしてみてください。これはBigProject \ debugまたはBigProject \ debug \ obj 。あなたが発見したように.EXEにリンクすることはできません。

これは、実際にソースコードが重複するのを避けながら、チャドが提案したコピープロセスと同じ結果をもたらします。これは本当に悪いことです。

関連する問題