Memulai dengan CppUTest

Burung

14 Mei 2017

Email

1 min read

Memulai dengan CppUTest

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), dan

      • modul pengujian menggunakan blok TEST_GROUP dan TEST().

    • 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.mk dari 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?

    1. Aktifkan: CPPUTEST_USE_GCOV=Y

    2. Pastikan filterGcov.sh tersedia di $(CPPUTEST_HOME)/scripts/.

    3. Jalankan: buat gcov

      Ini 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:

  1. all – membangun pengujian yang ditunjukkan oleh makefile

  2. clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian

  3. realclean – menghapus berkas objek atau gcov di seluruh pohon direktori

  4. flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian

  5. 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:

  1. all – membangun pengujian yang ditunjukkan oleh makefile

  2. clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian

  3. realclean – menghapus berkas objek atau gcov di seluruh pohon direktori

  4. flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian

  5. 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:

  1. all – membangun pengujian yang ditunjukkan oleh makefile

  2. clean – menghapus semua berkas objek dan gcov yang dihasilkan untuk pengujian

  3. realclean – menghapus berkas objek atau gcov di seluruh pohon direktori

  4. flags – mencantumkan semua bendera yang dikonfigurasi untuk mengompilasi pengujian

  5. 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:

  1. code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji

  2. gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)

  3. gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan

  4. gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji

  5. 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:

  1. code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji

  2. gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)

  3. gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan

  4. gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji

  5. 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:

  1. code.cpp.gcov – file ‘gcov’ sebenarnya untuk kode yang diuji

  2. gcov_error.txt – laporan kesalahan (dalam kasus kita, seharusnya kosong)

  3. gcov_output.txt – hasil sebenarnya dari perintah gcov yang dijalankan

  4. gcov_report.txt – ringkasan cakupan untuk setiap file yang diuji

  5. 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:

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

  2. 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:

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

  2. 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:

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

  2. 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!

Berita lainnya

Baca lebih lanjut dari kategori ini

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang berkembang bersama bisnis Anda.

© 2025 Bird

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang berkembang bersama bisnis Anda.

© 2025 Bird