如何每次使用不同的参数多次测试方法

How to test a method many times with different parameters each time

本文关键字:参数 测试方法 何每次      更新时间:2023-10-16

>我正在学习如何使用提升测试。

我想测试方法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_valueexpected_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