【发布时间】:2011-10-06 19:05:57
【问题描述】:
我正在使用Catch 测试框架。
作者在introductory blog post 中提到了以下功能:
- 以易于使用的方式支持浮点公差
我找不到任何有关如何执行此操作的文档。这在 Catch 中是如何完成的?
【问题讨论】:
标签: c++ unit-testing catch-unit-test
我正在使用Catch 测试框架。
作者在introductory blog post 中提到了以下功能:
- 以易于使用的方式支持浮点公差
我找不到任何有关如何执行此操作的文档。这在 Catch 中是如何完成的?
【问题讨论】:
标签: c++ unit-testing catch-unit-test
这很简单。有一个名为 Approx 的类可以让您以非常易读的方式进行此测试:
#include <limits>
TEST_CASE("demo/approx", "Approx demo") {
double a = 1.0;
double b = a + std::numeric_limits<double>::epsilon();
REQUIRE_FALSE(b == a);
REQUIRE(b == Approx(a));
}
可以使用Approx 对象的成员函数epsilon() 和scale() 更改容差,例如:Approx(a).epsilon(e)。
【讨论】:
公差是可定制的since Apr 2011。 Approx 有两个成员函数:epsilon() 和 scale()。例如:
REQUIRE(a == Approx(b).epsilon(my_eps));
容差为 ε × (scale+max(|a|, |b|)),其中 scale 默认为 1,所以这将通过:
REQUIRE((2+2) == Approx(5).epsilon(0.17));
【讨论】:
我知道这是一个老问题,但我偶然发现了同样的问题并找到了一个简单的解决方案。在定义 Approx 类的 Catch.hpp 头文件中(撰写本文时的第 2045 行),只需添加以下构造函数:
class Approx {
public:
explicit Approx( double value )
: m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
m_scale( 1.0 ),
m_value( value )
{}
explicit Approx( double value, double epsilon ) // <- New constructor
: m_epsilon( epsilon ),
m_scale( 1.0 ),
m_value( value )
{}
现在你可以这样做了:
TEST_CASE("demo/approx", "Approx demo") {
double myTol = 0.1;
double a = 1.0;
double b = a + myTol;
REQUIRE_FALSE(a == b);
REQUIRE(a == Approx(b, myTol));
}
【讨论】: