searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Googletest 使用简介

2023-10-26 03:09:20
49
0

按照GTest的官方文档,一些测试的术语跟我们平时的说法有歧义,这里需要注意。 根据官方解释来说:

test是最小的单位(我们一般将官方的test翻译为测试用例,是最小单位),test里面会有多条断言语句。

多个tests分组为test case/test suits(我们应理解为测试用例组),一个test case/test suits往往有多个tests,当然对于某个函数/类的单元测试也可以不需要多个tests。

命名规则:test 名一般由分界点或者等价划分命名,test case/test suites名一般用函数名/类名+Test命名,两者的命名均不能使用下划线。 

首先,我们使用TEST宏(GTest提供了不少宏来定义test,具体可看gtest.h头文件)定义了一个test,希望测试当输入值为正数Positive时阶乘函数Factorial的正确性。其次,在test里面,使用了4个断言,分别对函数输入为1、2、3、8进行断言。

//第一个参数名为测试用例组/test case/test suite名,第二个参数名为测试用例/test名,
 
TEST(FactorialTest, Positive) {
    EXPECT_EQ(1, Factorial(1));  //函数输入参数为1,预期输出也为1
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}

对于GTest来说,上述这个测试用例/test的标准名字为FactorialTest.Positive测试用例组名+.+测试用例名,不同的test suits可以有相同的test名。

安装编译

下载安装

//最新版本v1.13.0,使用cmake安装编译,要求:gcc版本>5.0,且支持C++14
github.com/google/googletest.git
cd googletest        # Main directory of the cloned repository.
mkdir build          # Create a directory to hold the build output.
cd build
cmake ..             # Generate native build scripts for GoogleTest.
make
sudo make install    # Install in /usr/local/ by default

编译

//将编译生成的库、gtest头文件文件夹复制到g++需要找的路径
sudo cp libgtest*.a  /usr/lib    
sudo cp –a include/gtest/ /usr/include     //copy库和gtest

g++ -std=c++11 gtest.cpp -lgtest -lpthread -o gtest.out  //适合ctvs中(GTest3.10.0/gcc 4.9.2)
g++ test.cpp -lgtest -lpthread    //适合高版本GTest3.14.0/gcc/C++14
g++ test.cpp -lgtest_main -lgtest -lpthread //无需自己写main()

 

测试步骤

书写测试函数

#include "sample1.h"    //被测试对象的头文件
#include "gtest/gtest.h"   

//按照Gtest说法,多个TEST宏的执行顺序是不确定的
TEST(FactorialTest, Positive) {
        EXPECT_EQ(1, Factorial(1));
        EXPECT_EQ(2, Factorial(2));
        EXPECT_EQ(6, Factorial(3));
        EXPECT_EQ(40320, Factorial(8));
    } 

//GTest会将tests自动绑定到测试框架,无需用户指定。
int main(int argc,char **argv){
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();  
}

定义测试后,可以使用 RUN_ALL_TESTS() 运行它们,如果所有测试都成功,则返回 0,否则返回 1。请注意,RUN_ALL_TESTS 运行链接单元中的所有测试tests,也即它们可以来自不同的测试套件,甚至是不同的源文件。

在实际使用中,可以通过链接gtest_main.a的静态库,而无需写main函数,使用指令g++ test.cpp -lgtest_main -lgtest -lpthread,如果需要在test suits/test fixture外定义一些操作,可以将这些操作写在自己的main()中.

测试结果

