如何每次使用不同的参数多次测试方法
How to test a method many times with different parameters each time
>我正在学习如何使用提升测试。
我想测试方法JulianToGreenWich(float jd)
:
#include <ctime>
class Convert
{
private:
public:
Convert();
~Convert();
tm JulianToGreenWich(float jd);
};
为了使用Boost Test进行测试,我写下了以下代码:
struct TestFixture
{
Convert convert_instance;
TestFixture()
: convert_instance()
{}
~TestFixture() = default;
};
BOOST_FIXTURE_TEST_SUITE(TestConvert, TestFixture)
BOOST_AUTO_TEST_CASE(julianToGreenWichCase)
{
BOOST_TEST(1 == 1);
BOOST_TEST(true);
}
我的问题是我想用许多(不止一个(值来测试它。为此,我一直在阅读有关BOOST_DATA_TEST_CASE_F的信息,但似乎它需要一个数据集(我不知道如何创建一个数据集并使用它(。所以,我已经开始在提升文档:数据集中阅读这篇文章。但是它的自定义数据集示例非常复杂。
如果我想检查是否将值(浮点数(传递给JulianToGreenWich
方法 a,我将得到一个特定的tm
结构。
如何使用多个对值(浮点 jd、tm(测试我的方法?
Boost.Test 的官方文档在 www.boost.org
: 这里.
如下所示:
- 创建 2 个数据集
- 第一个数据集 - 例如 - 将包含转换器的输入值
- 第二个数据集将包含预期值
- 然后将这两个数据集合并为一个唯一的数据集,并对数据集执行
zip
操作,如此处所述 - 之后的每个元素都是 arity 2,它们在给定的两个变量中按该顺序展开
BOOST_DATA_TEST_CASE
,分别是input_value
和expected_value
BOOST_DATA_TEST_CASE( test_convert,
data::make({0.1f,0.2f,0.3f})^data::make({tm1,tm2,tm3}), // creates a zip of 2 datasets
input_value, // first variable of the zip
expected_value) // second variable of the zip
{
Convert convertInstance;
// this might fail to compile because tm type should not printable.
// Adding BOOST_TEST_DONT_PRINT_LOG_VALUE on the tm type before the test
// should solve the issue.
BOOST_TEST(convertInstance(input_value) == expected_value);
}
您可以通过BOOST_DATA_TEST_CASE_F
替换BOOST_DATA_TEST_CASE
,并将您的夹具与继承的convert_instance
一起使用。
可在此处找到有关记录特定类型的更多信息。
IMO,boost::test
被过度设计并且文档不足,但它仍然可以使用其最基本的核心功能,因此当 boost 可用时,不需要安装另一个库只是为了单元测试。
一种简单的方法是定义一个包含输入和预期输出的表,然后在单元测试中使用该表:
#include <ctime>
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Convert
#include "boost/test/unit_test.hpp"
namespace {
struct Convert {
tm JulianToGreenWich(float jd);
};
tm make_tm(int year, int month, int day) {
tm t = {};
t.tm_year = year - 1900;
t.tm_mon = month - 1;
t.tm_mday = day;
return t;
}
struct Test {
float input;
tm expected_output;
};
Test tests[] = {
{ 0.f, make_tm(1970, 1, 1)},
{1560244906.f, make_tm(2019, 6, 11)},
};
BOOST_AUTO_TEST_CASE(my_test) {
Convert c;
for(auto& test : tests) {
tm output = c.JulianToGreenWich(test.input);
BOOST_CHECK_EQUAL(mktime(&output), mktime(&test.expected_output));
}
}
} // namespace
相关文章:
- 使用在用于SFINAE的void_t中具有参数的方法
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 谷歌测试方法与流
- 如何将带有参数的方法传递给线程以执行?
- std::bind,无法让具有单个参数的方法工作
- 如何从 node-ffi 调用 c++ 中以结构向量作为参数的方法?
- 可变参数模板方法
- 调用模板参数 constexpr 方法?
- 在实现文件中使用模板参数声明方法
- 在C++中传递数组作为函数参数的方法
- 更好的单元测试方法,花费的时间太长
- cppUnit:针对多个测试方法执行一次的设置函数
- 具有变异模板模板参数的方法的部分专业化
- 接受右值引用作为参数的方法的 wig 行为
- C++创建具有可变参数模板方法的接口
- 如何每次使用不同的参数多次测试方法
- 具有非类型模板参数的方法
- 将返回类型推断为模板参数类型方法
- 具有取决于模板参数的方法的模板类
- C++11可变参数模板方法完全影子基类方法