Memulai dengan CppUTest
Burung
14 Mei 2017
1 min read

Intisari Utama
CppUTest adalah kerangka kerja pengujian gaya xUnit yang ringan dan terus dipelihara untuk C/C++, dengan lapisan integrasi C yang berfungsi dengan lancar bahkan dalam basis kode yang banyak mengandung C.
Anda dapat menginstalnya melalui manajer paket (distro Linux, Homebrew) atau menggandakan repo GitHub.
Pengaturan minimal terdiri dari:
direktori produksi
src/,direktori pengujian
t/,test runner (
CommandLineTestRunner), danmodul pengujian menggunakan blok
TEST_GROUPdanTEST().
CppUTest menyediakan alat bantu MakefileWorker.mk yang menyederhanakan pembuatan pengujian, penghubungan perpustakaan, dan penanganan bendera.
Pendeteksian kebocoran memori diaktifkan secara default melalui penggantian malloc/free, menangkap kebocoran dalam kode sumber yang diuji.
Cakupan kode melalui gcov terintegrasi dengan mudah dengan mengaktifkan
CPPUTEST_USE_GCOV=Y, menghasilkan laporan cakupan penuh dan ringkasan HTML.Kerangka ini mencakup fitur-fitur canggih: mocking, plugin, skrip bantuan, dan interoperabilitas C langsung — berguna untuk basis kode perusahaan yang kompleks.
Sorotan Q&A
Apa itu CppUTest dan mengapa menggunakannya?
Ini adalah kerangka pengujian gaya xUnit yang kuat untuk C/C++ dengan API bersih, makro asersi bawaan, deteksi kebocoran, dan pengembangan aktif — ideal untuk sistem warisan atau modern.
Bagaimana cara Anda menyusun proyek dasar menggunakan CppUTest?
src/ code/ code.cpp code.h main.cpp t/ main.cpp (test runner) test.cpp (test suite)
Bagaimana Anda menjalankan semua tes?
Test runner menggunakan:
return CommandLineTestRunner::RunAllTests(ac, av);
Bagaimana Anda membuat tes tanpa secara manual mengonfigurasi opsi compiler?
Gunakan
MakefileWorker.mkdari CppUTest, yang menangani flags, linking, dan eksekusi tes secara otomatis.Dapatkah CppUTest mendeteksi kebocoran memori secara otomatis?
Ya. Ini menggantikan malloc/free selama uji coba, melaporkan:
tes mana yang bocor,
di mana itu terjadi,
ukuran kebocoran dan isi memori.
Contoh keluaran kegagalan:
Memory leak(s) found. Allocated at: code.c line 6 Leak size: 1
Bagaimana cara saya menghasilkan code coverage?
Aktifkan:
CPPUTEST_USE_GCOV=YPastikan
filterGcov.shtersedia di$(CPPUTEST_HOME)/scripts/.Jalankan: buat
gcovIni menghasilkan laporan
.gcov, teks ringkasan, dan laporan jangkauan HTML.
Apa lagi yang dapat dilakukan CppUTest di luar pengujian dasar?
kerangka kerja mocking
sistem plugin
skrip otomatisasi pembantu
integrasi C native
makro asersi ekstensif
Untuk siapa CppUTest paling cocok?
Tim yang bekerja dengan sistem tertanam, platform C, layanan C++, atau lingkungan apa pun di mana keandalan dan keamanan memori harus divalidasi secara kontinu.
Di SparkPost, kami menghabiskan banyak waktu dan usaha untuk menguji kode kami. Platform kami ditulis dalam C, dan baru-baru ini saya meneliti integrasi dengan kerangka pengujian unit yang disebut “CppUTest”, yang menyediakan pengujian gaya xUnit untuk C/C++. Kerangka ini kuat, kaya fitur, dan sedang dalam pengembangan aktif, yang menjadikannya pilihan yang bagus. Ini juga menyediakan lapisan integrasi C yang membuatnya mudah digunakan dengan kode C platform kami meskipun sebagian besar kerangka kerja adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest pada proyek Anda sendiri.
Di SparkPost, kami menghabiskan banyak waktu dan usaha untuk menguji kode kami. Platform kami ditulis dalam C, dan baru-baru ini saya meneliti integrasi dengan kerangka pengujian unit yang disebut “CppUTest”, yang menyediakan pengujian gaya xUnit untuk C/C++. Kerangka ini kuat, kaya fitur, dan sedang dalam pengembangan aktif, yang menjadikannya pilihan yang bagus. Ini juga menyediakan lapisan integrasi C yang membuatnya mudah digunakan dengan kode C platform kami meskipun sebagian besar kerangka kerja adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest pada proyek Anda sendiri.
Di SparkPost, kami menghabiskan banyak waktu dan usaha untuk menguji kode kami. Platform kami ditulis dalam C, dan baru-baru ini saya meneliti integrasi dengan kerangka pengujian unit yang disebut “CppUTest”, yang menyediakan pengujian gaya xUnit untuk C/C++. Kerangka ini kuat, kaya fitur, dan sedang dalam pengembangan aktif, yang menjadikannya pilihan yang bagus. Ini juga menyediakan lapisan integrasi C yang membuatnya mudah digunakan dengan kode C platform kami meskipun sebagian besar kerangka kerja adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest pada proyek Anda sendiri.
Mengunduh CppUTest
Halaman proyek CppUTest tersedia di situs resmi, dan repositorinya ada di github. Ini juga termasuk dalam repositori manajemen paket untuk banyak distro linux, serta homebrew di Mac OS. Contoh-contoh berikut dieksekusi di Mac OS X, tetapi mereka berasal dari kode yang ditulis untuk Red Hat, OS tempat platform kami berjalan.
Dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan dengan cepat melewati itu dan menuju beberapa fitur yang lebih menarik.
Halaman proyek CppUTest tersedia di situs resmi, dan repositorinya ada di github. Ini juga termasuk dalam repositori manajemen paket untuk banyak distro linux, serta homebrew di Mac OS. Contoh-contoh berikut dieksekusi di Mac OS X, tetapi mereka berasal dari kode yang ditulis untuk Red Hat, OS tempat platform kami berjalan.
Dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan dengan cepat melewati itu dan menuju beberapa fitur yang lebih menarik.
Halaman proyek CppUTest tersedia di situs resmi, dan repositorinya ada di github. Ini juga termasuk dalam repositori manajemen paket untuk banyak distro linux, serta homebrew di Mac OS. Contoh-contoh berikut dieksekusi di Mac OS X, tetapi mereka berasal dari kode yang ditulis untuk Red Hat, OS tempat platform kami berjalan.
Dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan dengan cepat melewati itu dan menuju beberapa fitur yang lebih menarik.
Membangun Fondasi
Hal pertama pertama, ayo kita menulis kode!
Proyek uji kita akan memiliki file ‘main’ dan akan menyertakan sebuah pustaka utilitas yang disebut ‘code’. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk sementara). File-file akan disusun seperti ini:
├── src │ ├── code │ │ ├── code.cpp │ │ └── code.h │ └── main.cpp └── t ├── main.cpp └── test.cpp
Mari kita mulai dengan menulis file src/
// src/main.cpp #include <stdlib.h> #include <stdio.h> #include "code.h" int main(void) { test_func(); printf("hello world!\n"); exit(0); }
// src/code/code.cpp #include <stdlib.h> #include "code.h" int test_func() { return 1; }
// src/code/code.h #ifndef __code_h__ #define __code_h__ int test_func(); #endif
Sekarang, mari lakukan tes, yang akan berada di direktori t/. Hal pertama yang harus dilakukan adalah menyiapkan test runner yang akan menjalankan file uji kita. Ini juga merupakan fungsi ‘main’ yang akan dieksekusi setelah semua ini dikompilasi:
// t/main.cpp #include "CppUTest/CommandLineTestRunner.h" int main(int ac, char** av) { return CommandLineTestRunner::RunAllTests(ac, av); }
Sekarang kita bisa menulis modul uji pertama kita:
// t/test.cpp #include "CppUTest/TestHarness.h" #include "code.h" TEST_GROUP(AwesomeExamples) { }; TEST(AwesomeExamples, FirstExample) { int x = test_func(); CHECK_EQUAL(1, x); }
Selanjutnya, kita perlu menulis makefiles. Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk tes.
Hal pertama pertama, ayo kita menulis kode!
Proyek uji kita akan memiliki file ‘main’ dan akan menyertakan sebuah pustaka utilitas yang disebut ‘code’. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk sementara). File-file akan disusun seperti ini:
├── src │ ├── code │ │ ├── code.cpp │ │ └── code.h │ └── main.cpp └── t ├── main.cpp └── test.cpp
Mari kita mulai dengan menulis file src/
// src/main.cpp #include <stdlib.h> #include <stdio.h> #include "code.h" int main(void) { test_func(); printf("hello world!\n"); exit(0); }
// src/code/code.cpp #include <stdlib.h> #include "code.h" int test_func() { return 1; }
// src/code/code.h #ifndef __code_h__ #define __code_h__ int test_func(); #endif
Sekarang, mari lakukan tes, yang akan berada di direktori t/. Hal pertama yang harus dilakukan adalah menyiapkan test runner yang akan menjalankan file uji kita. Ini juga merupakan fungsi ‘main’ yang akan dieksekusi setelah semua ini dikompilasi:
// t/main.cpp #include "CppUTest/CommandLineTestRunner.h" int main(int ac, char** av) { return CommandLineTestRunner::RunAllTests(ac, av); }
Sekarang kita bisa menulis modul uji pertama kita:
// t/test.cpp #include "CppUTest/TestHarness.h" #include "code.h" TEST_GROUP(AwesomeExamples) { }; TEST(AwesomeExamples, FirstExample) { int x = test_func(); CHECK_EQUAL(1, x); }
Selanjutnya, kita perlu menulis makefiles. Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk tes.
Hal pertama pertama, ayo kita menulis kode!
Proyek uji kita akan memiliki file ‘main’ dan akan menyertakan sebuah pustaka utilitas yang disebut ‘code’. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk sementara). File-file akan disusun seperti ini:
├── src │ ├── code │ │ ├── code.cpp │ │ └── code.h │ └── main.cpp └── t ├── main.cpp └── test.cpp
Mari kita mulai dengan menulis file src/
// src/main.cpp #include <stdlib.h> #include <stdio.h> #include "code.h" int main(void) { test_func(); printf("hello world!\n"); exit(0); }
// src/code/code.cpp #include <stdlib.h> #include "code.h" int test_func() { return 1; }
// src/code/code.h #ifndef __code_h__ #define __code_h__ int test_func(); #endif
Sekarang, mari lakukan tes, yang akan berada di direktori t/. Hal pertama yang harus dilakukan adalah menyiapkan test runner yang akan menjalankan file uji kita. Ini juga merupakan fungsi ‘main’ yang akan dieksekusi setelah semua ini dikompilasi:
// t/main.cpp #include "CppUTest/CommandLineTestRunner.h" int main(int ac, char** av) { return CommandLineTestRunner::RunAllTests(ac, av); }
Sekarang kita bisa menulis modul uji pertama kita:
// t/test.cpp #include "CppUTest/TestHarness.h" #include "code.h" TEST_GROUP(AwesomeExamples) { }; TEST(AwesomeExamples, FirstExample) { int x = test_func(); CHECK_EQUAL(1, x); }
Selanjutnya, kita perlu menulis makefiles. Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk tes.
Project Makefile
File make proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Ini seharusnya terlihat seperti ini:
# Makefile SRC_DIR = ./src CODE_DIR = $(SRC_DIR)/code OUT = example TEST_DIR = t test: make -C $(TEST_DIR) test_clean: make -C $(TEST_DIR) clean code.o: gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o main: code.o gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT) all: test main clean: test_clean rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)
Perhatikan bahwa ini menggunakan ‘make -C’ untuk target uji – artinya ini akan memanggil ‘make’ sekali lagi menggunakan makefile di direktori uji.
Pada titik ini kita dapat mengompilasi kode ‘src’ dengan makefile dan melihat bahwa itu berfungsi:
[]$ make main gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example []$ ./example hello world
File make proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Ini seharusnya terlihat seperti ini:
# Makefile SRC_DIR = ./src CODE_DIR = $(SRC_DIR)/code OUT = example TEST_DIR = t test: make -C $(TEST_DIR) test_clean: make -C $(TEST_DIR) clean code.o: gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o main: code.o gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT) all: test main clean: test_clean rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)
Perhatikan bahwa ini menggunakan ‘make -C’ untuk target uji – artinya ini akan memanggil ‘make’ sekali lagi menggunakan makefile di direktori uji.
Pada titik ini kita dapat mengompilasi kode ‘src’ dengan makefile dan melihat bahwa itu berfungsi:
[]$ make main gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example []$ ./example hello world
File make proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Ini seharusnya terlihat seperti ini:
# Makefile SRC_DIR = ./src CODE_DIR = $(SRC_DIR)/code OUT = example TEST_DIR = t test: make -C $(TEST_DIR) test_clean: make -C $(TEST_DIR) clean code.o: gcc -c -I$(CODE_DIR) $(CODE_DIR)/code.cpp -o $(CODE_DIR)/code.o main: code.o gcc -I$(CODE_DIR) $(CODE_DIR)/code.o $(SRC_DIR)/main.cpp -o $(OUT) all: test main clean: test_clean rm $(SRC_DIR)/*.o $(CODE_DIR)/*.o $(OUT)
Perhatikan bahwa ini menggunakan ‘make -C’ untuk target uji – artinya ini akan memanggil ‘make’ sekali lagi menggunakan makefile di direktori uji.
Pada titik ini kita dapat mengompilasi kode ‘src’ dengan makefile dan melihat bahwa itu berfungsi:
[]$ make main gcc -c -I./src/code ./src/code/code.cpp -o ./src/code/code.o gcc -I./src/code ./src/code/code.o ./src/main.cpp -o example []$ ./example hello world
Tests Makefile
Untuk pengujian, langkah-langkahnya sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan perpustakaan CppUTest secara tepat.
Repositori CppUTest menyediakan sebuah file bernama “MakefileWorker.mk”. File ini menyediakan banyak fungsionalitas yang membuat proses pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan bahwa file ini telah disalin ke direktori ‘t/’. File ini dapat digunakan sebagai berikut:
# we don’t want to use relative paths, so we set these variables PROJECT_DIR=/path/to/project SRC_DIR=$(PROJECT_DIR)/src TEST_DIR=$(PROJECT_DIR)/t # specify where the source code and includes are located INCLUDE_DIRS=$(SRC_DIR)/code SRC_DIRS=$(SRC_DIR)/code # specify where the test code is located TEST_SRC_DIRS=$(TEST_DIR) # what to call the test binary TEST_TARGET=example # where the cpputest library is located CPPUTEST_HOME=/usr/local # run MakefileWorker.mk with the variables defined here include MakefileWorker.mk
Perhatikan bahwa CPPUTEST_HOME harus diatur sesuai lokasi tempat CppUTest diinstal. Jika Anda telah menginstal paket distro, lokasi ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah melakukan checkout repositori sendiri, lokasinya adalah tempat checkout itu berada.
Opsi-opsi ini semuanya didokumentasikan dalam MakefileWorker.mk.
MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:
all – membangun pengujian yang ditunjukkan oleh makefile
clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian
realclean – menghapus berkas objek atau gcov di seluruh pohon direktori
flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian
debug – mencantumkan semua berkas sumber, objek, dependensi, dan 'hal yang harus dibersihkan'
Untuk pengujian, langkah-langkahnya sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan perpustakaan CppUTest secara tepat.
Repositori CppUTest menyediakan sebuah file bernama “MakefileWorker.mk”. File ini menyediakan banyak fungsionalitas yang membuat proses pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan bahwa file ini telah disalin ke direktori ‘t/’. File ini dapat digunakan sebagai berikut:
# we don’t want to use relative paths, so we set these variables PROJECT_DIR=/path/to/project SRC_DIR=$(PROJECT_DIR)/src TEST_DIR=$(PROJECT_DIR)/t # specify where the source code and includes are located INCLUDE_DIRS=$(SRC_DIR)/code SRC_DIRS=$(SRC_DIR)/code # specify where the test code is located TEST_SRC_DIRS=$(TEST_DIR) # what to call the test binary TEST_TARGET=example # where the cpputest library is located CPPUTEST_HOME=/usr/local # run MakefileWorker.mk with the variables defined here include MakefileWorker.mk
Perhatikan bahwa CPPUTEST_HOME harus diatur sesuai lokasi tempat CppUTest diinstal. Jika Anda telah menginstal paket distro, lokasi ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah melakukan checkout repositori sendiri, lokasinya adalah tempat checkout itu berada.
Opsi-opsi ini semuanya didokumentasikan dalam MakefileWorker.mk.
MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:
all – membangun pengujian yang ditunjukkan oleh makefile
clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian
realclean – menghapus berkas objek atau gcov di seluruh pohon direktori
flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian
debug – mencantumkan semua berkas sumber, objek, dependensi, dan 'hal yang harus dibersihkan'
Untuk pengujian, langkah-langkahnya sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan perpustakaan CppUTest secara tepat.
Repositori CppUTest menyediakan sebuah file bernama “MakefileWorker.mk”. File ini menyediakan banyak fungsionalitas yang membuat proses pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan bahwa file ini telah disalin ke direktori ‘t/’. File ini dapat digunakan sebagai berikut:
# we don’t want to use relative paths, so we set these variables PROJECT_DIR=/path/to/project SRC_DIR=$(PROJECT_DIR)/src TEST_DIR=$(PROJECT_DIR)/t # specify where the source code and includes are located INCLUDE_DIRS=$(SRC_DIR)/code SRC_DIRS=$(SRC_DIR)/code # specify where the test code is located TEST_SRC_DIRS=$(TEST_DIR) # what to call the test binary TEST_TARGET=example # where the cpputest library is located CPPUTEST_HOME=/usr/local # run MakefileWorker.mk with the variables defined here include MakefileWorker.mk
Perhatikan bahwa CPPUTEST_HOME harus diatur sesuai lokasi tempat CppUTest diinstal. Jika Anda telah menginstal paket distro, lokasi ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah melakukan checkout repositori sendiri, lokasinya adalah tempat checkout itu berada.
Opsi-opsi ini semuanya didokumentasikan dalam MakefileWorker.mk.
MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:
all – membangun pengujian yang ditunjukkan oleh makefile
clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian
realclean – menghapus berkas objek atau gcov di seluruh pohon direktori
flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian
debug – mencantumkan semua berkas sumber, objek, dependensi, dan 'hal yang harus dibersihkan'
Code Coverage
Pengujian unit tidak akan lengkap tanpa laporan cakupan. Alat yang biasa digunakan untuk proyek yang menggunakan gcc adalah gcov, tersedia sebagai bagian dari rangkaian utilitas standar gcc. Cpputest mudah diintegrasikan dengan gcov, Anda hanya perlu menambahkan baris ini ke dalam makefile:
CPPUTEST_USE_GCOV=Y
Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repo ini ada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda mengatur ‘CPPUTEST_HOME’. Skrip tersebut juga harus memiliki izin eksekusi.
Dalam Makefile contoh, skrip itu akan ditempatkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repo, semuanya seharusnya berjalan tanpa modifikasi.
Dengan itu, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kita perlu ‘make -B’ untuk membangun ulang file objek dengan gcov diaktifkan:
[]$ make -B gcov < compilation output > for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \ FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \ gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \ done for f in ; do \ gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \ done /usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt cat gcov_report.txt 100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp mkdir -p gcov mv *.gcov gcov mv gcov_* gcov See gcov directory for details
Ini akan menghasilkan sejumlah file ke direktori ‘gcov’ baru. File-file tersebut adalah:
code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji
gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)
gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan
gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji
gcov_report.txt.html – versi html dari gcov_report
Pengujian unit tidak akan lengkap tanpa laporan cakupan. Alat yang biasa digunakan untuk proyek yang menggunakan gcc adalah gcov, tersedia sebagai bagian dari rangkaian utilitas standar gcc. Cpputest mudah diintegrasikan dengan gcov, Anda hanya perlu menambahkan baris ini ke dalam makefile:
CPPUTEST_USE_GCOV=Y
Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repo ini ada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda mengatur ‘CPPUTEST_HOME’. Skrip tersebut juga harus memiliki izin eksekusi.
Dalam Makefile contoh, skrip itu akan ditempatkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repo, semuanya seharusnya berjalan tanpa modifikasi.
Dengan itu, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kita perlu ‘make -B’ untuk membangun ulang file objek dengan gcov diaktifkan:
[]$ make -B gcov < compilation output > for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \ FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \ gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \ done for f in ; do \ gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \ done /usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt cat gcov_report.txt 100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp mkdir -p gcov mv *.gcov gcov mv gcov_* gcov See gcov directory for details
Ini akan menghasilkan sejumlah file ke direktori ‘gcov’ baru. File-file tersebut adalah:
code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji
gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)
gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan
gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji
gcov_report.txt.html – versi html dari gcov_report
Pengujian unit tidak akan lengkap tanpa laporan cakupan. Alat yang biasa digunakan untuk proyek yang menggunakan gcc adalah gcov, tersedia sebagai bagian dari rangkaian utilitas standar gcc. Cpputest mudah diintegrasikan dengan gcov, Anda hanya perlu menambahkan baris ini ke dalam makefile:
CPPUTEST_USE_GCOV=Y
Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repo ini ada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda mengatur ‘CPPUTEST_HOME’. Skrip tersebut juga harus memiliki izin eksekusi.
Dalam Makefile contoh, skrip itu akan ditempatkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repo, semuanya seharusnya berjalan tanpa modifikasi.
Dengan itu, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kita perlu ‘make -B’ untuk membangun ulang file objek dengan gcov diaktifkan:
[]$ make -B gcov < compilation output > for d in /Users/ykuperman/code/blogpost/qa/src/code ; do \ FILES=`ls $d/*.c $d/*.cc $d/*.cpp 2> /dev/null` ; \ gcov --object-directory objs/$d $FILES >> gcov_output.txt 2>>gcov_error.txt ; \ done for f in ; do \ gcov --object-directory objs/$f $f >> gcov_output.txt 2>>gcov_error.txt ; \ done /usr/local/scripts/filterGcov.sh gcov_output.txt gcov_error.txt gcov_report.txt example.txt cat gcov_report.txt 100.00% /Users/ykuperman/code/blogpost/qa/src/code/code.cpp mkdir -p gcov mv *.gcov gcov mv gcov_* gcov See gcov directory for details
Ini akan menghasilkan sejumlah file ke direktori ‘gcov’ baru. File-file tersebut adalah:
code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji
gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)
gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan
gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji
gcov_report.txt.html – versi html dari gcov_report
Cpputest Memory Leak Detection
Cpputest memungkinkan Anda secara otomatis mendeteksi kebocoran memori dengan mendefinisikan ulang fungsi keluarga “malloc/free” standar untuk menggunakan pembungkus miliknya. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.
Untuk ilustrasi, mari kita bocorkan beberapa memori di test_func() !
Kembali ke code.c, kita tambahkan malloc() ke fungsi, seperti ini:
int test_func() { malloc(1); return 1; }
Sekarang, setelah dikompilasi ulang, kesalahan berikut terjadi:
test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample) Memory leak(s) found. Alloc num (4) Leak size: 1 Allocated at: ./code.c and line: 6 Type: "malloc" Memory: <
Ini menunjukkan tes mana yang menyebabkan kebocoran, di mana kebocoran terjadi dalam kode sumber, dan apa yang ada di dalam memori yang bocor. Sangat membantu!
Ada beberapa hal yang perlu diperhatikan dengan fitur ini:
Cpputest menggunakan makro preprocessor untuk secara dinamis mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar. Itu berarti ini hanya akan bekerja untuk panggilan dalam kode sumber yang sedang diuji karena itu yang dikompilasi dengan pengganti CppUTest. Kebocoran dalam perpustakaan terhubung tidak akan tertangkap.
Terkadang memori yang dialokasikan untuk seluruh masa hidup proses tidak dimaksudkan untuk dibebaskan. Ini dapat menghasilkan banyak kesalahan spam jika Anda menguji modul dengan perilaku ini. Untuk menonaktifkan deteksi kebocoran, Anda dapat melakukan ini:
CPPUTEST_USE_MEM_LEAK_DETECTION=N
Cpputest memungkinkan Anda secara otomatis mendeteksi kebocoran memori dengan mendefinisikan ulang fungsi keluarga “malloc/free” standar untuk menggunakan pembungkus miliknya. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.
Untuk ilustrasi, mari kita bocorkan beberapa memori di test_func() !
Kembali ke code.c, kita tambahkan malloc() ke fungsi, seperti ini:
int test_func() { malloc(1); return 1; }
Sekarang, setelah dikompilasi ulang, kesalahan berikut terjadi:
test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample) Memory leak(s) found. Alloc num (4) Leak size: 1 Allocated at: ./code.c and line: 6 Type: "malloc" Memory: <
Ini menunjukkan tes mana yang menyebabkan kebocoran, di mana kebocoran terjadi dalam kode sumber, dan apa yang ada di dalam memori yang bocor. Sangat membantu!
Ada beberapa hal yang perlu diperhatikan dengan fitur ini:
Cpputest menggunakan makro preprocessor untuk secara dinamis mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar. Itu berarti ini hanya akan bekerja untuk panggilan dalam kode sumber yang sedang diuji karena itu yang dikompilasi dengan pengganti CppUTest. Kebocoran dalam perpustakaan terhubung tidak akan tertangkap.
Terkadang memori yang dialokasikan untuk seluruh masa hidup proses tidak dimaksudkan untuk dibebaskan. Ini dapat menghasilkan banyak kesalahan spam jika Anda menguji modul dengan perilaku ini. Untuk menonaktifkan deteksi kebocoran, Anda dapat melakukan ini:
CPPUTEST_USE_MEM_LEAK_DETECTION=N
Cpputest memungkinkan Anda secara otomatis mendeteksi kebocoran memori dengan mendefinisikan ulang fungsi keluarga “malloc/free” standar untuk menggunakan pembungkus miliknya. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.
Untuk ilustrasi, mari kita bocorkan beberapa memori di test_func() !
Kembali ke code.c, kita tambahkan malloc() ke fungsi, seperti ini:
int test_func() { malloc(1); return 1; }
Sekarang, setelah dikompilasi ulang, kesalahan berikut terjadi:
test.cpp:9: error: Failure in TEST(AwesomeExamples, FirstExample) Memory leak(s) found. Alloc num (4) Leak size: 1 Allocated at: ./code.c and line: 6 Type: "malloc" Memory: <
Ini menunjukkan tes mana yang menyebabkan kebocoran, di mana kebocoran terjadi dalam kode sumber, dan apa yang ada di dalam memori yang bocor. Sangat membantu!
Ada beberapa hal yang perlu diperhatikan dengan fitur ini:
Cpputest menggunakan makro preprocessor untuk secara dinamis mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar. Itu berarti ini hanya akan bekerja untuk panggilan dalam kode sumber yang sedang diuji karena itu yang dikompilasi dengan pengganti CppUTest. Kebocoran dalam perpustakaan terhubung tidak akan tertangkap.
Terkadang memori yang dialokasikan untuk seluruh masa hidup proses tidak dimaksudkan untuk dibebaskan. Ini dapat menghasilkan banyak kesalahan spam jika Anda menguji modul dengan perilaku ini. Untuk menonaktifkan deteksi kebocoran, Anda dapat melakukan ini:
CPPUTEST_USE_MEM_LEAK_DETECTION=N
Tertarik pada More?
Ini hanyalah puncak gunung es ketika datang ke semua fitur yang terkandung dalam alat ini. Selain dasar-dasar yang dibahas di sini, alat ini juga memiliki kerangka kerja mocking, lapisan integrasi C langsung, dan kerangka kerja plugin, untuk menyebutkan beberapa yang signifikan. Repo ini juga berisi seluruh direktori skrip pembantu yang dapat membantu mengotomatisasi beberapa bagian rutin dari bekerja dengan kerangka kerja tersebut.
Saya berharap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat yang hebat ini!
Ini hanyalah puncak gunung es ketika datang ke semua fitur yang terkandung dalam alat ini. Selain dasar-dasar yang dibahas di sini, alat ini juga memiliki kerangka kerja mocking, lapisan integrasi C langsung, dan kerangka kerja plugin, untuk menyebutkan beberapa yang signifikan. Repo ini juga berisi seluruh direktori skrip pembantu yang dapat membantu mengotomatisasi beberapa bagian rutin dari bekerja dengan kerangka kerja tersebut.
Saya berharap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat yang hebat ini!
Ini hanyalah puncak gunung es ketika datang ke semua fitur yang terkandung dalam alat ini. Selain dasar-dasar yang dibahas di sini, alat ini juga memiliki kerangka kerja mocking, lapisan integrasi C langsung, dan kerangka kerja plugin, untuk menyebutkan beberapa yang signifikan. Repo ini juga berisi seluruh direktori skrip pembantu yang dapat membantu mengotomatisasi beberapa bagian rutin dari bekerja dengan kerangka kerja tersebut.
Saya berharap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat yang hebat ini!



