Linux - gtest测试框架的使用


gtest是Google的一套用于编写C++测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。

一、gtest的优点

  • 测试应该是独立的、可重复的。一个测试的结果不应该作为另一个测试的前提。GTest中每个测试运行在独立的对象中。如果某个测试失败了,可以单独地调试它。
  • 测试应该是有清晰的结构的。GTest的测试有很好的组织结构,易于维护。
  • 测试应该是可移植和可复用的。有很多代码是不依赖平台的,因此它们的测试也需要不依赖于平台。GTest可以在多种操作系统、多种编译器下工作,有很好的可移植性。
  • 测试失败时,应该给出尽可能详尽的信息。GTest在遇到失败时并不停止接下来的测试,而且还可以选择使用非终止的失败来继续执行当前的测试。这样一次可以测试尽可能多的问题。
  • 测试框架应该避免让开发者维护测试框架相关的东西。GTest可以自动识别定义的全部测试,测试人员无需一一列举它们。
  • 测试应该够快。GTest在满足测试独立的前提下,允许复用共享数据,它们只需创建一次。
  • GTest采用的是xUnit架构,这和JUnit、PyUnit很类似,所以上手非常快。

二、gtest开发框架的搭建

gtest下载链接:Google-gtest

  1. 切换权限至root
  2. 执行命令下载gtest:git clone https://github.com/google/googletest.git
  3. 下载成功后切换至googletest目录
  4. 执行命令:cmake .
  5. make
    如果此过程报错,可在CMakeLists.txt中添加如下语句再从第3步开始执行:SET(CMAKE_CXX_FLAGS “-std=c++11”)
  6. 在lib目录下会生成如下文件:libgmock.a libgmock_main.a libgtest.a libgtest_main.a
  7. 执行以下命令,完成安装:make install

三、示例程序

需要对如下程序进行gtest测试:

  1. 头文件(文件名:header.h)如下:
#ifndef _HEADER_H_
#define _HEADER_H_

// 计算阶乘
// 返回值:
//        n < 0: 返回-1
//        n == 0 || n == 1: 返回1
//        n > 1: 返回阶乘结果
int factorial(int n);

// 判断 n 是否是素数
// 返回值:
//        是素数:true
//        不是素数:false
bool isPrime(int n);

#endif  // !_HEADER_H_
  1. 以上头文件(文件名:header.cc)的实现如下:
#include "header.h"

int factorial(int n) {
    if(n < 0) { return -1; }

    if(n == 1) { return 1; }

    int result = 1;
    for(int i = 1; i <= n; ++i) {
        result *= i;
    }

    return result;
}

bool isPrime(int n) {
    if(n < 2) { return false; }

    if(n == 2) { return true; }

    for(int i = 2; i < n / 2; ++i) {
        if(n % 2 == 0) { return false; }
    }

    return true;
}
  1. gtest测试文件(文件名:header_unittest.cc)如下(带main函数):
#include <limits.h>
#include "header.h"
#include <gtest/gtest.h>

namespace {

	// header.h factorial 阶乘函数测试
	/******************************************************************
	 * 说明:
	 * 1. TEST() - gtest的测试宏
	 * 2. FactorialTest - 测试套的名字
	 * 3. Negative - 测试用例名称
	 * 4. EXPECT_EQ、EXPECT_FALSE等是gtest提供的测试断言;例如:EXPECT_EQ(-1,factorial(-1))表示-1和factorial(-1)的值是相等的,如果最后的结果的确相等则成功,否则失败。
	*******************************************************************/
	TEST(FactorialTest, Negative) {
	    EXPECT_EQ(-1, factorial(-1)); // factorial
	    EXPECT_EQ(-1, factorial(-2));
	    EXPECT_EQ(-1, factorial(-3));
	    EXPECT_EQ(-1, factorial(-10));
	    EXPECT_EQ(-1, factorial(-2147483648));
	}
	
	TEST(FactorialTest, Zero) {
	    EXPECT_EQ(1, factorial(0));
	}
	
	TEST(FactorialTest, Positive) {
	    EXPECT_EQ(1, factorial(1));
	    EXPECT_EQ(2, factorial(2));
	    EXPECT_EQ(120, factorial(5));
	    EXPECT_EQ(3628800, factorial(10));
	}
	
	// header.h isPrime 判断是否是素数
	TEST(PrimeTest, Negative) {
	    EXPECT_FALSE(isPrime(-1));
	    EXPECT_FALSE(isPrime(-100));
	}
	
	TEST(PrimeTest, ZERO) {
	    EXPECT_FALSE(isPrime(0));
	}
	
	TEST(PrimeTest, Positive) {
	    EXPECT_FALSE(isPrime(1));
	
	    EXPECT_TRUE(isPrime(2));
	    EXPECT_TRUE(isPrime(3));
	    EXPECT_FALSE(isPrime(100));
	}

}

int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译命令如下:g++ header_unittest.cc header.cc -lgtest -std=c++11 -lpthread -o unittest

  1. gtest测试文件(文件名:header_unittest_1.cc)实现如下(不带main函数):
#include <limits.h>
#include "header.h"
#include <gtest/gtest.h>

namespace {
	
	// header.h factorial 阶乘函数测试
	/******************************************************************
	 * 说明:
	 * 1. TEST() - gtest的测试宏
	 * 2. FactorialTest - 测试套的名字
	 * 3. Negative - 测试用例名称
	 * 4. EXPECT_EQ、EXPECT_FALSE等是gtest提供的测试断言;例如:EXPECT_EQ(-1,factorial(-1))表示-1和factorial(-1)的值是相等的,如果最后的结果的确相等则成功,否则失败。
	*******************************************************************/
	TEST(FactorialTest, Negative) {
	    EXPECT_EQ(-1, factorial(-1)); // factorial
	    EXPECT_EQ(-1, factorial(-2));
	    EXPECT_EQ(-1, factorial(-3));
	    EXPECT_EQ(-1, factorial(-10));
	    EXPECT_EQ(-1, factorial(-2147483648));
	}
	
	TEST(FactorialTest, Zero) {
	    EXPECT_EQ(1, factorial(0));
	}
	
	TEST(FactorialTest, Positive) {
	    EXPECT_EQ(1, factorial(1));
	    EXPECT_EQ(2, factorial(2));
	    EXPECT_EQ(120, factorial(5));
	    EXPECT_EQ(3628800, factorial(10));
	}
	
	// header.h isPrime 判断是否是素数
	TEST(PrimeTest, Negative) {
	    EXPECT_FALSE(isPrime(-1));
	    EXPECT_FALSE(isPrime(-100));
	}
	
	TEST(PrimeTest, ZERO) {
	    EXPECT_FALSE(isPrime(0));
	}
	
	TEST(PrimeTest, Positive) {
	    EXPECT_FALSE(isPrime(1));
	
	    EXPECT_TRUE(isPrime(2));
	    EXPECT_TRUE(isPrime(3));
	    EXPECT_FALSE(isPrime(100));
	}

}

编译命令如下:g++ header_unittest_1.cc header.cc -lgtest -std=c++11 -lgtest_main -lpthread -o unittest

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用gtest测试框架实现快速排序的示例代码: ```c++ #include <gtest/gtest.h> void quickSort(int arr[], int left, int right) { int i = left, j = right; int tmp; int pivot = arr[(left + right) / 2]; // partition while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; // recursion if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); } TEST(QuickSortTest, PositiveNos) { int arr[] = { 5, 2, 3, 1, 4 }; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); ASSERT_EQ(arr[0], 1); ASSERT_EQ(arr[1], 2); ASSERT_EQ(arr[2], 3); ASSERT_EQ(arr[3], 4); ASSERT_EQ(arr[4], 5); } TEST(QuickSortTest, NegativeNos) { int arr[] = { -5, -2, -3, -1, -4 }; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); ASSERT_EQ(arr[0], -5); ASSERT_EQ(arr[1], -4); ASSERT_EQ(arr[2], -3); ASSERT_EQ(arr[3], -2); ASSERT_EQ(arr[4], -1); } TEST(QuickSortTest, MixedNos) { int arr[] = { -5, 2, -3, 1, 0 }; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); ASSERT_EQ(arr[0], -5); ASSERT_EQ(arr[1], -3); ASSERT_EQ(arr[2], 0); ASSERT_EQ(arr[3], 1); ASSERT_EQ(arr[4], 2); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` 在这个示例代码中,我们使用gtest测试框架测试快速排序函数quickSort。我们定义了三个测试用例,分别测试了正数、负数和混合数的情况。在每个测试用例中,我们使用ASSERT_EQ宏来断言排序后数组的每个元素是否与预期值相等。如果不相等,则测试失败。 注意,这里的示例代码仅供参考,实际实现中可能需要根据具体情况进行相应修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值