zoukankan      html  css  js  c++  java
  • GoogleTest初探(2)

    前面的随笔介绍了Google Test中的基本测试单元TEST和测试夹具TEST_F,此篇介绍区别于这两种测试的参数化测试TEST_P

    当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个相类似的test case时,可以用value-parameterized Test

    value-parameterized Test 允许你可以使用不同的参数测试代码, 而无需编写同一测试的多个副本

    下面举个例子,待测方法:

    //MyClass.hpp
    enum class CalculateType : int
    {
        add = 1,
        minus = 2,
        plus = 3,
        divide = 4
    };
    
    class MyClass
    {
    public:
        int calculate(int a, int b, CalculateType type)
        {
            int c = 0;
            switch (type)
            {
                case CalculateType::add:
                    c = a + b;
                    break;
                case CalculateType::minus:
                    c = a - b;
                    break;
                case CalculateType::plus:
                    c = a * b;
                    break;
                case CalculateType::divide:
                    c = a / b;
                    break;
            }
            return c;
        }
    };

    测试:

    //myGtest.cpp
    #include <gtest/gtest.h>
    #include "MyClass.hpp"
    
    using namespace std;
    
    struct MyTestData
    {
        int a;
        int b;
        CalculateType type;
    };
    
    
    class TestMyClass : public ::testing::Test,
                        public ::testing::WithParamInterface<MyTestData>
    {
    public:
        MyClass myclass;
    };
    
    TEST_P(TestMyClass, norml)
    {
        int a = GetParam().a;
        int b = GetParam().b;
        int re = myclass.calculate(a, b, GetParam().type);
        switch (GetParam().type)
        {
            case CalculateType::add:
                EXPECT_EQ(a + b, re);
                break;
            case CalculateType::minus:
                EXPECT_EQ(a - b, re);
                break;
            case CalculateType::plus:
                EXPECT_EQ(a * b, re);
                break;
            case CalculateType::divide:
                EXPECT_EQ(a / b, re);
                break;
        }
    }
    
    INSTANTIATE_TEST_SUITE_P(TestMyClassParams,
                            TestMyClass,
                            ::testing::Values(
                                MyTestData{1, 2, CalculateType::add},
                                MyTestData{4, 3, CalculateType::minus},
                                MyTestData{5, 6, CalculateType::plus},
                                MyTestData{8, 2, CalculateType::divide}
                            ));

    编译

    g++ myGtest.cpp -lgtest -lpthread -o myGtest

    运行结果:

     从运行结果来看,最终在跑测试时是跑了四遍。

    首先,写value-parameterized Test 时,你的测试类要同时继承::testing::Test和::testing::WithParamInterface<T>,或者直接继承::testing::TestWithParam<T>(其实它也是继承了前两者,不过写起来方便了)

       其中T是你测试时想传入的参数类型(如果是多个参数,可以定义一个结构体)。

    其次,在写测试时,需要使用TEST_P这个宏,在测试case中可以用GetParam()来得到传入的参数。

    最后,使用INSTANTIATE_TEST_SUITE_P来初始化你想传入的参数集合。你可以使用参数生成器来完成。参数生成器:(用的时候记得加namespace ::testing)

    参考链接: https://github.com/google/googletest/blob/master/googletest/docs/advanced.md

  • 相关阅读:
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结
    个人作业——软件评测
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    第一次作业-准备篇
    java EE中的路径辨别
    个人作业——软件工程实践总结&个人技术博客
  • 原文地址:https://www.cnblogs.com/duan-shui-liu/p/10755298.html
Copyright © 2011-2022 走看看