Compartilhamento de tecnologia

(Uso privado) teste de unidade gtest

2024-07-12

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

gtest é uma estrutura do Google para escrever testes C++ que podem ser executados em muitas plataformas (incluindo Linux, Mac OS X, Windows, Cygwin, etc.). Baseado na arquitetura xUnit. Ele oferece suporte a muitos recursos úteis, incluindo identificação automática de testes, asserções ricas, personalização de asserções, testes de morte, falha sem término, geração de relatórios XML, etc.

1. vantagens do gtest

2. Construa uma estrutura de teste

endereço de download do gtest:GitHub - google/googletest: GoogleTest - Estrutura de teste e simulação do Google

O método de download é:clone do gitGitHub - google/googletest: GoogleTest - Estrutura de teste e simulação do Google

O método de instalação é:

$ cd googletest

Nota: Se um erro for relatado durante o processo de criação, você poderá adicionar a seguinte linha ao CMakeLists.txt e, em seguida, executar o seguinte comando: SET(CMAKE_CXX_FLAGS "-std=c++11")

$ cmake .

$ fazer

Em seguida, será gerado no diretório lib: libgmock.a libgmock_main.a libgtest.a libgtest_main.a

Finalmente, sudo make install.

demonstração de teste

Estrutura de diretório:

As duas funções a serem testadas são as seguintes:

simples1.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. }

Exemplo de arquivo de cabeçalho.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
Escrever aula de teste

1. Contém os arquivos de cabeçalho gtest/gtest.h, limites.h (int máximo e int mínimo)

2.Formato

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

Pode haver vários casos de teste em um conjunto de testes

por exemplo:

teste_unit.cc simples

  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

realizar testes
Sem principal

  Para implementar a função principal do teste, é claro que não precisamos escrever a função principal, então precisamos nos conectar à biblioteca gtest_main.a (adicionar a opção -lgtest_main ao compilar). Por exemplo, compile assim:

g++ amostra1.cc amostra1_unittest.cc -lgtest -std=c++14 -lgtest_main -lpthread -o teste1

Resultados do:

Com principal

Método de escrita corrigido, adicione main no final

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

Teste completo.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. }

Remova a opção -lgtest_main ao compilar: