0


linux下的gtest单元测试,使用示例

首先,介绍下gtest:

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

然后,动手!

首先将gtest下载到本地ubuntu,执行命令:git clone https://github.com/google/googletest.git

下载完成之后会有一个名外googletest的文件夹

然后进入googletest文件夹,输入命令: cd googletest

然后在输入:cmake

继续输入:make

然后在lib目录下会生成:libgmock.a libgmock_main.a libgtest.a libgtest_main.a

如下图:

最后我们再执行命令:sudo make install

执行此命令后,GoogleTest 会被安装到 /usr/local 或类似的系统目录中。安装后的 GoogleTest 会被系统识别,你只需要使用常规的 g++ 命令来链接库文件,无需手动指定库路径和头文件路径。

到此测试工具配置完成

接下来看看测试案例:

sample1.c文件如下:

(将要被测测试的函数就是该文件下的Factorial函数和IsPrime函数)

#include "sample1.h"

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
//计算n的阶乘
int Factorial(int n) {
  int result = 1;
  for (int i = 1; i <= n; i++) {
    result *= i;
  }
  return result;
}

// Returns true if n is a prime number.
//判断n是否为质数
bool IsPrime(int n) {
  // Trivial case 1: small numbers
  if (n <= 1) return false;

  // Trivial case 2: even numbers
  if (n % 2 == 0) return n == 2;

  // Now, we have that n is odd and n >= 3.

  // Try to divide n by every odd number i, starting from 3
  for (int i = 3; ; i += 2) {
    // We only have to try i up to the square root of n
    if (i > n/i) break;

    // Now, we have i <= n/i < n.
    // If n is divisible by i, n is not prime.
    if (n % i == 0) return false;
  }

  // n has no integer factor in the range (1, n), and thus is prime.
  return true;
}

sample1.h文件内容如下:

主要是对Factorial函数和IsPrime函数的声明

#ifndef GTEST_SAMPLES_SAMPLE1_H_
#define GTEST_SAMPLES_SAMPLE1_H_

// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n);

// Returns true if n is a prime number.
bool IsPrime(int n);

#endif 

uniontest1.c 测试函数如下:

#include <limits.h>
#include "sample1.h"
#include "gtest/gtest.h"
namespace {

TEST(FactorialTest, Negative) {
    // This test is named "Negative", and belongs to the "FactorialTest"
    // test case.
    EXPECT_EQ(1, Factorial(-5));
    EXPECT_EQ(1, Factorial(-1));
    EXPECT_GT(Factorial(-10), 0);
}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}

TEST(FactorialTest, Positive) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}

// Tests IsPrime()
TEST(IsPrimeTest, Negative) {
  EXPECT_FALSE(IsPrime(-1));
  EXPECT_FALSE(IsPrime(-2));
  EXPECT_FALSE(IsPrime(INT_MIN));
}

TEST(IsPrimeTest, Trivial) {
  EXPECT_FALSE(IsPrime(0));
  EXPECT_FALSE(IsPrime(1));
  EXPECT_TRUE(IsPrime(2));
  EXPECT_TRUE(IsPrime(3));
}

TEST(IsPrimeTest, Positive) {
  EXPECT_FALSE(IsPrime(4));
  EXPECT_TRUE(IsPrime(5));
  EXPECT_FALSE(IsPrime(6));
  EXPECT_TRUE(IsPrime(23));
}
}  // namespace

将这三个文件放在同一个文件夹里,我把它放在了demo文件夹下,如下图:

然后运行测试函数,时输入命令:

g++ sample1.c unitest1.c -lgtest -lgtest_main -lpthread -std=c++14 -o test1

命令含义:

gcc:这是 GNU C++ 编译器,用于编译 C++ 源代码。

**

sample1.c unitest1.c

**:这两个是源代码文件,将会被编译。

**

-lgtest

**:这个选项告诉编译器链接 GoogleTest 库(

libgtest.a

)。这是 Google 提供的一个用于单元测试的框架。

**

-lgtest_main

**:这个选项告诉编译器链接

gtest_main

库,它提供了一个默认的

main()

函数,处理运行 GoogleTest 测试的初始化工作。

**

-lpthread

**:这个选项告诉编译器链接 POSIX 线程库(

libpthread.a

)。GoogleTest 可能会用到多线程功能,因此需要链接此库。

**

-std=c++14

**:这个选项指定 C++ 编译标准为 C++14。GoogleTest 需要 C++14 或更高版本的标准,因此你必须确保编译时使用合适的标准。

**

-o test1

**:这个选项指定编译结果生成的可执行文件名为

test1

总结起来,这行命令的目的是编译并链接

sample1.c

unitest1.c

两个源文件,链接 GoogleTest、线程库,并使用 C++14 标准,最终生成名为

test1

的可执行文件。

命令执行成功后会生成 test1可执行程序

然后,运行test1程序,查看测试结果,输入命令:./test1

结果如下:

结果显示所有测试用例都通过了。

标签: 单元测试 c++ linux

本文转载自: https://blog.csdn.net/weixin_63076889/article/details/143727324
版权归原作者 御音strawpp 所有, 如有侵权,请联系我们删除。

“linux下的gtest单元测试,使用示例”的评论:

还没有评论