zoukankan      html  css  js  c++  java
  • Google C++单元测试框架(Gtest)系列教程之二——断言、函数测试

    引言

    《Google C++单元测试框架(Gtest)系列教程之一——入门》中,介绍了如何编译测试代码、生成可执行文件,下面我们来看Gtest提供了哪些语句和框架来方便我们编写单元测试代码。

    断言

    1.断言类型

    断言即判断一个条件是否为真的语句,它是构成Gtest测试代码最基本的单元。Gtest为我们提供了两种类型的断言:

    1. ASSERT_*系列,当检查点失败时,终止测试函数;
    2. EXPECT_*系列,当检查点失败时,不终止所在测试函数,继续往下执行。


    我们使用断言语句的时候,一般选择EXPECT_*系列的,基于以下两个原因:

    1. 该系列断言失败的时候并不终止所在测试函数,该函数中后续的检查点还能得到执行;
    2. 测试函数中可能包含有内存申请和释放的调用,ASSERT_*系列断言可导致后续的内存释放调用得不到执行,带来内存泄漏问题。

    2.实例

    当一个断言判断失败的时候,Gtest将打印出该断言所在的源文件和行号,并给出失败的信息。我们来看一个布尔值检查的例子:

    // IsPrime(int)函数判断入参是否为质数
    EXPECT_FALSE(IsPrime(1));
    // ...

    假如IsPrime(int)函数实现有误,将1也当成质数的话,测试的运行结果会包含如下提示:

    my_test.cc:15: Failure
    Value of: IsPrime(1)
    Actual: true
    Expected: false


    Gtest为我们提供了布尔值检查、数值型数据检查、字符串检查等多种检查类型,关于这些检查类型更详细的使用方法,可以参看这里,还有这里

    测试函数

    1.TEST()

    在Gtest中,我们使用宏TEST()来定义我们的测试函数,使用的方式如下:

    TEST(test_case_name, test_name) {
    ... test body ...
    }

    其中test body可以包含任何合法的C++语句以及上面提到的断言语句。

    TEST()的第一个参数即测试用例的名称,第二个参数为该测试用例中测试实例的名称。两个参数的命名字符必须为C++的合法标志符,并且不能含有下划线“_"。一个测试的全称由测试用例名称和测试实例名称组成。

    2.实例

    光说,大家可能难以理解TEST()的使用方法以及test_case_name和test_name的区别,下面我们来看一个使用TEST()的实例。

    int Factorial(int n); // Returns the factorial of n

    假设Factorial(int n)为我们的被测函数,它的功能是返回n的阶乘即n!,测试函数如下:

    // Tests factorial of 0.
    TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(1, Factorial(0));
    }
    // Tests factorial of positive numbers.
    TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
    }

    FactorialTest为我们测试用例的名称,当然测试用例的名称不一定为XXXTest,只要能说明被测对象即可;HandlesZeroInput和HandlePositiveInput为测试实例的名称,这两个实例同属FactorialTest测试用例,可以任意设定测试实例的名称,但以能体现测试功能的命名方式为佳。

    编译测试代码并执行程序,执行结果如下:

    Running main() from gtest_main.cc
    [==========] Running 2 tests from 1 test case.
    [----------] Global test environment set-up.
    [----------] 2 tests from FactorialTest
    [ RUN ] FactorialTest.HandlesZeroInput
    [ OK ] FactorialTest.HandlesZeroInput (0 ms)
    [ RUN ] FactorialTest.HandlesPositiveInput
    [ OK ] FactorialTest.HandlesPositiveInput (0 ms)
    [----------] 2 tests from FactorialTest (1 ms total)

    [----------] Global test environment tear-down
    [==========] 2 tests from 1 test case ran. (1 ms total)
    [ PASSED ] 2 tests.

    可以看出Gtest以测试用例(TestCase)为单位输出测试结果,在一个测试用例中,列出了其包含的测试实例(Tests),“测试用例名.测试实例名"为一个测试(Test)的全称,例如FactorialTest.HandlesZeroInput。

    小结

    本文介绍了Gtest的断言和TEST()方法,断言是构成Gtest测试代码的基本语句;TEST()可用于函数测试,测试用例(TestCase)可包含多个测试实例(Tests),这种层次结构方便我们对某个测试对象的多个测试实例进行管理。下一节将介绍测试固件(Test fixture),看看Gtest还给我们提供了哪些方法,方便我们进行测试用例的编码和管理:)


    Reference: googletest project

                    《玩转Google开源C++单元测试框架Google Test系列(gtest)》by CoderZh


  • 相关阅读:
    Windows Server 2019 Core 或 hyper-v server 2019图形工具安装
    添加进站允许规则和出站规则命令 netsh advfirewall firewall
    ID 1196 请确保与从属 IP 地址相关联的网络适配器已配置为至少可以访问一个 DNS 服务器
    通过注册表的方式禁用IPV6
    MS-SQL SERVER服务器占用CPU高,用语句先排查。
    hyper-v server 卸载软件(MD-DOS卸载软件)
    除getopenFilename以外。打开文件的另一种方式FileDialog
    返回当前工作簿的目录ThisWorkbook.path & ""
    筛选
    自动填充
  • 原文地址:https://www.cnblogs.com/bangerlee/p/2198347.html
Copyright © 2011-2022 走看看