如何使用 Visual Studio CppUnitTestFramework 访问我的代码
How to access my code using Visual Studio CppUnitTestFramework
我想对我的代码进行单元测试。这是我已经编写的代码的任务中的专有步骤。
我正在使用 VS Community 2017 v.15.9.7。我已按照本网站的说明逐行进行了最详细的说明:
https://blogs.msdn.microsoft.com/vcblog/2017/04/19/cpp-testing-in-visual-studio/#Setup
但是在所有包含之后我得到了两个错误:
1) 错误 LNK1120 1 未解决的外部 UnitTest1 \source\repos\Primes\Debug\UnitTest1.dll 1
2) 错误 LNK2019 未解析的外部符号 "public: bool __thiscall SearchPrimes::IsPrime(int)" (?IsPrime@SearchPrimes@@QAE_NH@Z) 在函数 "public: void __thiscall UnitTest1::TestClass::IsOdd(void)" (?IsOdd@TestClass@UnitTest1@@QAEXXZ) 中引用) UnitTest1 C:\Users\Velzevoul\source\repos\Primes\UnitTest1\unittest1.obj
我试过移动文件,但我认为随意移动它们弊大于利。我读到有关将 "stdafx.h" 包括到我的 "source" 中的信息,但这让事情变得更糟,因为不断出现更多错误。
下面是我写的代码的头文件:
#pragma once
#include <vector>
#include "XMLParser.h"
class SearchPrimes
{
public:
std::vector<int> RangePrime(const std::pair<int, int>&);
//Setting the range to search for prime numbers, executing the algorithm
bool IsPrime(int); //The algorithm that checks if a number is prime
bool IsOdd(int); //Checking if a number if even or odd
};
#pragma once
#include <iostream>
#include <vector>
class XMLParser
{
public:
void removeTags(std::string&); //Removing the brackets of the tags of the .xml
std::string openFile(std::string); //Opening a file
std::vector<std::string> readFile(const std::string&, std::string);
//Getting the text from the .xml file to a vector
std::vector<std::pair<int, int> > stringsToInts();
//Finding the values of the tags that contain the ranges
//and converting the string numbers to a vector<int>
};
这是test.cpp
#include "stdafx.h"
#include "CppUnitTest.h"
#include "/Users/Velzevoul/source/repos/Primes/Primes/SearchPrimes.h"
#include "/Users/Velzevoul/source/repos/Primes/Primes/XMLParser.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(TestClass)
{
public:
TEST_METHOD(IsOdd)
{
SearchPrimes prime;
Assert::IsTrue(prime.IsPrime(4));
}
};
}
我需要做什么来解决外部依赖?文章说,一旦我按照这些步骤操作,我就可以开始了。正如文章所建议的,该测试在一个单独的项目中。如果您认为问题可能与我的 main() 函数有关,请告诉我将其包括在内。我现在不这样做,因为它很长。
提前感谢您的宝贵时间!
那篇文章建议您可以像 DLL 一样 link 到 Windows 可执行文件。我想这在理论上是可能的,如果您的可执行文件已设置为导出其功能,但这似乎是一件奇怪的事情。
在 C++ 单元测试项目中访问被测代码有两种选择:
- 将源模块 (.cpp/.h) 添加到您的单元测试项目。
- Link 包含代码的库。
如果您的项目相对简单,只有几个 .cpp 模块,那么选项 1 可能是可行的方法。右键单击您的单元测试项目,select "Add -> Existing Item..." 并添加您要测试的 .cpp 模块。
对于包含许多源模块的更复杂的项目,选项 2 可能是更好的选择。创建一个或多个库项目(静态或动态)以包含您的源模块,然后 link 包含库的可执行项目和单元测试项目。
一个好的做法是为每个要测试的项目创建一个单元测试项目。给单元测试项目一个名称,表明它正在测试什么项目,即 MyExecutable
和 MyExecutable.Test
、MyLibrary
和 MyLibrary.Test
等
我想对我的代码进行单元测试。这是我已经编写的代码的任务中的专有步骤。
我正在使用 VS Community 2017 v.15.9.7。我已按照本网站的说明逐行进行了最详细的说明: https://blogs.msdn.microsoft.com/vcblog/2017/04/19/cpp-testing-in-visual-studio/#Setup
但是在所有包含之后我得到了两个错误:
1) 错误 LNK1120 1 未解决的外部 UnitTest1 \source\repos\Primes\Debug\UnitTest1.dll 1
2) 错误 LNK2019 未解析的外部符号 "public: bool __thiscall SearchPrimes::IsPrime(int)" (?IsPrime@SearchPrimes@@QAE_NH@Z) 在函数 "public: void __thiscall UnitTest1::TestClass::IsOdd(void)" (?IsOdd@TestClass@UnitTest1@@QAEXXZ) 中引用) UnitTest1 C:\Users\Velzevoul\source\repos\Primes\UnitTest1\unittest1.obj
我试过移动文件,但我认为随意移动它们弊大于利。我读到有关将 "stdafx.h" 包括到我的 "source" 中的信息,但这让事情变得更糟,因为不断出现更多错误。
下面是我写的代码的头文件:
#pragma once
#include <vector>
#include "XMLParser.h"
class SearchPrimes
{
public:
std::vector<int> RangePrime(const std::pair<int, int>&);
//Setting the range to search for prime numbers, executing the algorithm
bool IsPrime(int); //The algorithm that checks if a number is prime
bool IsOdd(int); //Checking if a number if even or odd
};
#pragma once
#include <iostream>
#include <vector>
class XMLParser
{
public:
void removeTags(std::string&); //Removing the brackets of the tags of the .xml
std::string openFile(std::string); //Opening a file
std::vector<std::string> readFile(const std::string&, std::string);
//Getting the text from the .xml file to a vector
std::vector<std::pair<int, int> > stringsToInts();
//Finding the values of the tags that contain the ranges
//and converting the string numbers to a vector<int>
};
这是test.cpp
#include "stdafx.h"
#include "CppUnitTest.h"
#include "/Users/Velzevoul/source/repos/Primes/Primes/SearchPrimes.h"
#include "/Users/Velzevoul/source/repos/Primes/Primes/XMLParser.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(TestClass)
{
public:
TEST_METHOD(IsOdd)
{
SearchPrimes prime;
Assert::IsTrue(prime.IsPrime(4));
}
};
}
我需要做什么来解决外部依赖?文章说,一旦我按照这些步骤操作,我就可以开始了。正如文章所建议的,该测试在一个单独的项目中。如果您认为问题可能与我的 main() 函数有关,请告诉我将其包括在内。我现在不这样做,因为它很长。
提前感谢您的宝贵时间!
那篇文章建议您可以像 DLL 一样 link 到 Windows 可执行文件。我想这在理论上是可能的,如果您的可执行文件已设置为导出其功能,但这似乎是一件奇怪的事情。
在 C++ 单元测试项目中访问被测代码有两种选择:
- 将源模块 (.cpp/.h) 添加到您的单元测试项目。
- Link 包含代码的库。
如果您的项目相对简单,只有几个 .cpp 模块,那么选项 1 可能是可行的方法。右键单击您的单元测试项目,select "Add -> Existing Item..." 并添加您要测试的 .cpp 模块。
对于包含许多源模块的更复杂的项目,选项 2 可能是更好的选择。创建一个或多个库项目(静态或动态)以包含您的源模块,然后 link 包含库的可执行项目和单元测试项目。
一个好的做法是为每个要测试的项目创建一个单元测试项目。给单元测试项目一个名称,表明它正在测试什么项目,即 MyExecutable
和 MyExecutable.Test
、MyLibrary
和 MyLibrary.Test
等