How to use google test for C++ to run through combinations of data

后端 未结 2 736
Happy的楠姐
Happy的楠姐 2021-02-20 03:20

I have a unit test that I need to run for 200 possible combinations of data. (The production implementation has the data to be tested in configuration files. I know how to mock

相关标签:
2条回答
  • 2021-02-20 04:07

    You can make use of gtest's Value-parameterized tests for this.

    Using this in conjunction with the Combine(g1, g2, ..., gN) generator sounds like your best bet.

    The following example populates 2 vectors, one of ints and the other of strings, then with just a single test fixture, creates tests for every combination of available values in the 2 vectors:

    #include <iostream>
    #include <string>
    #include <tuple>
    #include <vector>
    #include "gtest/gtest.h"
    
    std::vector<int> ints;
    std::vector<std::string> strings;
    
    class CombinationsTest :
        public ::testing::TestWithParam<std::tuple<int, std::string>> {};
    
    TEST_P(CombinationsTest, Basic) {
      std::cout << "int: "        << std::get<0>(GetParam())
                << "  string: \"" << std::get<1>(GetParam())
                << "\"\n";
    }
    
    INSTANTIATE_TEST_CASE_P(AllCombinations,
                            CombinationsTest,
                            ::testing::Combine(::testing::ValuesIn(ints),
                                               ::testing::ValuesIn(strings)));
    
    int main(int argc, char **argv) {
      for (int i = 0; i < 10; ++i) {
        ints.push_back(i * 100);
        strings.push_back(std::string("String ") + static_cast<char>(i + 65));
      }
      testing::InitGoogleTest(&argc, argv);
      return RUN_ALL_TESTS();
    }
    
    0 讨论(0)
  • 2021-02-20 04:10

    Use an array of structs (called, say, Combination) to hold your test data, and loop though each entry in a single test. Check each combination using EXPECT_EQ instead of ASSERT_EQ so that the test isn't aborted and you can continue checking other combinations.

    Overload operator<< for a Combination so that you can output it to an ostream:

    ostream& operator<<(ostream& os, const Combination& combo)
    {
        os << "(" << combo.field1 << ", " << combo.field2 << ")";
        return os;
    }
    

    Overload operator== for a Combination so that you can easily compare two combinations for equality:

    bool operator==(const Combination& c1, const Combination& c2)
    {
        return (c1.field1 == c2.field1) && (c1.field2 == c2.field2);
    }
    

    And the unit test could look something like this:

    TEST(myTestCase, myTestName)
    {
        int failureCount = 0;
        for (each index i in expectedComboTable)
        {
            Combination expected = expectedComboTable[i];
            Combination actual = generateCombination(i);
            EXPECT_EQ(expected, actual);
            failureCount += (expected == actual) ? 0 : 1;
        }
        ASSERT_EQ(0, failureCount) << "some combinations failed";
    }
    
    0 讨论(0)
提交回复
热议问题