私は、vC++ 6.0で書かれた大きなコードベースを管理することに専念しています。コードの一部に対してユニットテストを構築する必要があります。私はCPPUnitをセットアップして、私のプロジェクトで動作します。私が直面している問題のDLLは次のとおりです。従来のアプリケーションは、10個の静的ライブラリと99%のコードを含む1つの巨大な実行可能なMFCアプリケーションで構成されています。私の単体テストフレームワークは同じワークスペース内の別のプロジェクトで実行されており、10のライブラリをテストします。すべての問題はありません。参照は大丈夫です。大型MFCアプリケーションで同じことをしようとすると、アプリケーション用のDLL。テストコードをアプリケーションの内部に直接入れないで、アプリケーションを単体テストする方法はありますか?ユニットCPPUnitでレガシーC++コードをテストする
答えて
あなたは、あなたがそうであるように続けていく必要があります。
- あなたはライブラリを参照する一つのテストアプリケーションを持っています。
- これらのライブラリも参照する1つのメインアプリケーションがあります。
コードをメインアプリケーションから既存のライブラリに移動するか、コードを新しいライブラリに移動することをお勧めします。テストアプリケーションは、アプリケーションを参照することなく、より多くのコードにアクセスできます。
アプリケーションのソースが、main()
を定義する1つのモジュールと、テストアプリケーションによってテストされるライブラリ内のすべてのもので構成されている場合は、いつ完了したかを知っています。
実行可能ファイルとリンクする方法はわかりません。ビジネスロジックをDLLに移動し、アプリケーションを「フロントエンド」として残すことでコードをリファクタリングすることが最も明白な解決策になります。ただし、レガシーコードであるため、単体テストの目的でコードを単純に複製する方が適切です。これは理想的ではなく、MFCアプリケーションであるため簡単ではないかもしれません。
私のユニットテストの経験は、通常は逆です。テスト用のプロジェクトを作成し、他のプロジェクトからコードをインポートします。
おそらく関数がエクスポートされていないため、MFCアプリケーションにリンクできません。それらは存在しますが、DLLとは異なり、他のアプリケーションと通信する手段はありません。
メインアプリケーションをテストするには、テストするソースファイルを含むテストプロジェクトを設定できます。これは、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"
ただし、これは基本的には一時的な修正です。すでに提案したように、コードのほとんどは別々のライブラリに展開されるべきです。
プロジェクトをリファクタリングしてビジネスロジックを新しい静的ライブラリに移動できない場合は、テストプロジェクトをプロジェクトの中間オブジェクトファイルにリンクしてみてください。これはBigProject \ debugまたはBigProject \ debug \ obj 。あなたが発見したように.EXEにリンクすることはできません。
これは、実際にソースコードが重複するのを避けながら、チャドが提案したコピープロセスと同じ結果をもたらします。これは本当に悪いことです。
- 1. CppUnitでスタティック関数をテストする
- 2. レガシーCコードをMVCデザインにリファクタリングする
- 3. CppUnitのC++リンカエラー
- 4. C#ユニットStreamWriterパラメータをテストします。
- 5. ユニットをAngularJSでコントローラを定義するユニットをテストする
- 6. intern.jsレガシー非モジュラーコードをテストする方法
- 7. ユニットがobj-cでシングルトンをテストする方法は?
- 8. ユニットRegistryManagerを使用するクラスをテストするC#Azure IoTHub
- 9. どのユニットは、次のコードをテストする方法方法
- 10. Androidユニットのテスト - コードがアンドロイドクラスを参照するときのベストプラクティス
- 11. ユニット - NUnitでアクションをテストする
- 12. ユニットをrhinoモックで汎用テストする
- 13. @RequestBodyでエンドポイントをテストするユニット
- 14. テスト/ユニットでRuntimeErrorをチェックする方法
- 15. ユニットでJavaクライアント/サーバーアプリケーションをテストする
- 16. ユニットでASP.net MVCのHtmlHelperをテストする
- 17. ユニットをASP.NET MVC 2でテストする
- 18. ユニットBroadcastReceiverのテスト
- 19. Grailsユニット/ intergrationテスト
- 20. (C)ユニットとユニット自体のユニットテストの組み合わせをテストしますか?
- 21. 問題ユニット単体テストでのテスト
- 22. ユニット・テストOracle PL/SQL
- 23. Jamineユニット・テスト・エラーが
- 24. ユニットと統合テスト
- 25. ユニット・テスト・ツールSybaseデータベース
- 26. PHP言語(ユニット)テスト
- 27. ユニットWCFビヘイビアエクステンションのテスト
- 28. ユニットのMvvmCross.Droid.Viewのテスト
- 29. ユニットをHttpModuleでテストしています
- 30. Silverlight(C#)とレガシーASP.NET(VB.NET)コードを使用したMasterpage
user655261ライブラリをリファクタリングしてコードを移動しようとします。 @チャドはコピーコードの部分に同意しない。私はこの方法でユニットテストが意味を失うと思っています... –
私は必ずしもそれに同意するわけではありませんが、 "レガシーコード"を与えても、リファクタリングはほとんど常に嫌われています。 – Chad
ユニットテスト*を*リファクタリングする前に、それらを貴重なテストにしています! –