我正在使用Catch单元测试框架,我想比较一个双打矢量。这个other answer建议使用Approx来比较浮点数/双精度值,但这对于它们的向量不起作用。有没有方便的方法来实现这个目标?
编辑:一个例子
使用以下代码:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
TEST_CASE("Compare Vectors", "[vector]") {
std::vector<int> vec1 = {0, 1, 2, 3};
std::vector<int> vec2 = {0, 1, 2, 4};
REQUIRE(vec1 == vec2);
}
测试失败并带有以下报告:
-------------------------------------------------------------------------------
Compare Vectors
-------------------------------------------------------------------------------
test/UnitTests/test_Example/example.cc:4
...............................................................................
test/UnitTests/test_Example/example.cc:7: FAILED:
REQUIRE( vec1 == vec2 )
with expansion:
{ 0, 1, 2, 3 } == { 0, 1, 2, 4 }
===============================================================================
test cases: 1 | 1 failed
assertions: 1 | 1 failed
但是,如果我按如下方式更改代码,我希望测试通过,但显然不会。
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
TEST_CASE("Compare Vectors", "[vector]") {
std::vector<double> vec1 = {0, 1, 2, 3};
std::vector<double> vec2 = {0, 1, 2, 3.000001};
REQUIRE(vec1 == vec2);
}
我可以遍历各个元素并逐个进行比较,但如果出现差异,则更难确定错误的来源。
答案 0 :(得分:2)
暂时我采取了一种解决方法。我创建了以下两个函数,可以在任何想要检查两个向量的地方使用。 (即REQUIRE(compareVectors(vec1, vec2));
)
bool compareVectors(std::vector<double> a, std::vector<double> b) {
if (a.size() != b.size()) return false;
for (size_t i = 0; i < a.size(); i++) {
if (a[i] != Approx(b[i])) {
std::cout << a[i] << " Should == " << b[i] << std::endl;
return false;
}
}
return true;
}
bool compare2dVectors(std::vector<std::vector<double>> a,
std::vector<std::vector<double>> b) {
if (a.size() != b.size()) return false;
for (size_t i = 0; i < a.size(); i++) {
if (! compareVectors(a[i], b[i])) return false;
}
return true;
}
这样你至少可以看到失败的矢量名称,以及不同的第一个值。
这不是理想的解决方案,所以我仍然希望有人能够提出更好的东西,但我认为我至少可以分享我迄今为止所提出的内容以防万一。
答案 1 :(得分:0)
虽然距 Catch 2.7.2 已经过去了大约 4 年,但用户现在可以使用 Approx
比较向量:
REQUIRE_THAT(vec1, Catch::Approx(vec2).margin(0.0001);
这会将两个向量进行比较,误差在 +- 0.0001 以内。 更多详情here。