【问题标题】:How to test a method many times with different parameters each time如何每次使用不同的参数多次测试一个方法
【发布时间】:2019-06-11 08:24:19
【问题描述】:

我正在学习如何使用 Boost Test。

我要测试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 的信息,但它似乎需要一个数据集(而且我不知道如何创建和使用它)。所以,我已经开始阅读 boost 文档:Datasets。但是它的自定义数据集示例的例子非常复杂。

如果我想检查是否将值(浮点数)传递给 JulianToGreenWich 方法,我将得到一个特定的 tm 结构。

如何使用许多对值 (float jd, tm) 测试我的方法?

【问题讨论】:

    标签: c++ unit-testing boost boost-test


    【解决方案1】:

    Boost.Test的官方文档在www.boost.org:here

    如下所示:

    • 创建 2 个数据集
      • 第一个数据集(例如)将包含转换器的输入值
      • 第二个数据集将包含预期值
    • 这两个数据集然后通过zip 对数据集的操作合并为一个唯一的数据集,如here 所述
    • 之后的每个元素都是 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 替换为BOOST_DATA_TEST_CASE_F,并将您的夹具与继承的convert_instance 一起使用。

    有关记录特定类型的更多信息,请参阅here

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 感谢您的回答。我也认为它的记录很差。 BOOST_DATA_TEST_CASE_F 和 Dataset 让我很困惑。
      猜你喜欢
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多