4

既存のモノリシックな .exe ネイティブ Visual Studio 2012 プロジェクトから始めています。http://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRefによると、ネイティブの単体テスト プロジェクトを追加したいと考えています。これは、これがサポートされていることを示唆しています。

テスト対象のコードは .exe ファイルとしてビルドされます 。別のテスト プロジェクトを追加します。それを出力オブジェクト ファイルにリンクします。

テストに必要なメソッドを作成し、テスト プロジェクトをdllexportexe プロジェクトの.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 では、試したすべての操作で同じアクセス違反が発生しました。私は私の解決策を試しました:

  1. Visual Studio Express 2012 for Windows デスクトップ (Update 2 付き)
  2. Visual Studio Express 2012 for Windows デスクトップ (Update 3 付き)
  3. Visual Studio 2012 Ultimate w/ Update 3
  4. 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
4

0 に答える 0