Berbagi teknologi

(Penggunaan pribadi) tes unit gtest

2024-07-12

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

gtest adalah framework dari Google untuk menulis pengujian C++ yang dapat dijalankan di banyak platform (termasuk Linux, Mac OS X, Windows, Cygwin, dll.). Berdasarkan arsitektur xUnit. Ini mendukung banyak fitur berguna, termasuk identifikasi pengujian otomatis, pernyataan kaya, penyesuaian pernyataan, pengujian kematian, kegagalan non-terminasi, pembuatan laporan XML, dll.

1. keuntungan teruji

2. Membangun kerangka pengujian

alamat unduhan gtest:GitHub - google/googletest: GoogleTest - Kerangka Pengujian dan Mocking Google

Cara pengunduhannya adalah:klon gitGitHub - google/googletest: GoogleTest - Kerangka Pengujian dan Mocking Google

Metode instalasinya adalah:

$ cd uji google

Catatan: Jika kesalahan dilaporkan selama proses pembuatan, Anda dapat menambahkan baris berikut ke CMakeLists.txt, lalu jalankan perintah berikut: SET(CMAKE_CXX_FLAGS "-std=c++11")

$ cmake .

$ membuat

Kemudian akan dihasilkan di direktori lib: libgmock.a libgmock_main.a libgtest.a libgtest_main.a

Akhirnya kami sudo make install.

demo uji

Struktur Direktori:

Dua fungsi yang akan diuji adalah sebagai berikut:

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

Contoh file header.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
Kelas tes tulis

1. Berisi file header gtest/gtest.h, limit.h (int maksimum dan int minimum)

2.Format

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

Mungkin ada beberapa kasus pengujian dalam satu rangkaian pengujian

misalnya:

uji_unit_sederhana.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

melakukan pengujian
Tanpa utama

  Untuk mengimplementasikan fungsi utama pengujian, tentunya kita tidak perlu menulis fungsi utama, kemudian kita perlu terhubung ke perpustakaan gtest_main.a (tambahkan opsi -lgtest_main saat kompilasi). Misalnya, kompilasi seperti ini:

g++ contoh1.cc contoh1_unittest.cc -lgtest -std=c++14 -lgtest_main -lpthread -o test1

Hasil dari:

Dengan utama

Memperbaiki metode penulisan, tambahkan main di akhir

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

Tes lengkap.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. }

Hapus opsi -lgtest_main saat kompilasi: