Visual Studio C++ 单元测试(非托管)

cp.*_*ngr 5 c++ unit-testing visual-studio vs-unit-testing-framework visual-studio-2015

我正在为一些非托管 C++ 代码设置单元测试套件,但我有一些问题。

设置

我使用Visual C++Test→将该项目添加到我的解决方案中Native Unit Test Project

本机单元测试项目创建

代码

为了弄清楚这个测试框架中的事物是如何分组的,以及什么时候运行什么初始化,我用CppUnitTest.h 顶部的unittest1.cpp修改版本替换了源文件 ( )的内容USAGE EXAMPLE

#include <CppUnitTest.h>
#include <string>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using std::string;

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


static string Indent("");

void openBlock()
{
    Logger::WriteMessage((Indent + "{").c_str());
    Indent += "  ";
}

void closeBlock()
{
    Indent.resize(Indent.size() >= 2 ? (Indent.size() - 2) : 0);
    Logger::WriteMessage((Indent + "}").c_str());
}


TEST_MODULE_INITIALIZE(ModuleInitialize)
{
    Logger::WriteMessage((Indent + "In Module Initialize").c_str());
    openBlock();
}

TEST_MODULE_CLEANUP(ModuleCleanup)
{
    closeBlock();
    Logger::WriteMessage((Indent + "In Module Cleanup").c_str());
}



TEST_CLASS(Class1)
{
public:
    Class1()
    {
        Logger::WriteMessage((Indent + "In Class1").c_str());
        openBlock();
    }
    ~Class1()
    {
        closeBlock();
        Logger::WriteMessage((Indent + "In ~Class1").c_str());
    }



    TEST_CLASS_INITIALIZE(ClassInitialize)
    {
        Logger::WriteMessage((Indent + "In Class Initialize").c_str());
        openBlock();
    }
    TEST_CLASS_CLEANUP(ClassCleanup)
    {
        closeBlock();
        Logger::WriteMessage((Indent + "In Class Cleanup").c_str());
    }


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

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

    TEST_METHOD(Method2)
    {
        Logger::WriteMessage((Indent + "In Method2").c_str());
        Assert::Fail(L"Fail");
        Logger::WriteMessage("This won't print due to failure above.");
    }
};
Run Code Online (Sandbox Code Playgroud)

输出

它生成了下面的输出。(为了清楚起见,我添加了一些换行符。)

In Module Initialize
{

  In Class Initialize
  {

    In Class1
    {
      In Method1
    }
    In ~Class1

    In Class1
    {
      In Method2
    }
    In ~Class1

  }
  In Class Cleanup

}
In Module Cleanup
Run Code Online (Sandbox Code Playgroud)

推论

由此我推断:

  • 每个TEST_MODULE包含零个或多个TEST_CLASSes。
  • 每个TEST_CLASS包含零个或多个TEST_METHODs。
  • TEST_MODULE_INITIALIZE()并且 TEST_MODULE_CLEANUP()在每个es 执行TEST_MODULE之前/之后运行一次TEST_CLASS
  • TEST_CLASS_INITIALIZE()并且TEST_CLASS_CLEANUP()在执行TEST_CLASS其系列TEST_METHODs之前/之后为每个 运行一次。
  • 每个TEST_METHOD都是 a 的一个实例TEST_CLASS。类构造函数在 之前立即执行TEST_METHOD(),类析构函数在 之后立即执行TEST_METHOD()

问题

  1. 我的推论首先正确吗?我错过了什么重要的事情吗?
  2. TEST_MODULE每个源文件是否应该/必须始终只有一个?可以TEST_MODULE在多个源文件之间拆分吗?什么是最佳实践?
  3. TEST_CLASS每个文件我可以有多个TEST_MODULE吗?是否有这方面的最佳实践?
  4. ATTRIBUTEs的目的是什么?它们是如何使用的?
  5. 这个单元测试框架的名称是什么?我可以使用哪些搜索词来了解更多信息?