背景:我有一个复杂的应用程序,我已经继承并且正在扩展(研究生研究项目)。我想确保我的重新组织对可维护性和可用性产生积极的长期影响 - 换句话说,我希望确保尽可能地为未来可能处理代码的人设置标准。我没有时间,也不是我的位置,完全重新构建应用程序。
该应用程序是一种生态系统模型。它由一个用C ++编写的共享库组成,可以完成繁重的任务。该库包含在“驱动”模拟的Java应用程序中 - 处理一些数据库I / O并提供GUI。
在开发过程中,我在项目中添加了许多实用程序函数,主要是为了在运行时方便地将内部变量打印到控制台(直接从代码的C ++部分)。
我现在将这些函数分解为实用程序文件(header和cpp),根据需要包含在其他文件中。我将这些函数放在它们自己的命名空间中,例如:Organising utility functions in C++
问题:如果我想为实用程序函数编写一些测试,以便我可以开发和试验,无需重新编译和修改/运行整个模型,这些测试应该在何处以及如何进行最好包括哪些?
如果我在util.cpp文件中有一个main()函数,那会有问题吗?令我惊讶的是,我试过这个并且它有效;我可以独立编译和运行util.cpp文件。此外,包含util.cpp的主要应用程序仍然可以编译并运行正常。我很惊讶,因为我认为第二个main()的存在将是一个问题 - 尽管应用程序入口点在java代码中。
但是我不确定这是否是最好的路线;我没有足够的经验来看待这种策略的未来陷阱。
以下是我的util.cpp文件的简短示例:
#include "util.hpp"
#include <iostream>
#include <vector>
namespace util {
/** Prints a std::vector of doubles in a format that can be
* copied directly into a python console. */
void util::pyprint_vec(const std::vector<double> & v){
std::cout << "[";
for(std::vector<double>::const_iterator it = v.begin(); it != v.end(); ++it){
std::cout << *it << ", ";
}
std::cout << "\b\b]"; // remove the last comma
}
}
int main() {
using namespace util;
using namespace std;
cout << "Testing some of the utility functions...\n";
vector<double> a_vec(50,12.0);
pyprint_vec(a_vec);
cout << endl;
return 0;
}
最终我设想模板化一些函数(此时它们实际上转移到util.hpp)并添加到文件中以及能够在其他项目中使用它。 提前感谢任何建议。
答案 0 :(得分:1)
通常,您可能希望编写一个单独的可执行程序,其中包含单元测试并链接到要测试的函数。例如,您可以创建一个包含main()函数的util_test.cpp
和包含测试的代码,以及* #include * s util.hpp。编译时,使用静态或动态链接到要测试的代码。
技术上,在util.cpp中使用main()函数不会有问题。但是,如果在库中的其他位置包含第二个main函数(对其他内容进行单元测试),并将其链接到同一个共享对象,则会收到链接器错误。
除了链接器创建可执行文件之外,main函数没有特殊含义,它会插入特殊代码,以便在启动程序时执行main代码。如果加载“共享对象”库,则不会“启动”该程序,只要您不明确调用main函数,代码就不会被执行。
答案 1 :(得分:0)