VisualStudio2012でテスト

# 環境
Windows7 64bit版
Microsoft Visual Studio Professional 2012

# テストの作成
UnitTestをインクルード/リンクしてdllを作ればやり方はなんでもよい。

1. 「Win32コンソールアプリケーション」のプロジェクトを新規作成し、DLLを選択する。
1. **C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\UnitTest\include** 以下のファイルをコピーしてプロジェクトへ追加。
    * CppUnitTest.h
    * CppUnitTestAssert.h
    * CppUnitTestCommon.h
    * CppUnitTestException.h
    * CppUnitTestLogger.h
        * Source.cppと同じ場所にコピーすればインクルードパスの設定は必要ない。
1. **C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\UnitTest\lib** 以下のファイルをコピーしてプロジェクトへ追加。
    * amd64/Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib
    * arm/Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib
    * Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib
        * 「追加のライブラリディレクトリ」へ追加したディレクトリへのパスを追加。
        * 例えば、Source.cppと同じ場所に「lib」という名前のディレクトリを作成しそこへコピーした場合は「lib」と設定。
1. Source.cppを以下のように修正(CppUnitTest.hのUSAGE EXAMPLEとほぼ同一)してビルド。

```cpp:Source.cpp
#include "CppUnitTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;


BEGIN_TEST_MODULE_ATTRIBUTE()
	TEST_MODULE_ATTRIBUTE(L"Date", L"2010/6/12")
END_TEST_MODULE_ATTRIBUTE()


TEST_MODULE_INITIALIZE(ModuleInitialize)
{
	Logger::WriteMessage("In Module Initialize");
}

TEST_MODULE_CLEANUP(ModuleCleanup)
{
	Logger::WriteMessage("In Module Cleanup");
}



TEST_CLASS(Class1)
{
public:
	Class1()
	{
		Logger::WriteMessage("In Class1");
	}
	~Class1()
	{
		Logger::WriteMessage("In ~Class1");
	}

  

	TEST_CLASS_INITIALIZE(ClassInitialize)
	{
		Logger::WriteMessage("In Class Initialize");
	}
	TEST_CLASS_CLEANUP(ClassCleanup)
	{
		Logger::WriteMessage("In Class Cleanup");
	}

	
	BEGIN_TEST_METHOD_ATTRIBUTE(Method1)
        TEST_OWNER(L"OwnerName")
        TEST_PRIORITY(1)
	END_TEST_METHOD_ATTRIBUTE()

	TEST_METHOD(Method1)
	{   
		Logger::WriteMessage("In Method1");
        Assert::AreEqual(0, 0);
	}

	TEST_METHOD(Method2)
	{
		// 必ず失敗
		Assert::Fail(L"Fail");
	}
};

```

# テストの実行
VisualStudioのメニューから「テスト」>「ウィンドウ」>「テストエクスプローラー」を選択すると、
以下のようなウィンドウが表示される。
![未処理.png](https://qiita-image-store.s3.amazonaws.com/0/119600/40119536-5d19-64b2-65e7-f6d1050da26b.png)

「すべて実行」を選択すると、Method1とMethod2のテストが実行される。
結果は以下のように表示される。

![実行済み.png](https://qiita-image-store.s3.amazonaws.com/0/119600/c209a1cf-e651-619b-4475-724da3a77fb5.png)

## 64ビットテストを32ビットプロセスで実行することはできません。
64ビットのアプリをテストした際に上記のように警告が出てしまう場合は、
メニューの「テスト」>「テスト設定」>「既定のプロセッサアーキテクチャ」>「x64」
を選択すれば実行可能になる。

# テストの実行(コンソール)

バッチファイルを実行して環境変数を設定し、vstest.console.exe を実行する。
x64の場合、 **/Platform:x64** と指定する。

```
> "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\vcvars64.bat"
> vstest.console.exe /Platform:x86 /InIsolation ConsoleApplication1.dll
```

* /Platform
    * プラットフォームの種類。 x64/x86/ARM がある。
* /InIsolation
    * 分離プロセスでテスト。警告が出ていたので指定。
* ConsolaApplication1.dll
    * テスト対象。

## コンソールでのテスト実行結果

![コンソール失敗.png](https://qiita-image-store.s3.amazonaws.com/0/119600/4f881551-2098-6867-4338-cc4f86018a02.png)

テストが成功するようにするには、
Source.cppの61行目をコメントアウトし、再度ビルド＆テスト。

```cpp:Source.cpp
TEST_METHOD(Method2)
{
    // 必ず失敗
    //Assert::Fail(L"Fail");
}
```

![コンソール成功.png](https://qiita-image-store.s3.amazonaws.com/0/119600/4203853f-3979-5076-c045-465841228aca.png)

# 参考
[VSTest.Console.exe のコマンド ライン オプション](https://msdn.microsoft.com/ja-jp/library/jj155796.aspx)