Visual Studio 2015 C++ 单元测试

Visual Studio 2015 C++ Unit Test

本文关键字:单元测试 C++ 2015 Studio Visual      更新时间:2023-10-16

我正在尝试学习如何在Visual Studio中使用单元测试与C++。

我做了一个名为Adder的超级简单的类,正如你可能猜到的那样,它添加了 2 个数字。

这是它的 .h 文件:

#ifndef ADDER
#define ADDER
class Adder {
private:
int num1, num2;
public:
Adder(int, int);
~Adder();
int add();
};
#endif

所以我用本机单元测试创建了一个新项目,并在其中引用了我的Adder项目。我不能只包含 .h 文件#include "adder.h"所以我不得不使用相对路径。我通读了Microsoft的教程,看起来你必须使用这种路径。

我的问题是我无法让单元测试识别我的 Adder 类的方法。这是我的单元测试:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../addClass/adder.h" // Added a reference but still can't find without relative path
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{       
TEST_CLASS(Adder)
{
public:
TEST_METHOD(add) {
Adder adder1(1, 1); // Won't recognize constructor
int num = adder1.add(); // Won't recognize function
Assert::AreEqual(2, num); 
}
};
}

我试图摆脱namespace UnitTest1,因为看起来Microsoft在他们的教程中没有这个。但这并没有奏效。我不确定如何让单元测试识别我的方法定义。

以防万一我在 Adder 类的实现文件中搞砸了一些东西,我会把它放在这里,但我认为这不是问题所在。

#include "adder.h"
Adder::Adder(int a=0, int b=1):num1(a), num2(b){}
Adder::~Adder(){}
int Adder::add() {
return num1 + num2;
}

编辑:这是我遇到的错误:

Unittest1.cpp 中的第 15 行:构造函数 "UnitTest1::Adder::Adder" 的实例与参数列表不匹配

Unittest1.cpp 中的第 17 行:类型为"void"的值不能用于启动类型为"int"的实体

unittest1 中的第 15 行.cpp:"UnitTest::Adder:: UnitTest1 Adder":没有重载函数需要 2 个参数

unittest1.cpp 中的第 17 行:"初始化":无法从 'void' 转换为 'int'

编辑2:

好的,所以我将单元测试文件更改为:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../addClass/adder.h" // Added a reference but still can't find without relative path
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{       
TEST_CLASS(test)
{
public:
TEST_METHOD(add) {
::Adder adder1(1,1); // recognizes constructor
int num = adder1.add(); // recognizes function
Assert::AreEqual(1, num); 
}
};
}

但是现在我收到链接器错误:

LNK2019未解析的外部符号"public: __thiscall Adder::Adder(int,int)"(??0Adder@@QAE@HH@Z) 在函数"public: void __thiscall UnitTest1::test::add(void)" (?add@test@UnitTest1@@QAEXXZ) UnitTest1 C:\Users\Matt\documents\visual studio 2015\Projects\addClass\UnitTest1\unittest1.obj

LNK2019未解析的外部符号"public: __thiscall Adder::~Adder(void)"(??1Adder@@QAE@XZ) 在函数"public: void __thiscall UnitTest1::test::add(void)" (?add@test@UnitTest1@@QAEXXZ) UnitTest1 C:\Users\Matt\documents\visual studio 2015\Projects\addClass\UnitTest1\unittest1.obj 1

LNK2019函数"public: int __thiscall Adder::add(void)"(?add@Adder@@QAEHXZ)中引用的未解析的外部符号"public: void __thiscall UnitTest1::test::add(void)" (?add@test@UnitTest1@@QAEXXZ) UnitTest1 C:\Users\Matt\documents\visual studio 2015\Projects\addClass\UnitTest1\unittest1.obj 1

我遇到了类似的问题,但使用的是应用程序类型项目(而不是 DLL 项目)。

对于在待测试项目中定义的未导出的类,您必须告诉测试器项目的链接器实现这些类。

即使在添加待测试项目作为对测试人员项目的引用后,我还必须修改测试器项目中的 Linker 选项以包含实现被测类的对象文件。

有关详细信息,请参阅使用 Microsoft 单元测试框架编写 C/C++ 的单元测试以获取C++。 特别是标题为">将测试链接到对象或库文件"的部分。

我从您所做的相同链接器错误转变为拥有有效的测试环境。 如果通过从测试项目中"引用"被测项目,它会为您处理此类事情,那就太好了。

我也遇到了这个问题。我发现了一些有效的方法,尽管我不确定这两种解决方案都是"正确"的解决方案。一种选择是在单元测试类中包含 .cpp 文件和 .h 文件。这很丑陋。

第二个有效的选项是右键单击单元测试项目,选择"添加",然后选择"现有项"。在出现的窗口资源管理器中导航到.cpp文件,然后选择"添加"。如果不希望这些源文件与单元测试源文件混合在一起,还可以创建一个新的筛选器来存储这些文件。