Running main() from /home/googletest/googletest/src/gtest_main.cc
[==========] Running 6 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (0 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
sample1_unittest.cc:116: Failure
Value of: IsPrime(-1)
  Actual: false
Expected: true

sample1_unittest.cc:117: Failure
Value of: IsPrime(-2)
  Actual: false
Expected: true

[  FAILED  ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 5 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] IsPrimeTest.Negative

 1 FAILED TEST

输出测试文档

./a.out --gtest_output=json:test_report.json

 

0条评论
0 / 1000
x****n
2文章数
0粉丝数
x****n
2 文章 | 0 粉丝
x****n
2文章数
0粉丝数
x****n
2 文章 | 0 粉丝
原创

Googletest 使用简介

2023-10-26 03:09:20
49
0

按照GTest的官方文档,一些测试的术语跟我们平时的说法有歧义,这里需要注意。 根据官方解释来说:

test是最小的单位(我们一般将官方的test翻译为测试用例,是最小单位),test里面会有多条断言语句。

多个tests分组为test case/test suits(我们应理解为测试用例组),一个test case/test suits往往有多个tests,当然对于某个函数/类的单元测试也可以不需要多个tests。

命名规则:test 名一般由分界点或者等价划分命名,test case/test suites名一般用函数名/类名+Test命名,两者的命名均不能使用下划线。 

首先,我们使用TEST宏(GTest提供了不少宏来定义test,具体可看gtest.h头文件)定义了一个test,希望测试当输入值为正数Positive时阶乘函数Factorial的正确性。其次,在test里面,使用了4个断言,分别对函数输入为1、2、3、8进行断言。

//第一个参数名为测试用例组/test case/test suite名,第二个参数名为测试用例/test名,
 
TEST(FactorialTest, Positive) {
    EXPECT_EQ(1, Factorial(1));  //函数输入参数为1,预期输出也为1
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}

对于GTest来说,上述这个测试用例/test的标准名字为FactorialTest.Positive测试用例组名+.+测试用例名,不同的test suits可以有相同的test名。

安装编译

下载安装

//最新版本v1.13.0,使用cmake安装编译,要求:gcc版本>5.0,且支持C++14
github.com/google/googletest.git
cd googletest        # Main directory of the cloned repository.
mkdir build          # Create a directory to hold the build output.
cd build
cmake ..             # Generate native build scripts for GoogleTest.
make
sudo make install    # Install in /usr/local/ by default

编译

//将编译生成的库、gtest头文件文件夹复制到g++需要找的路径
sudo cp libgtest*.a  /usr/lib    
sudo cp –a include/gtest/ /usr/include     //copy库和gtest

g++ -std=c++11 gtest.cpp -lgtest -lpthread -o gtest.out  //适合ctvs中(GTest3.10.0/gcc 4.9.2)
g++ test.cpp -lgtest -lpthread    //适合高版本GTest3.14.0/gcc/C++14
g++ test.cpp -lgtest_main -lgtest -lpthread //无需自己写main()

 

测试步骤

书写测试函数

#include "sample1.h"    //被测试对象的头文件
#include "gtest/gtest.h"   

//按照Gtest说法,多个TEST宏的执行顺序是不确定的
TEST(FactorialTest, Positive) {
        EXPECT_EQ(1, Factorial(1));
        EXPECT_EQ(2, Factorial(2));
        EXPECT_EQ(6, Factorial(3));
        EXPECT_EQ(40320, Factorial(8));
    } 

//GTest会将tests自动绑定到测试框架,无需用户指定。
int main(int argc,char **argv){
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();  
}

定义测试后,可以使用 RUN_ALL_TESTS() 运行它们,如果所有测试都成功,则返回 0,否则返回 1。请注意,RUN_ALL_TESTS 运行链接单元中的所有测试tests,也即它们可以来自不同的测试套件,甚至是不同的源文件。

在实际使用中,可以通过链接gtest_main.a的静态库,而无需写main函数,使用指令g++ test.cpp -lgtest_main -lgtest -lpthread,如果需要在test suits/test fixture外定义一些操作,可以将这些操作写在自己的main()中.

测试结果

Running main() from /home/googletest/googletest/src/gtest_main.cc
[==========] Running 6 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (0 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
sample1_unittest.cc:116: Failure
Value of: IsPrime(-1)
  Actual: false
Expected: true

sample1_unittest.cc:117: Failure
Value of: IsPrime(-2)
  Actual: false
Expected: true

[  FAILED  ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 5 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] IsPrimeTest.Negative

 1 FAILED TEST

输出测试文档

./a.out --gtest_output=json:test_report.json

 

文章来自个人专栏
Googltest
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0