C++ 单元测试与代码覆盖率测试方法( 二 )


如果使用演示项目 , 读者将不需要手动处理 Test的编译和安装工作 。
使用 Test
演示项目代码说明
为了便于下文说明 , 演示项目中包含了几个简单的函数 。
演示项目中的软件库包含一个头文件和一个实现文件 。头文件内容如下:
// utility.h?#ifndef INCLUDE_UTILITY_#define INCLUDE_UTILITY_?enum CalcType {ADD,MINUS,MULTIPLE,DIVIDE};?class Utility {public:int ArithmeticCalculation(CalcType op, int a, int b);?double ArithmeticCalculation(CalcType op, double a, double b);?bool IsLeapYear(int year);};?#endif
这个头文件说明如下:
这三个函数的实现也不复杂:
// utility.cpp?#include "utility.h"?#include #include ?using namespace std;?int Utility::ArithmeticCalculation(CalcType op, int a, int b) {if (op == ADD) {return a + b;} else if (op == MINUS) {return a - b;} else if (op == MULTIPLE) {return a * b;} else {if (b == 0) {cout << "CANNO Divided by 0" << endl;return std::numeric_limits::max();}return a / b;}}?double Utility::ArithmeticCalculation(CalcType op, double a, double b) {if (op == ADD) {return a + b;} else if (op == MINUS) {return a - b;} else if (op == MULTIPLE) {return a * b;} else {if (b == 0) {cout << "CANNO Divided by 0" << endl;return std::numeric_limits::max();}return a / b;}}?bool Utility::IsLeapYear(int year) {if (year % 100 == 0 && year % 400 == 0) {return true;}if (year % 100 != 0 && year % 4 == 0) {return true;}return false;}
开始测试
接下来我们就要对上面这些代码进行测试了 。
要使用 Test进行测试 , 整个过程也非常的简单 。只要进行下面三部:
创建一个测试用的cpp文件
为上面这个测试用的cpp文件编写(或者CMake文件) 。同时链接:
编写测试代码 , 编译并运行测试的可执行程序 。
并且 , 测试代码写起来也非常的简单 , 像下面这样:
#include "utility.h"?#include "gtest/gtest.h"?TEST(TestCalculationInt, ArithmeticCalculationInt) {Utility util;EXPECT_EQ(util.ArithmeticCalculation(ADD, 1, 1), 2);EXPECT_EQ(util.ArithmeticCalculation(MINUS, 2, 1), 1);EXPECT_EQ(util.ArithmeticCalculation(MULTIPLE, 3, 3), 9);EXPECT_EQ(util.ArithmeticCalculation(DIVIDE, 10, 2), 5);EXPECT_GT(util.ArithmeticCalculation(DIVIDE, 10, 0), 999999999);}
是的 , 就是这么简单的几行代码 , 就对整数四则运算的函数进行了测试 。
TEST后面所包含的内容称之为一条case , 通常我们会为每个函数创建一个独立的case来进行测试 。一个测试文件中可以包含很多条case 。同时 , 一条case中会包含很多的判断(例如...) 。
注意:在做单元测试的时候 , 保证每条case是独立的 , case之间没有前后依赖关系是非常重要的 。
当然 , 测试代码中包含的判断的多少将影响测试结果的覆盖率 。所以在编写每条case的时候 , 我们需要仔细思考待测试函数的可能性 , 有针对性的进行测试代码的编写 。
这段代码应该很好理解 , 它分别进行了下面这些测试:
你可能会发现 , 这段代码里面甚至没有main函数 。它也依然可以生成一个可执行文件 。这就是我们链接所起的作用 。
在实际的测试过程中 , 你想判断的情况可能不止上面这么简单 。下面我们来看看 Test还能做哪些测试 。
测试判断
Test对于结果的判断 , 有两种形式:
可以进行的判断方法主要有下面这些:
对于条件判断可以使用:
ASSERT_TRUE(condition);// 判断条件是否为真ASSERT_FALSE(condition); // 判断条件是否为假