gtest

作者: downdemo | 来源:发表于2019-02-18 17:12 被阅读0次

    配置

    • 下载gtest源码,解压后用VS打开...\googletest-master\googletest\msvc\2010\gtest-md.sln,打开后可以看到包含的4个项目
    • 打开生成 - 批生成(快捷键Alt+B+T),勾选所有64位的选项,点击生成
    • ...\googletest-master\googletest\msvc\2010\gtest-md\x64-Debug中将生成gtestd.libgtest_maind.lib
    • ...\googletest-master\googletest\msvc\2010\gtest-md\x64-Release中将生成gtest.libgtest_main.lib
    • 头文件的库目录位于...\googletest-master\googletest\include,复制库目录和.lib文件到环境中,然后在VS中添加库目录和.lib文件即可使用

    示例

    • 打开VS新建一个空项目,添加以下源码
    #include <iostream>
    #include <gtest/gtest.h>
    
    int f(int n)
    {
        return n + 1;
    }
    
    TEST(testCase, case0)
    {
        EXPECT_EQ(1, f(0));
        ASSERT_EQ(2, f(1));
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    
    • 如果运行出现如下报错:
    error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”
    
    • 配置属性 - C/C++ - 代码生成 - 运行库多线程调试 DLL (/MDd)修改为多线程调试 (/MTd)即可。原因是编译的是gtest.sln而不是gtest-md.slngtest.sln的配置是多线程调试 (/MTd),而gtest-md.sln的与VS的默认配置相同,是多线程调试 DLL (/MDd)
    • 如果运行成功,将在控制台窗口中显示测试通过的结果
    • 如果添加一个不能通过的测试用例
    #include <iostream>
    #include <gtest/gtest.h>
    
    int f(int n)
    {
        return n + 1;
    }
    
    TEST(testCase, case0)
    {
        EXPECT_EQ(1, f(0));
        EXPECT_EQ(2, f(1));
    }
    
    TEST(testCase, case1)
    {
        EXPECT_EQ(11, f(0));
        EXPECT_EQ(22, f(1));
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    
    • 运行将显示未通过测试的代码行数以及错误原因

    常用宏

    ASSERT_TRUE(condition);
    ASSERT_FALSE(condition);
    ASSERT_EQ(expected, actual);
    ASSERT_NE(expected, actual);
    ASSERT_GT(expected, actual);
    ASSERT_LT(expected, actual);
    ASSERT_GE(expected, actual);
    ASSERT_LE(expected, actual);
    ASSERT_STREQ(expected, actual);
    ASSERT_STRNE(expected, actual);
    ASSERT_FLOAT_EQ(expected, actual);
    ASSERT_DOUBLE_EQ(expected, actual);
    ASSERT_NEAR(val1, val2, abs_error);
    ASSERT_DEATH(statement, regex);
    
    EXPECT_* // 同上
    
    • ASSERT和EXPECT的区别是,若ASSERT失败,则不会执行下一条语句,而EXPECT会

    值参数化测试

    • 多次使用仅参数不同的同一判断条件,可以使用值参数化来简化代码
    #include <iostream>
    #include <gtest/gtest.h>
    
    bool isOdd(int n)
    {
        return n % 2;
    }
    
    class ParamTest : public ::testing::TestWithParam<int> {};
    
    TEST_P(ParamTest, case0)
    {
        EXPECT_TRUE(isOdd(GetParam())); // 多次EXPECT_TRUE
    }
    
    INSTANTIATE_TEST_CASE_P(TestSuite, ParamTest, ::testing::Values(1, 3, 5, 7, 9));
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    

    全局事件

    #include <iostream>
    #include <gtest/gtest.h>
    
    class GlobalEnv : public ::testing::Environment
    {
    public:
        virtual void SetUp() override
        {
            std::cout << "GlobalEnv::SetUp()" << std::endl;
        }
        virtual void TearDown() override
        {
            std::cout << "GlobalEnv::TearDown()" << std::endl;
        }
    };
    
    TEST(TestCase, case0)
    {
        EXPECT_EQ(1, 2);
    }
    
    TEST(TestCase, case1)
    {
        EXPECT_EQ(1, 3);
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        ::testing::Environment* env = new GlobalEnv();
        ::testing::AddGlobalTestEnvironment(env);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    

    fixture

    #include <iostream>
    #include <gtest/gtest.h>#include <iostream>
    #include <gtest/gtest.h>
    
    class TestSuite : public ::testing::Test
    {
    public:
        static void SetUpTestCase()
        {
            std::cout << "SetUpTestCase()" << std::endl;
        }
        static void TearDownTestCase()
        {
            std::cout << "TearDownTestCase()" << std::endl;
        }
        virtual void SetUp() override
        {
            std::cout << "TestSuite::SetUp()" << std::endl;
        }
        virtual void TearDown() override
        {
            std::cout << "TestSuite::TearDown()" << std::endl;
        }
    };
    
    TEST_F(TestSuite, case0)
    {
        EXPECT_EQ(1, 2);
    }
    
    TEST_F(TestSuite, case1)
    {
        EXPECT_EQ(1, 3);
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    
    class TestSuite : public ::testing::Test
    {
    public:
        static void SetUpTestCase()
        {
            std::cout << "SetUpTestCase()" << std::endl;
        }
        static void TearDownTestCase()
        {
            std::cout << "TearDownTestCase()" << std::endl;
        }
        virtual void SetUp() override
        { // 这里还可以构造对象,比如auto p = new Widget;
            std::cout << "TestSuite::SetUp()" << std::endl;
        }
        virtual void TearDown() override
        { // 这里还可以析构对象,比如delete p;
            std::cout << "TestSuite::TearDown()" << std::endl;
        }
    };
    
    TEST_F(TestSuite, case0)
    {
        EXPECT_EQ(1, 2);
    }
    
    TEST_F(TestSuite, case1)
    {
        EXPECT_EQ(1, 3);
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    

    结合使用

    #include <iostream>
    #include <gtest/gtest.h>
    
    class GlobalEnv : public ::testing::Environment
    {
    public:
        virtual void SetUp() override
        {
            std::cout << "GlobalEnv::SetUp()" << std::endl;
        }
        virtual void TearDown() override
        {
            std::cout << "GlobalEnv::TearDown()" << std::endl;
        }
    };
    
    class TestSuite : public ::testing::Test
    {
    public:
        static void SetUpTestCase()
        {
            std::cout << "SetUpTestCase()" << std::endl;
        }
        static void TearDownTestCase()
        {
            std::cout << "TearDownTestCase()" << std::endl;
        }
        virtual void SetUp() override
        {
            std::cout << "TestSuite::SetUp()" << std::endl;
        }
        virtual void TearDown() override
        {
            std::cout << "TestSuite::TearDown()" << std::endl;
        }
    };
    
    TEST(TestCase, case0)
    {
        EXPECT_EQ(1, 2);
    }
    
    TEST(TestCase, case1)
    {
        EXPECT_EQ(1, 3);
    }
    
    TEST_F(TestSuite, case0)
    {
        EXPECT_EQ(1, 2);
    }
    
    TEST_F(TestSuite, case1)
    {
        EXPECT_EQ(1, 3);
    }
    
    int main(int argc, char **argv)
    {
        ::testing::InitGoogleTest(&argc, argv);
        ::testing::Environment* env = new GlobalEnv();
        ::testing::AddGlobalTestEnvironment(env);
        RUN_ALL_TESTS();
        std::cin.get();
    }
    

    相关文章

      网友评论

          本文标题:gtest

          本文链接:https://www.haomeiwen.com/subject/tzxzeqtx.html