既存のモノリシックな .exe ネイティブ Visual Studio 2012 プロジェクトから始めています。http://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRefによると、ネイティブの単体テスト プロジェクトを追加したいと考えています。これは、これがサポートされていることを示唆しています。
テスト対象のコードは .exe ファイルとしてビルドされます 。別のテスト プロジェクトを追加します。それを出力オブジェクト ファイルにリンクします。
テストに必要なメソッドを作成し、テスト プロジェクトをdllexport
exe プロジェクトの.lib
ライブラリにリンクすると、単純なテスト関数が機能するように見えました。しかし、もっと興味深いことを試してみるとすぐに、次のようなアクセス違反が発生し始めました。
vstest.executionengine.x86.exe の 0x04fa4aac (TestApplication.exe) での初回例外: 0xC0000005: アクセス違反の読み取り場所 0x011bf0e0。
そのため、私が収集できる最も単純な .exe と Unity Test プロジェクトのペアを使用して新しいソリューションを作成し、この呼び出し元 (単体テスト プロジェクト) と呼び出し先 (.exe プロジェクト) で例外を再現することができました。
呼び出し先 (.exe プロジェクト) Header.h
:
#include <string>
__declspec( dllexport ) std::string __cdecl strTest( std::string j );
呼び出し先 (.exe プロジェクト) Header.cpp
:
#include "Header.h"
std::string strTest( std::string j ) {
std::string output;
output += j;
output += "HAHA";
return output;
}
呼び出し元 (単体テスト プロジェクト) unittest1.cpp
:
#include "CppUnitTest.h"
#include "../TestApplication/Header.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest {
TEST_CLASS(UnitTest1) {
public:
TEST_METHOD(TestMethod1) {
std::string test = strTest( "bla " );
}
};
}
アクセス違反は、 の行std::string
によって呼び出されるコンストラクター内で常に発生します。std::string output;
strTest()
2 つのプロジェクトの設定が同一であることを確認しました (特に、呼び出し規約、最適化/デバッグ設定、ビット数、および文字セット)。また、両方のプロジェクトのプリコンパイル済みヘッダーを無効にして削除しました。
上記の関数を使用して 2 つ目の exe プロジェクトを作成し、メインの exe プロジェクトを 2 つ目の exe プロジェクトにリンクさせてみました。これは完璧に機能しました。単体テスト プロジェクトを 2 番目の exe プロジェクトにリンクしようとしたとき、メインの exe プロジェクトが機能していたのと同じ方法で、同じアクセス違反が再び発生しました。
機能した唯一のことは、私のexeプロジェクトをdllプロジェクトに変換することでした(文字通り、私のexeプロジェクトの構成タイプApplication (.exe)
をからに変更するだけDynamic Library (.dll)
です)。
問題は、Visual Studio 2012 の単体テストを使用して exe プロジェクトを単体テスト可能にすることができるか、それとも既に dll に分割し始めるべきかということです。
編集:
これについて Microsoft Connect に問題を提出したところ、実際にはバグであると言われました: https://connect.microsoft.com/VisualStudio/feedback/details/804696/linking-visual-studio-2012-c-unit-testing -project-against-an-exe-causes-access-violations
VMware Workstation 9 仮想マシン上の Windows 7 Pro x64 SP1 および Windows 8.1 Pro Preview x64 の完全な新規インストールにアタッチした同じソリューションを使用して、さらにいくつかのテストを行いました。すべての Windows 更新プログラムと特定の Visual Studio だけが各テスト用にインストールされました。テストの合間には常にクリーンなスナップショットに戻りました。また、すべての Visual Studio をすべて既定の設定で実行しました。
Windows 7 では、試したすべての操作で同じアクセス違反が発生しました。私は私の解決策を試しました:
- Visual Studio Express 2012 for Windows デスクトップ (Update 2 付き)
- Visual Studio Express 2012 for Windows デスクトップ (Update 3 付き)
- Visual Studio 2012 Ultimate w/ Update 3
- Visual Studio 2013 RC プロフェッショナル
Windows 8.1 では、Visual Studio Express 2012 for Windows Desktop with Update 3 を使用して、単体テストはすべて正常に実行されました。Windows 7 で試した他の組み合わせはすべて 8.1 でも問題なく動作すると思います。
Windows 7 に戻って、x86 から x64 プラットフォームに切り替え、テスト設定の既定のプロセッサ アーキテクチャを X64 に設定すると、同じテストに合格しました。アクセス違反がなくなりました。
したがって、これはおそらく (Windows 7/x86 プラットフォーム) 固有の問題です。
また、アクセス違反に関しては、必ずしも優雅であるとは限りません。また、「vstest.executionengine.x86.exe が動作を停止しました」というダイアログ ボックスに、次の問題の詳細が表示されることもあります。
Problem signature:
Problem Event Name: BEX
Application Name: vstest.executionengine.x86.exe
Application Version: 12.0.20827.3
Application Timestamp: 521cc637
Fault Module Name: StackHash_9321
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Offset: 00ae9998
Exception Code: c0000005
Exception Data: 00000008
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 9321
Additional Information 2: 9321642ea520dd869526c054c7161ae9
Additional Information 3: bfae
Additional Information 4: bfaed60192419c1d7d34eac41dbe71a8