c++ - 如何将 C++ 模型的实验版本与黄金引用进行比较?

标签 c++ testing

我编写了一个具有输入、输出和内部变量的 C++ 模型。在这种情况下,输入是样本流 x[n]。输出和内部变量也是样本流。我将此版本的代码称为“黄金引用”。

我也想到了一些我想尝试的代码优化。我将此版本的代码称为“实验性”。但我想确保任何更改都不会破坏代码。也就是说,实验代码的输入、输出和一些内部变量与黄金引用相匹配。

因此对于示例流输入,我想检查实验代码输入、输出和内部变量是否与黄金引用相匹配。

但我正在尝试考虑一种代码/构建结构,允许我同时运行两个版本,同时对文件名、类名等进行最少的更改。

到目前为止,在我看来最简单的解决方案是编辑实验代码库中的每个文件并重命名命名空间和#include 路径。有没有不需要大量重命名的更好的解决方案?

由于模板等原因,大多数代码驻留在头文件中。

// Golden src/top.h
#include "src/sub1.h"
#include "src/sub2.h"
namespace model {
  class Top {
  public:
    Sub1 sub1;
    Sub2 sub2;
    Var var;
    Var process(Var x) {
      var = sub1.process(x);
      return sub2.process(var);
    }
  };
}
// Experimental src_expr/top.h
#include "src_expr/sub1.h" // Have to edit include paths!
#include "src_expr/sub2.h"
namespace model_expr { // Have to rename namespaces!
  class Top {
  public:
    Sub1 sub1;
    Sub2 sub2;
    Var var;
    Var process(Var x) {
      var = sub1.process(x);
      return sub2.process(var);
    }
  };
}
// test.cpp
#include "src/top.h" // golden
#include "src_expr/top.h" // experimental
void test(std::vector<Var> xvec) {
  model::Top top_gold;
  model_expr::Top top_expr;
  for (const auto& x : xvec) {
    Var y_gold = top_gold.process(x);
    Var y_expr = top_expr.process(x);
    assert(y_gold == y_expr);
    assert(top_gold.var == top_expr.var);
  }
}

最佳答案

一种方法是使您的代码可模拟。

这意味着您提供一个界面并且只与之交互。方法尽可能纯(包括作为输入和输出的对象)。您通过可模拟的工厂对象创建实例。

然后编写创建两个 版本的接口(interface)的实现,比较它们的输出,如果它们不同则出错,并在外部表现得像其中一个。

遗憾的是,这可能需要进行重大重构;理想情况下,您在编写第一个版本之前执行此操作。

关于c++ - 如何将 C++ 模型的实验版本与黄金引用进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385126/

相关文章:

c# - 假 DataRepository - 模拟数据库

ruby-on-rails - 如何使用 fixtures/yml 文件中的数据加载 neo4j 测试数据库?

c++ - 使用 libzip 打开 zip 文件时遇到问题

c++ - 当局部变量具有相同名称时,如何在 C++ 中分配给实例变量?

c++ - CPP、WinAPI - WM_CREATE 从 lParam 获取 CREATESTRUCT* 的正确方法

java - Spring Boot 测试中的 mockito 和多个 HTTP

c++ - 井字棋数组错误

c++ - 使用 curl 和 C++ 的 Django 身份验证

java - 为任何整数输入参数设置模拟返回值

java - 包 grails.plugins.springsecurity 在 jUnit 测试中不存在