Memulai dengan CppUTest

Burung

14 Mei 2017

Email

1 min read

Memulai dengan CppUTest

Poin Penting

    • CppUTest adalah kerangka pengujian ringan dan aktif yang dipelihara dengan gaya xUnit untuk C/C++, dengan lapisan integrasi C yang bekerja tanpa masalah bahkan di basis kode yang berat C.

    • Anda dapat menginstalnya melalui pengelola paket (distribusi Linux, Homebrew) atau mengkloning repositori GitHub.

    • Pengaturan minimal terdiri dari:

      • direktori produksi src/,

      • direktori tes t/,

      • pelari tes (CommandLineTestRunner), dan

      • modul tes menggunakan TEST_GROUP dan TEST() blok.

    • CppUTest menyediakan MakefileWorker.mk sebagai pembantu yang menyederhanakan pembangunan tes, menghubungkan pustaka, dan menangani flag.

    • 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 canggih: pemalsuan, plugin, skrip pembantu, dan interoperabilitas C langsung — berguna untuk basis kode perusahaan yang kompleks.

Sorotan Tanya jawab

  • Apa itu CppUTest dan mengapa menggunakannya?

    Ini adalah kerangka pengujian gaya xUnit yang kuat untuk C/C++ dengan API yang bersih, makro assert 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 cara menjalankan semua tes?

    Pelari tes menggunakan:

    return CommandLineTestRunner::RunAllTests(ac, av);
  • Bagaimana cara Anda membangun tes tanpa mengonfigurasi opsi compiler secara manual?

    Gunakan MakefileWorker.mk dari CppUTest, yang menangani bendera, penghubungan, dan eksekusi pengujian secara otomatis.

  • Bisakah CppUTest mendeteksi kebocoran memori secara otomatis?

    Ya. Ini menggantikan malloc/free selama build pengujian, melaporkan:

    • uji mana yang bocor,

    • di mana terjadi,

    • ukuran kebocoran dan isi memori.

    Contoh keluaran kegagalan:

    Memory leak(s) found.
    Allocated at: code.c line 6
    Leak size: 1
  • Bagaimana saya menghasilkan cakupan kode?

    1. Aktifkan: CPPUTEST_USE_GCOV=Y

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

    3. Jalankan: make gcov

      Ini menghasilkan .gcov, ringkasan teks, dan laporan cakupan HTML.

  • Apa lagi yang bisa dilakukan CppUTest selain pengujian dasar?

    • kerangka pengujian

    • sistem plugin

    • skrip otomatisasi pembantu

    • integrasi C bawaan

    • makro penegasan yang luas

  • Siapa yang paling cocok menggunakan CppUTest?

    Tim yang bekerja dengan sistem embedded, platform C, layanan C++, atau lingkungan mana pun di mana keandalan dan keselamatan memori harus terus-menerus divalidasi.

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 tepat. Ini juga menyediakan lapisan integrasi C yang memudahkan penggunaannya dengan kode C platform kami meskipun sebagian besar dari kerangka ini adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest di 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 tepat. Ini juga menyediakan lapisan integrasi C yang memudahkan penggunaannya dengan kode C platform kami meskipun sebagian besar dari kerangka ini adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest di 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 tepat. Ini juga menyediakan lapisan integrasi C yang memudahkan penggunaannya dengan kode C platform kami meskipun sebagian besar dari kerangka ini adalah C++. Tutorial ini mencakup cara memulai dengan CppUTest di proyek Anda sendiri.

Tertarik untuk lebih banyak?

Ini hanya merupakan bagian kecil dari keseluruhan fitur yang terdapat 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 fitur penting. Repositori ini juga berisi seluruh direktori skrip bantu yang dapat membantu mengotomatiskan beberapa bagian rutin saat bekerja dengan kerangka kerja ini.

Saya harap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat hebat ini!

Ini hanya merupakan bagian kecil dari keseluruhan fitur yang terdapat 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 fitur penting. Repositori ini juga berisi seluruh direktori skrip bantu yang dapat membantu mengotomatiskan beberapa bagian rutin saat bekerja dengan kerangka kerja ini.

Saya harap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat hebat ini!

