unittest1.cpp
#include "stdafx.h"
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
#include
using namespace std;
TEST_MODULE_INITIALIZE(ModuleInitialize)
{
Logger::WriteMessage("In Module Initialize");
}
TEST_MODULE_CLEANUP(ModuleCleanup)
{
Logger::WriteMessage("In Module Cleanup");
}
/*
第一次运行本unit test, 使用Ctrl+R+A 运行全部测试.
以后你可以在Test Explorer窗口中运行指定的测试函数.
*/
namespace KagulaUnitTest
{
//模拟我的第一个待测试的function集合
TEST_CLASS(myFirstFunctionSetForTest)
{
public:
TEST_METHOD(TestMethod1)
{
//运行unit test不会打开控制台窗口, 所以你也不会看到下面这条代码的任何std输出.
cout << "hello,World!" << endl;
}
TEST_METHOD(TestMethod2)
{
//模拟耗时的操作.
for (size_t i = 0; i < 1000; i++)
{
if ((i % 100) == 0)
{
//VisualStudio2017Update7.1有个很严重的缺陷,有时候,你改了代码,但是使用Test Explorer中的"Run selected Tests"菜单项,
//运行的还是老的代码, 这时候, 你得rebuild solution后再运行.
//所以修改代码后, 修改下面的字符串输出, 从output窗口中查看是不是修改已经生效很重要.
Logger::WriteMessage("d.");
}
}//for
}//test method
};//test class
//模拟我的第二个待测试的function集合
TEST_CLASS(mySecondFunctionSetForTest)
{
public:
//Assert的具体用法参考下面的地址
//https://docs.microsoft.com/en-us/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference#general_asserts
TEST_METHOD(TestMethod2_1)
{
Logger::WriteMessage("TestMethod2_1");
int expected = 0;
int actual = 0;
Assert::AreEqual(expected, actual);
Assert::AreEqual(expected, actual, L"are not equal assert!");
}
TEST_METHOD(TestMethod2_2)
{
Logger::WriteMessage("TestMethod2_2");
Assert::Fail(L"Fail");
}
};
}
Output子窗口,Show output from下拉框选项改为Tests,然后你就可以看到单元测试项目的输出。
Step1:
建个简单的console程序c++项目,用来模拟已经存在的EXE程序项目我写了个很简单的代码Source.cpp
#include
using namespace std;
//这个函数用来演示你写的函数如何被"单元测试"工具调用
int myFunction()
{
return 1;
}
int main(int argc, char* argv[])
{
cout << "hello, World!" << endl;
return 0;
}
如果没有“C++ Unit Test”模板,就添加个普通的cpp文件
Test.cpp
//若不需要单元测试,把UNIT_TEST宏注释掉就可以了!
//否则exe程序会去找我们不需要的unit test依赖的dll.
#define UNIT_TEST
#ifdef UNIT_TEST
#include
//假设这是我待做unit test测试的函数.begin
extern int myFunction();
//假设这是我待做unit test测试的函数.end
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");
}
/*
第一次运行本unit test, 使用Ctrl+R+A 运行全部测试.
以后你可以在Test Explorer窗口中运行指定的测试函数.
*/
namespace KagulaUnitTest
{
TEST_CLASS(myFunctionSetForTest)
{
public:
//Assert的具体用法参考下面的地址
//https://docs.microsoft.com/en-us/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference#general_asserts
TEST_METHOD(TestMethod2_1)
{
Logger::WriteMessage("TestMethod1");
int expected = 0;
int actual = myFunction();
Assert::AreEqual(expected, actual, L"are not equal assert!");
}
};
}
#endif
Step4:
我这个项目,由两个原文件组成,源码内容如下
CDemoLib.h
#ifndef _LIB_H_
#define _LIB_H_
#ifdef _WIN32
#ifdef _WINDLL //VC2017新建项目后,改生成方式为dll, 会自带这个宏定义.
#define LIB_API extern "C" __declspec(dllexport)
#else
#define LIB_API extern "C" __declspec(dllimport)
#endif
//我不喜欢编写非C语言风格的接口供调用者使用, 除非时间紧.
#ifdef _WINDLL
#define CLASS_EXPORT __declspec(dllexport)
#else
#define CLASS_EXPORT __declspec(dllimport)
#endif
#else
//非Windows环境不需要那么麻烦直接定一个空白的就可以了.
#define LIB_API
#endif
LIB_API int add(int x, int y);
class CLASS_EXPORT MyDemoClass
{
public:
int add(int a, int b);
};
#endif
CDemoLib.cpp
#include "CDemoLib.h"
int add(int x, int y)
{
return x + y;
}
int MyDemoClass::add(int a, int b)
{
return a + b;
}
这个项目只有一个源文件,清单如下:
#include "stdafx.h"
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
#include "../UnitTest3/CDemoLib.h"
//添加All Configuration 库文件搜索路径: $(SolutionDir)$(Configuration);
#pragma comment(lib, "UnitTest3.lib")
namespace MyUnitTester
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
Logger::WriteMessage("MyUnitTester....");
int expect = 0;
int actual = add(0, 0);
//C风格接口 测试
Assert::AreEqual(expect, actual, L"are not equal assert!");
MyDemoClass mdc;
actual = mdc.add(0, 0);
//C++风格接口 测试
Assert::AreEqual(expect, actual, L"are not equal assert!");
}
};
}
Final Step:
然后你就可以Ctrl+R+A运行单元测试了。