[英]C++, shared library, “unit tests” in main function
背景:我有一个继承并正在扩展的复杂应用程序(研究生研究项目)。 我想确保我的重组对可维护性和可用性产生积极的长期影响-换句话说,我想确保以尽可能标准的方式设置东西,以供将来可能使用该代码的人员使用。 我没有时间,也不是我的地方,无法完全重新构建应用程序。
该应用程序是一个生态系统模型。 它由一个用C ++编写的共享库组成,该库可以完成繁重的工作。 该库包含在“驱动”仿真的Java应用程序中-处理某些数据库I / O并提供GUI。
在我的开发过程中,我向项目添加了许多实用程序功能,主要是为了在运行时将内部变量方便地打印到控制台(直接从代码的C ++部分)。
我现在将这些功能分解为一个实用程序文件(标头和cpp),该文件根据需要包含在其他文件中。 我将通过以下示例将函数放在自己的名称空间中: 用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)并添加到文件中,并能够在其他项目中使用它。 在此先感谢您的任何建议。
通常,您需要编写一个单独的可执行程序,其中包括单元测试,并链接到要测试的功能。 例如,您可以创建一个util_test.cpp
,其中包括main()函数和带有测试的代码,并且*#include * s util.hpp。 编译时,请使用静态或动态链接到要测试的代码。
从技术上讲,在util.cpp中具有main()函数将不是问题。 但是,如果在库中的其他位置包括第二个main函数(以对其他内容进行单元测试),并将其链接到同一共享库中,则会收到链接器错误。
main函数没有特殊含义,除了链接程序创建可执行文件时,它会插入特殊代码,以便在启动程序时执行main中的代码。 如果加载“共享对象”库,则不会“启动”程序,只要您未明确调用主函数,该代码就不会执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.