繁体   English   中英

C ++,共享库,主要功能中的“单元测试”

[英]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中的代码。 如果加载“共享对象”库,则不会“启动”程序,只要您未明确调用主函数,该代码就不会执行。

从纯粹的工作角度来看,一个主要功能很好,但是两个功能将破坏您的编译,因为在启动时只能调用一个功能。

您确实想研究一个单元测试框架,例如cppunitcxxtest (我目前最喜欢的东西)。 这些将提供一些功能,如果您尝试单独使用它们,将会发现重新实现效果很差。 生成多个可执行文件是一个失败的游戏,如果您的代码库根本没有任何大小,那么它将需要永远编译。 您确实想要一个由某种框架驱动的已编译可执行文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM