我正在编写一个类似单元测试的简短程序作为大型项目的一部分。我在" Utilities.hpp"中编写了一些简单的函数。我正在编写测试文件。这是代码...已经排除了一些函数定义的长度'缘故。
//Main.cpp
#ifdef RUN_TESTS
#include "Logger.hpp"
#include "UnitTester.hpp"
#define TEST_ALL
int main(int, char*[])
{
logger::init();
logger::setSeverityLevel(INFO);
auto slg = logger::getSLogger();
BOOST_LOG_SEV(slg, INFO) << "Starting Unit Tests...";
testing::UnitTester testObject;
testObject.runTests();
}
#endif
Utilities.hpp
#pragma once
#include <string>
#include <stack>
#include <vector>
namespace util
{
void swapChars(char& a, char& b); //flips two chars
std::string reverseString(const std::string& str); //stack based implementation of string inversion
std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split); //splits string into parts seperated by "split"
}
Utilities.cpp
#include "Utilities.hpp"
void util::swapChars(char& a, char& b)
{
...
}
std::string util::reverseString(const std::string& str)
{
...
}
std::vector<std::string> util::splitStrAtSubstr(const std::string& str, const std::string& split)
{
...
}
最后是UnitTester类...... UnitTester.hpp
#pragma once
#define RUN_TESTS
#define RUN_ALL
#ifdef RUN_TESTS
#include "Logger.hpp"
#include <string>
#include <vector>
namespace testing
{
class UnitTester
{
public:
UnitTester();
~UnitTester();
void runTests();
private:
src::severity_logger<severity_level> testLogger;
void utilities();
void logging();
void resourceGroup();
void resourceManager();
void INIParser();
};
}
#endif
UnitTester.cpp
#include "UnitTester.hpp"
#ifdef RUN_TESTS
void testing::UnitTester::runTests()
{
#ifdef RUN_ALL
utilities();
logging();
resourceGroup();
resourceManager();
INIParser();
#elif
#ifdef TEST_UTILITIES
utilities();
#endif
#ifdef TEST_LOGGING
logging();
#endif
#ifdef TEST_RESOURCE_GROUP
resourceGroup();
#endif
#ifdef TEST_RESOURCE_MANAGER
resourceMananager();
#endif
#ifdef TEST_INI_PARSER
INIParser();
#endif
#endif
}
//PRIVATE FUNCTIONS
void testing::UnitTester::utilities()
{
#include "Utilities.hpp"
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: void util::swapChars(char& a, char& b);";
char a = 'a', b = 'b';
util::swapChars(a, b);
if (a != 'b' || b != 'a') { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::swapChars failed."; }
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::string util::reverseString(const std::string& str);";
if (util::reverseString("myString") != "gnirtSym") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"myString\""; }
if (util::reverseString("MYSTRING ") != " GNIRTSYM") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"MYSTRING \""; }
if (util::reverseString("aaaaaa") != "aaaaaa") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"aaaaaa\""; }
if (util::reverseString("This Is An Extended TEST") != "TSET dednetxE nA sI sihT") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"This Is An Extended Test\""; }
if (util::reverseString("\"\\\"Escape") != "epacsE\"\\\"") { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::reverseString failed. IN: \"\"\\\"Escape\""; }
BOOST_LOG_SEV(testLogger, INFO) << "Now testing: std::vector<std::string> splitStrAtSubstr(const std::string& str, const std::string& split)";
std::vector<std::string> expected("One", "Two", "Three");
std::vector<std::string> expected2("One", "Three");
if (util::splitStrAtSubstr("One.Two.Three", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; }
if (util::splitStrAtSubstr("One\"Two\"Three", "\"") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One\"Two\"Three\", \"\"\""; }
if (util::splitStrAtSubstr("OneTwoThree", ".") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"One.Two.Three\", \".\""; }
if (util::splitStrAtSubstr("OneTwoThree", "Two") != expected) { BOOST_LOG_SEV(testLogger, ERROR) << "Input to util::splitStrAtSubstr failed. IN: \"OneTwoThree\", \"Two\""; }
}
void testing::UnitTester::logging()
{
#include "Logger.hpp"
}
void testing::UnitTester::resourceGroup()
{
#include "ResourceManager\ResourceGroup.hpp"
}
void testing::UnitTester::resourceManager()
{
#include "ResourceManager\ResourceGroup.hpp"
}
void testing::UnitTester::INIParser()
{
#include "INIParser.hpp"
}
#endif
我认为这是我得到的不同错误的代表性样本。我会把我认为最怀疑的那些放在最顶层。正如他们经常做的那样,许多错误只是由于其他错误造成的......
在Utilities.hpp中的函数声明:
错误14错误C2039:&#39; vector&#39; :不是&#39; std&#39;
的成员
错误13错误C2143:语法错误:缺少&#39;,&#39;之前&#39;&amp;&#39;
错误15错误C2143:语法错误:缺少&#39 ;;&#39;之前&#39;&lt;&#39;
错误10错误C2039:&#39; string&#39; :不是&#39; std&#39;的成员。
在UnitTester.hpp中调用BOOST_LOG_SEV:
错误69错误C2597:非法引用非静态成员&#39; testing :: UnitTester :: testLogger&#39;
错误49错误C2228:&#39; .stream&#39;必须有class / struct / union
错误63错误C2228:左边的&#39; .open_record&#39;必须有class / struct / union
关于UnitTester.cpp中的函数调用:
错误51错误C2039:&#39; splitStrAtSubstr&#39; :不是&#39; util&#39;的成员。
错误31错误C2664:&#39; int util :: reverseString(const int)&#39; :无法从&#39; const char [10]&#39;转换参数1到&#39; const int&#39; ^^发生,因为编译器找不到std :: string作为类型,默认为int
这些似乎是最重要的错误。对我来说,问题几乎肯定出现在Utilities.hpp中,编译器似乎无法识别std :: string和std :: vector,并对函数声明提出了一些奇怪的解释。
提前致谢。
答案 0 :(得分:1)
你包含来自函数体内部的文件,我认为它不应该被用作。
txt
是预编译器指令。预编译器甚至在实际编译器启动之前运行。这使它能够修改代码。就像#define可以替换某些单词一样,#include可以包含整个文件。
#include
想象一下编译器实际会收到什么,比如你用void testing::UnitTester::logging()
{
#include "Logger.hpp"
}
替换了Logger.hpp的内容。
请勿在功能体内使用#include "Logger.hpp"
。