Technology Sharing

(For personal use) gtest unit test

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

gtest is a framework for writing C++ tests from Google, which can run on many platforms (including Linux, Mac OS X, Windows, Cygwin, etc.). It is based on the xUnit architecture and supports many useful features, including automatic test identification, rich assertions, assertion customization, death tests, non-terminating failures, XML report generation, etc.

1. Advantages of gtest

2. Build a test framework

gtest download address:GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

The download method is:git clone GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

The installation method is:

$ cd googletest

Note: If an error occurs during the make process, add the following line to CMakeLists.txt and then execute the following command: SET(CMAKE_CXX_FLAGS "-std=c++11")

$ cmake .    

$ make

Then the following files will be generated in the lib directory: libgmock.a libgmock_main.a libgtest.a libgtest_main.a

Finally, we sudo make install.

Test demo

Directory Structure:

The two functions to be tested are as follows:

simple1.cc

  1. #include "sample1.h"
  2. // Returns n! (the factorial of n). For negative n, n! is defined to be 1.
  3. int Factorial(int n) {
  4. int result = 1;
  5. for (int i = 1; i <= n; i++) {
  6. result *= i;
  7. }
  8. return result;
  9. }
  10. // Returns true iff n is a prime number.
  11. bool IsPrime(int n) {
  12. // Trivial case 1: small numbers
  13. if (n <= 1) return false;
  14. // Trivial case 2: even numbers
  15. if (n % 2 == 0) return n == 2;
  16. // Now, we have that n is odd and n >= 3.
  17. // Try to divide n by every odd number i, starting from 3
  18. for (int i = 3; ; i += 2) {
  19. // We only have to try i up to the square root of n
  20. if (i > n/i) break;
  21. // Now, we have i <= n/i < n.
  22. // If n is divisible by i, n is not prime.
  23. if (n % i == 0) return false;
  24. }
  25. // n has no integer factor in the range (1, n), and thus is prime.
  26. return true;
  27. }

Header file sample.h

  1. #ifndef GTEST_SAMPLES_SAMPLE1_H_
  2. #define GTEST_SAMPLES_SAMPLE1_H_
  3. // Returns n! (the factorial of n). For negative n, n! is defined to be 1.
  4. int Factorial(int n);
  5. // Returns true iff n is a prime number.
  6. bool IsPrime(int n);
  7. #endif
Writing test classes

1. Include header files gtest/gtest.h, limits.h (maximum int and minimum int)

2. Format

  1. TEST(测试套名,测试用例名)
  2. {
  3. //EXPECT_XX
  4. }

A test suite can have multiple test cases

eg:

simple_unittest.cc

  1. #include <limits.h>//包含最大最小数
  2. #include "sample1.h"
  3. #include "gtest/gtest.h"//gtest头文件
  4. namespace {
  5. TEST(FactorialTest, Negative) {
  6. // 测试名叫Negative,属于FactorialTest测试套
  7. // 测试用例
  8. EXPECT_EQ(1, Factorial(-5));//断言相等
  9. EXPECT_EQ(1, Factorial(-1));
  10. //前后顺序不影响
  11. EXPECT_GT(Factorial(-10), 0);//断言大于
  12. }
  13. TEST(FactorialTest, Zero) {
  14. EXPECT_EQ(1, Factorial(0));
  15. }
  16. TEST(FactorialTest, Positive) {
  17. EXPECT_EQ(1, Factorial(1));
  18. EXPECT_EQ(2, Factorial(2));
  19. EXPECT_EQ(6, Factorial(3));
  20. EXPECT_EQ(40320, Factorial(8));
  21. }
  22. // Tests IsPrime() 测试是否是素数
  23. TEST(IsPrimeTest, Negative) {
  24. //预测 true or false
  25. EXPECT_FALSE(IsPrime(-1));
  26. EXPECT_FALSE(IsPrime(-2));
  27. EXPECT_FALSE(IsPrime(INT_MIN));
  28. }
  29. TEST(IsPrimeTest, Trivial) {
  30. EXPECT_FALSE(IsPrime(0));
  31. EXPECT_FALSE(IsPrime(1));
  32. EXPECT_TRUE(IsPrime(2));
  33. EXPECT_TRUE(IsPrime(3));
  34. }
  35. TEST(IsPrimeTest, Positive) {
  36. EXPECT_FALSE(IsPrime(4));
  37. EXPECT_TRUE(IsPrime(5));
  38. EXPECT_FALSE(IsPrime(6));
  39. EXPECT_TRUE(IsPrime(23));
  40. }
  41. } // namespace

carry out testing
Without main

 To implement the main function of the test, of course, we don't need to write a main function, then we need to link the gtest_main.a library (add the -lgtest_main option when compiling). For example, compile like this:

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

Results of the:

With main

Fixed writing method, add main at the end

  1. int main(int argc, char** argv)
  2. {
  3. testing::InitGoogleTest(&argc,argv);
  4. return RUN_ALL_TESTS();
  5. }

Complete test.cc:

  1. #include <limits.h>//包含最大最小数
  2. #include "sample1.h"
  3. #include "gtest/gtest.h"//gtest头文件
  4. namespace {
  5. TEST(FactorialTest, Negative) {
  6. // 测试名叫Negative,属于FactorialTest测试套
  7. // 测试用例
  8. EXPECT_EQ(1, Factorial(-5));//断言相等
  9. EXPECT_EQ(1, Factorial(-1));
  10. //前后顺序不影响
  11. EXPECT_GT(Factorial(-10), 0);//断言大于
  12. }
  13. TEST(FactorialTest, Zero) {
  14. EXPECT_EQ(1, Factorial(0));
  15. }
  16. TEST(FactorialTest, Positive) {
  17. EXPECT_EQ(1, Factorial(1));
  18. EXPECT_EQ(2, Factorial(2));
  19. EXPECT_EQ(6, Factorial(3));
  20. EXPECT_EQ(40320, Factorial(8));
  21. }
  22. // Tests IsPrime() 测试是否是素数
  23. TEST(IsPrimeTest, Negative) {
  24. //预测 true or false
  25. EXPECT_FALSE(IsPrime(-1));
  26. EXPECT_FALSE(IsPrime(-2));
  27. EXPECT_FALSE(IsPrime(INT_MIN));
  28. }
  29. TEST(IsPrimeTest, Trivial) {
  30. EXPECT_FALSE(IsPrime(0));
  31. EXPECT_FALSE(IsPrime(1));
  32. EXPECT_TRUE(IsPrime(2));
  33. EXPECT_TRUE(IsPrime(3));
  34. }
  35. TEST(IsPrimeTest, Positive) {
  36. EXPECT_FALSE(IsPrime(4));
  37. EXPECT_TRUE(IsPrime(5));
  38. EXPECT_FALSE(IsPrime(6));
  39. EXPECT_TRUE(IsPrime(23));
  40. }
  41. } // namespace
  42. int main(int argc, char** argv)
  43. {
  44. testing::InitGoogleTest(&argc,argv);
  45. return RUN_ALL_TESTS();
  46. }

Remove the -lgtest_main option when compiling: