Condivisione della tecnologia

(Uso privato) test unitario gtest

2024-07-12

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

gtest è un framework di Google per la scrittura di test C++ che può essere eseguito su molte piattaforme (inclusi Linux, Mac OS X, Windows, Cygwin, ecc.). Basato sull'architettura xUnit. Supporta molte funzionalità utili, tra cui l'identificazione automatica dei test, le asserzioni avanzate, la personalizzazione delle asserzioni, i test di morte, gli errori non terminanti, la generazione di report XML, ecc.

vantaggi 1.gtest

2. Costruisci un framework di test

Indirizzo di download di gtest:GitHub - google/googletest: GoogleTest - Framework di simulazione e test di Google

Il metodo di download è:clonareGitHub - google/googletest: GoogleTest - Framework di simulazione e test di Google

Il metodo di installazione è:

$ cd googletest

Nota: se viene segnalato un errore durante il processo di creazione, è possibile aggiungere la seguente riga a CMakeLists.txt, quindi eseguire il comando seguente: SET(CMAKE_CXX_FLAGS "-std=c++11")

$ cmake .

$ fare

Quindi verrà generato nella directory lib: libgmock.a libgmock_main.a libgtest.a libgtest_main.a

Infine sudo make install.

dimostrazione di prova

Struttura della directory:

Le due funzioni da testare sono le seguenti:

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

File di intestazione campione.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
Scrivi la lezione di prova

1. Contiene i file header gtest/gtest.h, Limits.h (massimo int e minimo int)

2.Formatta

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

Possono esserci più casi di test in una suite di test

per esempio:

semplice_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

effettuare i test
Senza principale

  Per implementare la funzione main del test, ovviamente non abbiamo bisogno di scrivere la funzione main, quindi dobbiamo collegarci alla libreria gtest_main.a (aggiungere l'opzione -lgtest_main durante la compilazione). Ad esempio, compila in questo modo:

g++ campione1.cc campione1_unittest.cc -lgtest -std=c++14 -lgtest_main -lpthread -o test1

Risultati di:

Con principale

Risolto il problema con il metodo di scrittura, aggiungi principale alla fine

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

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

Rimuovi l'opzione -lgtest_main durante la compilazione: