首先,介绍下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
结果如下:
结果显示所有测试用例都通过了。
版权归原作者 御音strawpp 所有, 如有侵权,请联系我们删除。