Ini hanya merupakan bagian kecil dari keseluruhan fitur yang terdapat 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 fitur penting. Repositori ini juga berisi seluruh direktori skrip bantu yang dapat membantu mengotomatiskan beberapa bagian rutin saat bekerja dengan kerangka kerja ini.

Saya harap informasi di sini membantu Anda meningkatkan kualitas kode C/C++ Anda dengan alat hebat ini!

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 yang mengikuti dieksekusi pada Mac OS X, tetapi berasal dari kode yang ditulis untuk Red Hat, sistem operasi yang dijalankan oleh platform kami.

Dasar-dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan melewatinya 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 yang mengikuti dieksekusi pada Mac OS X, tetapi berasal dari kode yang ditulis untuk Red Hat, sistem operasi yang dijalankan oleh platform kami.

Dasar-dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan melewatinya 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 yang mengikuti dieksekusi pada Mac OS X, tetapi berasal dari kode yang ditulis untuk Red Hat, sistem operasi yang dijalankan oleh platform kami.

Dasar-dasarnya didokumentasikan dengan baik di halaman utama CppUTest. Kami akan melewatinya dan menuju beberapa fitur yang lebih menarik.

Meletakkan Dasar

Hal pertama yang pertama, mari kita tulis beberapa kode!

Proyek uji kita akan memiliki file 'utama' dan akan menyertakan pustaka utilitas bernama 'kode'. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk saat ini). 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 kita lakukan pengujian, yang akan berada di direktori t/.  Hal pertama yang harus dilakukan adalah menyiapkan penguji yang akan menjalankan file ujian kita. Ini juga merupakan fungsi 'utama'  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 pengujian 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 makefile.  Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk pengujian.

Hal pertama yang pertama, mari kita tulis beberapa kode!

Proyek uji kita akan memiliki file 'utama' dan akan menyertakan pustaka utilitas bernama 'kode'. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk saat ini). 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 kita lakukan pengujian, yang akan berada di direktori t/.  Hal pertama yang harus dilakukan adalah menyiapkan penguji yang akan menjalankan file ujian kita. Ini juga merupakan fungsi 'utama'  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 pengujian 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 makefile.  Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk pengujian.

Hal pertama yang pertama, mari kita tulis beberapa kode!

Proyek uji kita akan memiliki file 'utama' dan akan menyertakan pustaka utilitas bernama 'kode'. Pustaka ini akan menyediakan fungsi sederhana yang mengembalikan 1 (untuk saat ini). 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 kita lakukan pengujian, yang akan berada di direktori t/.  Hal pertama yang harus dilakukan adalah menyiapkan penguji yang akan menjalankan file ujian kita. Ini juga merupakan fungsi 'utama'  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 pengujian 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 makefile.  Kita akan membutuhkan dua: satu untuk file proyek di bawah src/, dan satu untuk pengujian.

Makefile Proyek

Makefile proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Itu harus 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 tes – yang berarti bahwa ini akan memanggil ‘make’  lagi menggunakan makefile di direktori tes.

Pada titik ini kami 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

Makefile proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Itu harus 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 tes – yang berarti bahwa ini akan memanggil ‘make’  lagi menggunakan makefile di direktori tes.

Pada titik ini kami 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

Makefile proyek akan berada pada level yang sama dengan direktori ‘src’ dan ‘t’ di akar proyek. Itu harus 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 tes – yang berarti bahwa ini akan memanggil ‘make’  lagi menggunakan makefile di direktori tes.

Pada titik ini kami 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

Tes Makefile

Untuk pengujian, hal-hal sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan pustaka CppUTest dengan benar.

Repositori CppUTest menyediakan file bernama “MakefileWorker.mk”. Ini memberikan banyak fungsionalitas yang membuat pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan telah disalin ke direktori ‘t/’. 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 disetel ke lokasi di mana CppUTest diinstal. Jika Anda menginstal paket distro, ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah memeriksa repositori sendiri, itu berada di mana pemeriksaan itu.

Opsi ini seluruhnya didokumentasikan di MakefileWorker.mk.

MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:

  1. semua – membangun pengujian yang ditunjukkan oleh makefile

  2. bersihkan – menghapus semua file objek dan gcov yang dihasilkan untuk pengujian

  3. bersihkan sungguhan – menghapus file objek atau gcov di seluruh pohon direktori

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

  5. debug – mencantumkan semua file sumber, objek, dependensi, dan ‘barang untuk dibersihkan’


