【问题标题】:How do I run a test with multiple sets of initial conditions?如何运行具有多组初始条件的测试?
【发布时间】:2015-11-19 09:12:03
【问题描述】:

我目前有一套测试,它们是测试夹具的一部分。 我也想用不同的测试夹具运行同一组测试。

如何在不实际复制粘贴测试和“手动”更改测试夹具名称的情况下执行此操作(如下所示)?

class Trivial_Test : public ::testing::Test
{
    void SetUp()
    {
        ASSERT_TRUE(SUCCESS == init_logger());
        initial_condition = 0;
    }

    void TearDown()
    {
        shutdown_logger();
    }

    protected:
    int initial_condition;
};

class Trivial_Test_01 : public ::testing::Test
{
    void SetUp()
    {
        ASSERT_TRUE(SUCCESS == init_logger());
        initial_condition = 1;
    }

    void TearDown()
    {
        shutdown_logger();
    }

    protected:
    int initial_condition;
};

TEST_F(Trivial_Test, valid_input_1)
{
    EXPECT_TRUE(random_num()+initial_condition < 255);
}

TEST_F(Trivial_Test_01, valid_input_1)
{
    EXPECT_TRUE(random_num()+initial_condition < 255);
}

有没有更简洁的方式将valid_input_1Trivial_TestTrivial_Test_01 关联起来?

附: - 上面显示的测试用例是一个简单的测试,名义上代表我的实际情况,但与我实际处理的测试用例或测试装置的复杂性相去甚远。

【问题讨论】:

    标签: c++ unit-testing googletest


    【解决方案1】:

    你考虑过value parameterized tests吗?

    也许对于您的实际测试用例,它增加了太多的复杂性,但您的示例看起来像:

    class Trivial_Test : public ::testing::TestWithParam<int>
    {
        void SetUp()
        {
             ASSERT_TRUE(SUCCESS == init_logger());
        }
        void TearDown()
        {
            shutdown_logger();
        }
    };
    
    TEST_F(Trivial_Test, valid_input)
    {
        int initial_condition = GetParam();
        EXPECT_TRUE(random_num()+initial_condition < 255);
    }
    
    INSTANTIATE_TEST_CASE_P(ValidInput,
                            Trivial_Test,
                            ::testing::Values(0, 1));
    

    【讨论】:

      【解决方案2】:

      您可以使用夹具类中的方法来执行此操作。以下是您将如何为您执行此操作的示例:

      class Trivial_Test : public ::testing::Test
      {
          void SetUp()
          {
               ASSERT_TRUE(SUCCESS == init_logger());
          }
          void TearDown()
          {
              shutdown_logger();
          }
          setup_initial_condition(int value)
          {
              initial_condition = value;
          }
      
          protected:
          int initial_condition;
      };
      
      TEST_F(Trivial_Test, valid_input_1)
      {
          setup_initial_condition(0);
          EXPECT_TRUE(random_num()+initial_condition < 255);
      }
      
      TEST_F(Trivial_Test, valid_input_2)
      {
          setup_initial_condition(1);
          EXPECT_TRUE(random_num()+initial_condition < 255);
      }
      

      【讨论】:

      • 这仍然复制了测试用例。我的目的是避免测试用例重复。我想像TEST_F((Trivial_Test, Trivial_Test_01), valid_input_1) 这样的东西。
      • 测试应该很简单,并且每个测试规则都遵循一个断言(在大多数情况下)。不要尝试在一次测试中测试所有有效输入。在这个简单的示例中,您可以测试多个有效输入,但是当您测试更复杂的东西时,最好只使用一个有效输入进行测试。这样,测试将更容易调试、理解和维护。
      • @work.bin 这可能会有所帮助:stackoverflow.com/questions/9240158/…
      • 我明白了。测试一次只测试一件事,但是我需要在不同的初始条件下执行测试。我认为这更接近我想要的 - code.google.com/p/googletest/wiki/…
      • 是的,您似乎想做数据驱动测试,值参数化测试当然可以让您这样做。但是,从您的帖子中并不清楚。您正在为每个输入值创建一个新的夹具类,我认为这是问题所在。
      猜你喜欢
      • 2013-08-10
      • 1970-01-01
      • 2021-02-06
      • 2020-12-23
      • 2021-05-21
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多