C++,共享库,主函数中的 "unit tests"

标签 c++ testing

背景:我继承并扩展了一个复杂的应用程序(研究生研究项目)。我想确保我的重组对可维护性和可用性有积极的长期影响——换句话说,我想确保我以尽可能标准的方式为 future 可能处理代码的人设置东西。我没有时间,也没有时间完全重新构建应用程序。

该应用程序是一个生态系统模型。它由一个用 C++ 编写的共享库组成,可以完成繁重的工作。该库包含在“驱动”模拟的 Java 应用程序中——处理一些数据库 I/O 并提供 GUI。

在我的开发过程中,我向项目添加了许多实用函数,主要是为了在运行时方便地将内部变量打印到控制台(直接从代码的 C++ 部分)。

我现在将这些函数分解到一个实用程序文件(头文件和 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)并添加到文件中,并能够在其他项目中使用它。 在此先感谢您的任何建议。

最佳答案

通常,您会希望编写一个单独的可执行程序,其中包含单元测试并链接到要测试的函数。例如,您可以创建一个包含 main() 函数和测试代码的 util_test.cpp,并且*#include*s util.hpp。编译时,使用静态或动态链接到您要测试的代码。

从技术上讲,在 util.cpp 中有一个 main() 函数不会有问题。但是,如果您在库中的其他地方包含第二个主要函数(以对其他内容进行单元测试),并将其链接到同一个共享对象,您将收到链接器错误。

除了链接器创建可执行文件时,main 函数没有其他特殊含义,它会插入特殊代码,以便在启动程序时执行 main 中的代码。如果加载“共享对象”库,则不会“启动”程序,只要不显式调用 main 函数,代码就不会执行。

关于C++,共享库,主函数中的 "unit tests",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11040148/

相关文章:

c++ - QtRPT 连接错误,没有匹配函数调用到 reportWindow::connect

java - 在自己的主体中测试类是个好主意吗?

php - symfony2 phpunit 测试出现 LogicException : The selected node does not have a form ancestor. 错误

c++ - constexpr构造函数必须初始化直接基类(Visual Studio)

C++ vector 在递归函数中丢失数据

c++ - std::vector 构造函数——为什么是 int 而不是 int*?

variables - 如何在 PowerShell 中测试变量是否超过八个字符?

java - 默认测试容器工厂,null,无法实例化

ios - 如何在真实设备上设置 Frank Automation?

c++ - Windows 8 : How to read the user documents folder path programmatically (using c )?