Komponen

Tujuan

File Kunci / Bendera

Catatan

Makefile Proyek

Membangun kode sumber inti

Makefile tingkat root menggunakan make -C

Mengompilasi src/ dan mendelegasikan pengujian ke t/

Makefile Pengujian

Membangun dan menghubungkan pengujian dengan CppUTest

t/Makefile merujuk pada MakefileWorker.mk

Menangani kompilasi pengujian, penghubungan, dan bendera pustaka

MakefileWorker.mk

Menyediakan logika pembangunan yang dapat digunakan kembali

Berlokasi di CppUTest /build dir

Menambahkan target: semua, bersihkan, bersihkan sungguhan, flags, debug

Integrasi GCov

Memungkinkan pelaporan cakupan kode

CPPUTEST_USE_GCOV=Y

Memproduksi .gcov files, laporan HTML

Deteksi Kebocoran Memori

Mendeteksi kebocoran malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

Diaktifkan secara default; dapat dinonaktifkan dengan =N

Pengendali Uji

Menjalankan kelompok pengujian

CommandLineTestRunner

Poin masuk utama yang diperlukan untuk menjalankan pengujian

Untuk pengujian, hal-hal sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan pustaka CppUTest dengan benar.

Repositori CppUTest menyediakan file bernama “MakefileWorker.mk”. Ini memberikan banyak fungsionalitas yang membuat pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan telah disalin ke direktori ‘t/’. 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 disetel ke lokasi di mana CppUTest diinstal. Jika Anda menginstal paket distro, ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah memeriksa repositori sendiri, itu berada di mana pemeriksaan itu.

Opsi ini seluruhnya didokumentasikan di MakefileWorker.mk.

MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:

  1. semua – membangun pengujian yang ditunjukkan oleh makefile

  2. bersihkan – menghapus semua file objek dan gcov yang dihasilkan untuk pengujian

  3. bersihkan sungguhan – menghapus file objek atau gcov di seluruh pohon direktori

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

  5. debug – mencantumkan semua file sumber, objek, dependensi, dan ‘barang untuk dibersihkan’


Komponen

Tujuan

File Kunci / Bendera

Catatan

Makefile Proyek

Membangun kode sumber inti

Makefile tingkat root menggunakan make -C

Mengompilasi src/ dan mendelegasikan pengujian ke t/

Makefile Pengujian

Membangun dan menghubungkan pengujian dengan CppUTest

t/Makefile merujuk pada MakefileWorker.mk

Menangani kompilasi pengujian, penghubungan, dan bendera pustaka

MakefileWorker.mk

Menyediakan logika pembangunan yang dapat digunakan kembali

Berlokasi di CppUTest /build dir

Menambahkan target: semua, bersihkan, bersihkan sungguhan, flags, debug

Integrasi GCov

Memungkinkan pelaporan cakupan kode

CPPUTEST_USE_GCOV=Y

Memproduksi .gcov files, laporan HTML

Deteksi Kebocoran Memori

Mendeteksi kebocoran malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

Diaktifkan secara default; dapat dinonaktifkan dengan =N

Pengendali Uji

Menjalankan kelompok pengujian

CommandLineTestRunner

Poin masuk utama yang diperlukan untuk menjalankan pengujian

Untuk pengujian, hal-hal sedikit lebih rumit karena kita perlu memuat dan mengintegrasikan dengan pustaka CppUTest dengan benar.

Repositori CppUTest menyediakan file bernama “MakefileWorker.mk”. Ini memberikan banyak fungsionalitas yang membuat pembangunan dengan CppUTest menjadi sederhana. File ini berada di bawah direktori “build” dalam repositori git. Untuk tutorial ini, kita akan mengasumsikan telah disalin ke direktori ‘t/’. 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 disetel ke lokasi di mana CppUTest diinstal. Jika Anda menginstal paket distro, ini biasanya berada di bawah /usr/local pada sistem linux/mac. Jika Anda telah memeriksa repositori sendiri, itu berada di mana pemeriksaan itu.

Opsi ini seluruhnya didokumentasikan di MakefileWorker.mk.

