Visual Studio 2019中的C++单元测试

Visual Studio 2019中的C++单元测试,c++,unit-testing,oop,visual-studio-2019,C++,Unit Testing,Oop,Visual Studio 2019,我在Visual Studio UnitTestFramework中遇到问题。我按照指示去做,但每次我都会出错。我一直在寻找教程,但我得到的任何东西都是针对Visual Studio 2017的,它并不能解决我的问题 我正在编写一个程序,使用C++中的OOP,我想做单元测试,因为这是一个相当长的项目。我遇到的问题是程序没有在测试模块中编译 假设我有代码,这样我就有了头文件: //A.h #pragma once class A { private: // One parameter.

我在Visual Studio UnitTestFramework中遇到问题。我按照指示去做,但每次我都会出错。我一直在寻找教程,但我得到的任何东西都是针对Visual Studio 2017的,它并不能解决我的问题

我正在编写一个程序,使用C++中的OOP,我想做单元测试,因为这是一个相当长的项目。我遇到的问题是程序没有在测试模块中编译

假设我有代码,这样我就有了头文件:

//A.h
#pragma once
class A
{
private:
   // One parameter.
   int a;

public:

   // Add function.
   int add(int, int);

   // Subtract function.
   int subtract(int, int);

   A();
};
使用正确的源文件:

// A.cpp
#include "A.h"
int a;

int A::add(int alpha, int beta)
{
    return alpha + beta;
}

int A::subtract(int alpha, int beta)
{
    return alpha - beta;
}

A::A()
{
    a = 4;
}
程序的结构如下所示:

要进行单元测试,我右键单击解决方案“TestUnit”标签并选择new project,查找单元测试,添加单元测试并附加引用,这样我就得到了一个文件结构,如下面所示:

要执行单元测试,我编写以下代码:

// TestUnitForTestTestUnit.cpp
#include "pch.h"
#include "CppUnitTest.h"

#include "../TestTestUnit/A.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace TestUnitForTestTestUnit
{
   TEST_CLASS(TestUnitForTestTestUnit)
   {
   public:
    
      TEST_METHOD(TestMethod1)
      {
         A first;
         Assert::AreEqual(first.add(3, 2), 5);
      }
   };
}
当我尝试运行测试时,测试资源管理器什么也不做,并抛出消息:由于构建失败而中止测试运行。请查看构建以了解更多详细信息

我在这里找不到错误。程序运行正常,但当实例化一个新对象时,测试失败。我被困在这里了,有什么建议吗?除了在Windows中开发外,我还做错了什么

更新:

我按照@ChrisMM的建议删除了名称空间,因此测试文件现在的内容如下:

// TestUnitForTestTestUnit.cpp
#include "pch.h"
#include "CppUnitTest.h"

#include "../TestTestUnit/A.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

TEST_CLASS(TestUnitForTestTestUnit)
{
public:
    
   TEST_METHOD(TestMethod1)
   {
      A first;
      Assert::AreEqual(first.add(3, 2), 5);
   }
};
这样,当我运行测试资源管理器时,会给出相同的消息:

出现错误消息:

1>------ Build started: Project: TestUnitForTestTestUnit, Configuration: Debug Win32 ------
1>   Creating library C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.lib and object C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.exp
1>TestUnitForTestTestUnit.obj : error LNK2019: unresolved external symbol "public: int __thiscall A::add(int,int)" (?add@A@@QAEHHH@Z) referenced in function "public: void __thiscall TestUnitForTestTestUnit::TestMethod1(void)" (?TestMethod1@TestUnitForTestTestUnit@@QAEXXZ)
1>TestUnitForTestTestUnit.obj : error LNK2019: unresolved external symbol "public: __thiscall A::A(void)" (??0A@@QAE@XZ) referenced in function "public: void __thiscall TestUnitForTestTestUnit::TestMethod1(void)" (?TestMethod1@TestUnitForTestTestUnit@@QAEXXZ)
1>C:\Users\<user>\Desktop\CPlusPlus\TestTestUnit\Debug\TestUnitForTestTestUnit.dll : fatal error LNK1120: 2 unresolved externals
1>Done building project "TestUnitForTestTestUnit.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

非常感谢您的帮助。

您不能将测试类放入命名空间中。从

TEST_类必须在命名空间范围内声明


我建议您检查TestUnitForTestUnit是否添加了其他依赖项。当我没有添加它时,出现了与您相同的问题。在我添加它之后,程序运行得很好

右键单击TestUnitForTestUnit->Properties->C/C++->Linker->Input->Additional Dependencies->add..\TestUnit\Debug\*.obj


您好,如果您能提供一个更好的例子,我们将不胜感激。正如我已经指出的,我已经尝试了你提供的链接中的所有链接。即使在同一名称空间中同时定义test和source+头文件,我也可能做得不对。非常感谢。@AGEscovar,没有可提供的示例。您不能将测试类放在名称空间中。您的位于TestUnitForTestUnit内,只需去掉名称空间即可。我已经这样做了好几次,但它仍然抛出相同的错误。我不知道该怎么做。@AGEscovar,测试资源管理器找不到任何测试,因为它无法生成。如果您已经删除了名称空间,那么您需要提供错误。我刚刚在删除名称空间后用错误消息更新了帖子。非常感谢,谢谢!工作得很好!我对这个答案的感激之情再怎么强调也不为过。MS应该在他们的教程和文档中升级他们的游戏,在当前状态下很糟糕!