MakefileWorker.mk juga menambahkan beberapa target makefile, termasuk yang berikut:

  1. semua – membangun pengujian yang ditunjukkan oleh makefile

  2. bersihkan – menghapus semua file objek dan gcov yang dihasilkan untuk pengujian

  3. bersihkan sungguhan – menghapus file objek atau gcov di seluruh pohon direktori

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

  5. debug – mencantumkan semua file sumber, objek, dependensi, dan ‘barang untuk dibersihkan’


Komponen

Tujuan

File Kunci / Bendera

Catatan

Makefile Proyek

Membangun kode sumber inti

Makefile tingkat root menggunakan make -C

Mengompilasi src/ dan mendelegasikan pengujian ke t/

Makefile Pengujian

Membangun dan menghubungkan pengujian dengan CppUTest

t/Makefile merujuk pada MakefileWorker.mk

Menangani kompilasi pengujian, penghubungan, dan bendera pustaka

MakefileWorker.mk

Menyediakan logika pembangunan yang dapat digunakan kembali

Berlokasi di CppUTest /build dir

Menambahkan target: semua, bersihkan, bersihkan sungguhan, flags, debug

Integrasi GCov

Memungkinkan pelaporan cakupan kode

CPPUTEST_USE_GCOV=Y

Memproduksi .gcov files, laporan HTML

Deteksi Kebocoran Memori

Mendeteksi kebocoran malloc/free

CPPUTEST_USE_MEM_LEAK_DETECTION

Diaktifkan secara default; dapat dinonaktifkan dengan =N

Pengendali Uji

Menjalankan kelompok pengujian

CommandLineTestRunner

Poin masuk utama yang diperlukan untuk menjalankan pengujian

Cakupan Kode

Pengujian unit tidak akan lengkap tanpa laporan cakupan. Alat utama untuk ini untuk proyek yang menggunakan gcc adalah gcov, yang tersedia sebagai bagian dari rangkaian standar utilitas gcc. Cpputest terintegrasi dengan mudah dengan gcov, yang perlu Anda lakukan adalah menambahkan baris ini ke makefile:

CPPUTEST_USE_GCOV=Y

Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repositori ini berada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda menetapkan ‘CPPUTEST_HOME’. Skrip ini juga perlu memiliki izin eksekusi.

Dalam contoh Makefile, itu akan diterapkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repositori, semuanya harus bekerja tanpa modifikasi.

Dengan itu ditempatkan, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kami perlu ‘make -B’ untuk membangun kembali 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 mengeluarkan sejumlah file ke direktori ‘gcov’ yang baru. Ini adalah:

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

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

  3. gcov_output.txt – keluaran sebenarnya dari perintah gcov yang telah 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 utama untuk ini untuk proyek yang menggunakan gcc adalah gcov, yang tersedia sebagai bagian dari rangkaian standar utilitas gcc. Cpputest terintegrasi dengan mudah dengan gcov, yang perlu Anda lakukan adalah menambahkan baris ini ke makefile:

CPPUTEST_USE_GCOV=Y

Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repositori ini berada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda menetapkan ‘CPPUTEST_HOME’. Skrip ini juga perlu memiliki izin eksekusi.

Dalam contoh Makefile, itu akan diterapkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repositori, semuanya harus bekerja tanpa modifikasi.

Dengan itu ditempatkan, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kami perlu ‘make -B’ untuk membangun kembali 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 mengeluarkan sejumlah file ke direktori ‘gcov’ yang baru. Ini adalah:

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

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

  3. gcov_output.txt – keluaran sebenarnya dari perintah gcov yang telah 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 utama untuk ini untuk proyek yang menggunakan gcc adalah gcov, yang tersedia sebagai bagian dari rangkaian standar utilitas gcc. Cpputest terintegrasi dengan mudah dengan gcov, yang perlu Anda lakukan adalah menambahkan baris ini ke makefile:

CPPUTEST_USE_GCOV=Y

Selanjutnya, kita perlu memastikan bahwa skrip filterGcov.sh dari repositori ini berada di ‘/scripts/filterGcov.sh’ relatif terhadap di mana pun Anda menetapkan ‘CPPUTEST_HOME’. Skrip ini juga perlu memiliki izin eksekusi.

Dalam contoh Makefile, itu akan diterapkan di ‘/usr/local/scripts/filterGcov.sh’. Jika Anda menjalankan CppUTest dari checkout repositori, semuanya harus bekerja tanpa modifikasi.

Dengan itu ditempatkan, Anda cukup menjalankan ‘make gcov’ dan analisis akan dihasilkan untuk Anda. Dalam kasus kami, kami perlu ‘make -B’ untuk membangun kembali 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 mengeluarkan sejumlah file ke direktori ‘gcov’ yang baru. Ini adalah:

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

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

  3. gcov_output.txt – keluaran sebenarnya dari perintah gcov yang telah dijalankan

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

  5. gcov_report.txt.html – versi html dari gcov_report

Deteksi Kebocoran Memori Cpputest

Cpputest memungkinkan Anda untuk secara otomatis mendeteksi memori yang bocor dengan mendefinisikan ulang keluarga fungsi standar “malloc/free” untuk menggunakan pembungkusnya sendiri. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Fitur ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.

Untuk mengilustrasikan, mari kita bocorkan sedikit memori di test_func() !

Kembali ke code.c, kita menambahkan sebuah malloc()  ke fungsi, seperti berikut:

int test_func() {
    malloc(1);
    return 1;
}

Sekarang, setelah dikompilasi ulang, kesalahan berikut dihasilkan:

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 memori yang bocor. Sangat membantu!

Ada beberapa caveat dengan fitur ini:

  1. Cpputest menggunakan makro preprocesser untuk mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar secara dinamis. Itu berarti hanya akan berfungsi untuk panggilan dalam kode sumber yang diuji karena itulah yang dikompilasi dalam dengan overrides CppUTest. Kebocoran dalam pustaka terkait tidak akan terdeteksi.

  2. Terkadang memori yang dialokasikan untuk seluruh masa 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 untuk secara otomatis mendeteksi memori yang bocor dengan mendefinisikan ulang keluarga fungsi standar “malloc/free” untuk menggunakan pembungkusnya sendiri. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Fitur ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.

Untuk mengilustrasikan, mari kita bocorkan sedikit memori di test_func() !

Kembali ke code.c, kita menambahkan sebuah malloc()  ke fungsi, seperti berikut:

int test_func() {
    malloc(1);
    return 1;
}

Sekarang, setelah dikompilasi ulang, kesalahan berikut dihasilkan:

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 memori yang bocor. Sangat membantu!

Ada beberapa caveat dengan fitur ini:

  1. Cpputest menggunakan makro preprocesser untuk mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar secara dinamis. Itu berarti hanya akan berfungsi untuk panggilan dalam kode sumber yang diuji karena itulah yang dikompilasi dalam dengan overrides CppUTest. Kebocoran dalam pustaka terkait tidak akan terdeteksi.

  2. Terkadang memori yang dialokasikan untuk seluruh masa 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 untuk secara otomatis mendeteksi memori yang bocor dengan mendefinisikan ulang keluarga fungsi standar “malloc/free” untuk menggunakan pembungkusnya sendiri. Ini memungkinkan untuk dengan cepat menangkap kebocoran dan melaporkannya untuk setiap eksekusi tes. Fitur ini diaktifkan secara default di MakefileWorker.mk, jadi sudah aktif dengan langkah-langkah yang dijelaskan sejauh ini.

Untuk mengilustrasikan, mari kita bocorkan sedikit memori di test_func() !

Kembali ke code.c, kita menambahkan sebuah malloc()  ke fungsi, seperti berikut:

int test_func() {
    malloc(1);
    return 1;
}

Sekarang, setelah dikompilasi ulang, kesalahan berikut dihasilkan:

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 memori yang bocor. Sangat membantu!

Ada beberapa caveat dengan fitur ini:

  1. Cpputest menggunakan makro preprocesser untuk mendefinisikan ulang semua panggilan ke fungsi manajemen memori standar secara dinamis. Itu berarti hanya akan berfungsi untuk panggilan dalam kode sumber yang diuji karena itulah yang dikompilasi dalam dengan overrides CppUTest. Kebocoran dalam pustaka terkait tidak akan terdeteksi.

  2. Terkadang memori yang dialokasikan untuk seluruh masa 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

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 dapat berkembang seiring dengan bisnis Anda.

© 2025 Burung

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

Platform AI-native lengkap yang dapat berkembang seiring dengan bisnis Anda.

© 2025 Burung