Ini adalah perintah checkmk yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
checkmk - Skrip Awk untuk menghasilkan pengujian unit C untuk digunakan dengan pengujian unit Periksa
kerangka.
RINGKASAN
cekmk [ mode_bersih=1 ] [ file masukan ]
DESKRIPSI
Hasilkan file sumber bahasa C yang berisi pengujian unit untuk digunakan dengan pengujian unit Periksa
kerangka. Tujuan dari skrip ini adalah untuk mengotomatiskan beberapa boilerplate yang khas
harus menulis saat menulis rangkaian pengujian menggunakan Periksa: khususnya, instantiasi sebuah
SRunner, Suite(s), dan TCase(s), dan membangun hubungan antara objek-objek ini
dan fungsi tes.
Alat ini dimaksudkan untuk digunakan oleh mereka yang terbiasa dengan pengujian unit Periksa
kerangka. Keakraban dengan kerangka kerja akan diasumsikan di seluruh manual ini.
Kerangka kerja Periksa, bersama dengan informasi mengenainya, tersedia di
http://check.sourceforge.net/ <URL:http://check.sourceforge.net/>.
file masukan argumen untuk cekmk menggunakan sintaksis seperti C-preprocessor sederhana untuk mendeklarasikan
menguji fungsi, dan untuk mendeskripsikan hubungannya dengan Suite dan TCase di Check.
cekmk kemudian menggunakan informasi ini untuk secara otomatis menulis utama() fungsi yang mengandung semua
dari deklarasi yang diperlukan, dan kode apa pun yang diperlukan untuk menjalankan rangkaian pengujian. NS
keluaran akhir bahasa C dicetak ke cekmkkeluaran standar.
Fasilitas disediakan untuk penyisipan kode pengguna ke dalam yang dihasilkan utama() fungsi,
untuk menyediakan penggunaan logging, perlengkapan uji atau nilai keluar khusus.
Meskipun dimungkinkan untuk menghilangkan file masukan argumen untuk cekmk dan berikan file input
on cekmksebagai gantinya, umumnya disarankan untuk menyediakannya sebagai
argumen. Melakukan ini memungkinkan cekmk untuk mengetahui nama file, untuk menempatkan referensi ke
itu di komentar awal dari output bahasa-C, dan untuk menyelingi arahan C #line
di seluruh, untuk memfasilitasi dalam men-debug masalah dengan mengarahkan pengguna ke aslinya
berkas masukan.
PILIHAN
Satu-satunya opsi yang didukung secara resmi adalah menentukan nilai sebenarnya (menggunakan definisi Awk
untuk "benar") untuk variabel mode_bersih. Ini menyebabkan cekmk tidak menempatkan sesuai
#line arahan dalam kode sumber, yang beberapa orang mungkin menemukan kekacauan yang tidak perlu.
Penulis merekomendasikan untuk tidak menggunakan opsi ini, karena akan menyebabkan kompiler C dan
alat debugging untuk merujuk ke baris dalam output yang dihasilkan secara otomatis, daripada
file masukan asli ke cekmk. Ini akan mendorong pengguna untuk mengedit file output
alih-alih file input asli, akan menyulitkan editor cerdas atau
IDE untuk menarik file yang tepat untuk diedit, dan dapat mengakibatkan perbaikan ditimpa
ketika file output dibuat ulang.
#line directives secara otomatis ditekan ketika file input disediakan pada standar
input alih-alih sebagai argumen baris perintah.
BASIC CONTOH
Dalam bentuknya yang paling dasar, file input dapat berupa prolog dan fungsi uji.
Apa pun yang muncul sebelum fungsi tes pertama ada di prolog, dan akan menjadi
disalin ke dalam output verbatim. Fungsi pengujian dimulai dengan garis dalam bentuk:
#uji nama_tes
Where nama_tes adalah nama fungsi pengujian Anda. Ini akan digunakan untuk memberi nama fungsi C,
jadi itu harus pengidentifikasi C yang valid.
Berikut ini adalah contoh kecil yang lengkap:
--------------------------------------------------
/* Contoh tes lengkap */
#termasuk
#tes_tes
ke dalam nc;
const char msg[] = "\n\n Halo, dunia!\n";
nc = printf("%s", pesan);
ck_assert(nc == (ukuran dari(pesan) - 1)); /* untuk mengakhiri NUL. */
--------------------------------------------------
Jika Anda menempatkan di atas ke dalam file bernama basic_complete.ts dan memprosesnya menggunakan
perintah berikut:
$ cekmk basic_complete.ts > dasar_lengkap.c
dasar_lengkap.c akan berisi output yang mirip dengan:
--------------------------------------------------
/*
* JANGAN EDIT FILE INI. Dihasilkan oleh checkmk.
* Edit file sumber asli "di".
*/
#termasuk
/* Contoh tes lengkap */
#termasuk
START_TEST(tes_tes)
{
ke dalam nc;
const char msg[] = "\n\n Halo, dunia!\n";
nc = printf("%s", pesan);
ck_assert(nc == (ukuran dari(pesan) - 1)); /* untuk mengakhiri NUL. */
}
END_TEST
int main (void)
{
Suite *s1 = suite_create("Inti");
TCase *tc1_1 = tcase_create("Inti");
SRunner *sr = srunner_create(s1);
int nf;
suite_add_tcase(s1, tc1_1);
tcase_add_test(tc1_1, the_test);
srunner_run_all(sr, CK_ENV);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
kembali nf == 0 ? 0 : 1;
}
--------------------------------------------------
Dalam penggunaan nyata, dasar_lengkap.c juga akan berisi arahan #line.
PENGARAHAN RINGKASAN
Berikut adalah ringkasan lengkap dari semua arahan gaya-C-preprocessor yang dipahami
by cekmk. Lihat di bawah untuk lebih jelasnya.
# tes nama_tes
# uji-sinyal(sinyal) nama_tes
# tes-keluar(kode_keluar) nama_tes
# tes-loop(awal, akhir) nama_tes
# sinyal uji-loop(sinyal, awal, akhir) nama_tes
# tes-loop-keluar(kode_keluar, awal, akhir) nama_tes
# rangkaian Nama TestSuite
# kasus NamaKasus Uji
# utama-pra
# main-posting
Semua arahan tidak peka huruf besar-kecil. Spasi mungkin muncul di awal baris
sebelum #, di antara # dan direktif, di antara direktif dan argumen apa pun, dan
di akhir baris.
PENENTUAN UJI PETUNJUK
Berikut adalah penjelasan lebih rinci tentang arahan yang dapat digunakan untuk mendefinisikan tes
fungsi dan wadahnya.
UJI FUNGSI
# tes nama_tes
# uji-sinyal(sinyal) nama_tes
# tes-keluar(kode_keluar) nama_tes
# tes-loop(awal, akhir) nama_tes
# sinyal uji-loop(sinyal, awal, akhir) nama_tes
# tes-loop-keluar(kode_keluar, awal, akhir) nama_tes
Ini adalah arahan paling dasar untuk membuat template untuk input ke cekmk. Mereka
satu-satunya arahan yang diperlukan: setidaknya harus ada satu arahan #test*
muncul di template, atau cekmk akan gagal dengan pesan kesalahan. Ujian*
arahan dapat ditentukan beberapa kali, masing-masing memulai definisi tes baru
fungsi.
nama_tes argumen akan digunakan sebagai nama fungsi pengujian dalam bahasa-C
output, jadi itu harus menjadi pengidentifikasi C yang valid. Artinya, itu harus dimulai dengan abjad
karakter atau garis bawah (_), diikuti dengan karakter alfanumerik opsional dan/atau
menggarisbawahi.
Nama Karakter Universal (diperkenalkan di C99) juga diperbolehkan, dalam bentuk \uXXXX atau
\UXXXXXXXX, di mana X mewakili digit heksadesimal.
Ini adalah kesalahan untuk menentukan hal yang sama nama_tes di lebih dari satu #test* direktif, terlepas
apakah mereka terkait dengan kasus uji atau suite yang berbeda.
Lihat PENGIDENTIFIKASI CHECKMK untuk daftar pengidentifikasi yang harus dihindari untuk digunakan sebagai
nama fungsi tes.
UJI SUITE
# rangkaian Nama TestSuite
Arahan ini menentukan nama test suite (Rangkaian objek dalam tes Periksa
framework) yang akan ditambahkan semua kasus uji di masa mendatang (dan fungsi pengujiannya).
Nama TestSuite adalah string teks, dan mungkin berisi karakter apa pun (lainnya
dari karakter ASCII NUL, dan baris baru, yang akan mengakhiri arahan). Setiap
spasi putih awal atau akhir akan dihilangkan dari nama rangkaian pengujian.
Memulai test suite baru juga memulai test case baru, yang namanya identik dengan yang baru
rangkaian tes. Nama kasus uji ini dapat ditimpa oleh #tcase directive berikutnya.
Perhatikan bahwa a Rangkaian objek tidak akan benar-benar ditentukan oleh cekmk dalam output C, kecuali jika
diikuti di beberapa titik oleh #test direktif (tanpa #suite intervensi). Bukan itu
kesalahan untuk #suite tidak memiliki #test yang terkait; #suite (dan semua yang terkait
#tcase's) tidak akan menghasilkan tindakan apa pun dari pihak cekmk (dan karena itu akan menjadi
tidak berguna).
Ini adalah kesalahan untuk arahan #suite untuk menentukan kelipatan suite yang sama (peka huruf besar-kecil)
kali, kecuali penggunaan sebelumnya tidak dipakai oleh kehadiran setidaknya satu
terkait #test direktif.
Jika Anda tidak menentukan direktif #suite sebelum direktif #test pertama, cekmk
melakukan setara dengan arahan #suite implisit, dengan string "Core" sebagai
nilai untuk Nama TestSuite (ini juga menyiratkan objek kasus uji "Inti"). Ini adalah
ditunjukkan di atas dalam CONTOH DASAR.
UJI KASUS
# kasus NamaKasus Uji
Arahan ini menentukan nama kasus uji (kasus objek dalam tes Periksa
framework) yang akan ditambahkan semua fungsi pengujian di masa mendatang.
#tcase bekerja sangat mirip dengan #suite. NS NamaKasus Uji adalah string teks,
dan mungkin berisi karakter arbitrer; dan kasus objek tidak akan benar-benar didefinisikan kecuali
itu diikuti oleh arahan #test terkait.
Ini adalah kesalahan untuk arahan #tcase untuk menentukan kasus uji yang sama (peka huruf besar-kecil)
beberapa kali, kecuali penggunaan sebelumnya tidak dipakai oleh kehadiran setidaknya
satu arahan #test terkait.
Lihat juga arahan #suite, yang dijelaskan di atas.
PENGGUNA KODE IN UTAMA()
C utama() dihasilkan secara otomatis oleh cekmk, mendefinisikan yang diperlukan Pelari'S,
Rangkaian'pasir kasus's diperlukan oleh arahan penentu tes yang ditentukan oleh pengguna.
Untuk sebagian besar situasi, ini sepenuhnya otomatis utama() cukup cocok apa adanya. Namun,
ada situasi di mana seseorang mungkin ingin menambahkan kode khusus ke utama(). Contohnya,
jika pengguna ingin:
· ubah nilai batas waktu tes melalui tcase_set_timeout(),
· tentukan "no-fork-mode" Cek melalui srunner_set_fork_status(),
· mengatur perlengkapan uji untuk beberapa kasus uji, melalui tcase_add_checked_fixture()
or tcase_add_unchecked_fixture(),
· mengatur logging uji untuk runner suite, melalui srunner_set_log() or srunner_set_xml(), atau
· melakukan pembungkusan khusus setelah rangkaian pengujian dijalankan.
Untuk tujuan ini, arahan #main-pre dan #main-post telah disediakan.
UTAMA() PROLOG
# utama-pra
Teks yang mengikuti arahan ini akan ditempatkan kata demi kata ke dalam tubuh yang dihasilkan
utama() fungsi, tepat setelah cekmkdeklarasi variabel lokal sendiri, dan sebelum pengujian apa pun
berjalan telah terjadi (memang, bahkan sebelum hubungan antara tes, tes
kasus, dan suite uji telah disiapkan, meskipun fakta itu seharusnya tidak membuat banyak perbedaan).
Sejak cekmk baru saja selesai membuat pernyataannya, itu diperbolehkan, bahkan
di bawah pedoman ISO C 1990 yang ketat, untuk membuat deklarasi variabel khusus di sini.
Tidak seperti direktif yang dijelaskan sebelumnya, #main-pre dapat ditentukan paling banyak satu kali. Dia
tidak boleh didahului oleh #main-post directive, dan tidak ada #suite, #tcase, atau #test directive
mungkin muncul setelahnya.
#main-pre adalah tempat yang baik untuk mengubah pengaturan atau menyiapkan perlengkapan pengujian. Tentu saja, dalam rangka
untuk melakukannya, Anda perlu tahu apa nama cekmk telah digunakan untuk instantiate Pelari'S,
Rangkaian'pasir kasus'S.
PERIKSA IDENTIFIKASI
Petunjuk untuk Rangkaian's dideklarasikan menggunakan pola sX, Di mana X adalah bilangan yang dimulai dari
1, dan bertambah untuk setiap arahan #suite berikutnya. s1 selalu ada, dan
berisi fungsi tes yang dideklarasikan oleh #test directive pertama. Jika arahan itu adalah
tidak didahului dengan #suite, maka akan diberi nama "Core".
Petunjuk untuk kasus's dideklarasikan menggunakan pola tcX_Y, Di mana X sesuai dengan
nomor yang digunakan untuk nama Rangkaian yang akan berisi ini kasus; Dan Y adalah bilangan yang
mulai dari 1 untuk setiap yang baru Rangkaian, dan bertambah untuk setiap kasus karena Rangkaian.
Sebuah penunjuk ke Pelari dideklarasikan menggunakan pengidentifikasi sr; ada juga bilangan bulat bernama
nf yang menyimpan jumlah kegagalan pengujian (setelah pengujian berjalan).
Untuk alasan yang jelas, pengguna tidak boleh mencoba mendeklarasikan pengidentifikasi lokal di utama(),
atau tentukan makro atau fungsi pengujian apa pun, yang namanya mungkin bertentangan dengan variabel lokal
nama yang digunakan oleh cekmk. Untuk meringkas, nama-nama ini adalah:
sX
tcX_Y
sr
n.
UTAMA() EPILOG
# main-posting
Meskipun itu tidak berguna, cekmk juga menyediakan arahan #main-post untuk menyisipkan kustom
kode di akhir utama(), setelah tes berjalan. Ini bisa digunakan untuk membersihkan
sumber daya yang dialokasikan dalam prolog, atau untuk mencetak informasi tentang yang gagal
tes, atau untuk memberikan kode status keluar kustom.
Perhatikan bahwa, jika Anda menggunakan arahan ini, cekmk akan tidak memberikan pernyataan kembali:
Anda harus menyediakannya sendiri.
Arahan #main-post tidak boleh diikuti oleh arahan lain yang dikenali oleh
cekmk.
LUAS CONTOH
Sekarang setelah Anda mendapatkan deskripsi terperinci dari berbagai arahan, mari kita lihat
semua beraksi dengan template yang cukup komprehensif ini.
--------------------------------------------------
#include "mempool.h" /* mendefinisikan MEMPOOLSZ, prototipe untuk
mempool_init() dan mempool_free() */
batal *mempool;
batal mp_setup(batal)
{
mempool = mempool_init(MEMPOOLSZ);
ck_assert_msg(mempool != NULL, "Tidak dapat mengalokasikan mempool.");
}
batal mp_teardown(batal)
{
mempool_gratis(memko);
}
/* akhir prolog */
#suite Mempool
#tcase MP Init
#test mempool_init_zero_test
mempool = mempool_init(0);
ck_assert_msg(mempool == NULL, "Mengalokasikan mempool berukuran nol!");
ck_assert_msg(mempool_error(), "Tidak mendapatkan kesalahan untuk alokasi nol.");
/* "MP Util" TCase menggunakan perlengkapan yang dicentang. */
#tcase MP Util
#test mempool_copy_test
kosong *cp = mempool_copy(memko);
ck_assert_msg(cp != NULL, "Tidak dapat melakukan penyalinan mempool.");
ck_assert_msg(cp != mempool, "Salin pointer asli yang dikembalikan!");
#test mempool_size_test
ck_assert(mempool_getsize(mempool) == MEMPOOLSZ);
#utama-pra
tcase_add_checked_fixture(tc1_2, mp_setup, mp_teardown);
srunner_set_log(sr, "mplog.txt");
#main-posting
jika (nf != 0) {
printf("Hei, ada yang salah! %d seluruh tes gagal!\n", nf);
}
kembali 0; /* Harness memeriksa output, selalu kembali sukses
tanpa memedulikan. */
--------------------------------------------------
Memasukkan ini ke cekmk, kita akan mendapatkan output kira-kira seperti berikut:
--------------------------------------------------
/*
* JANGAN EDIT FILE INI. Dihasilkan oleh checkmk.
* Edit file sumber asli "comprehensive.ts" sebagai gantinya.
*/
#termasuk
#sertakan "mempool.h"
batal *mempool;
batal mp_setup(batal)
{
...
}
batal mp_teardown(batal)
{
...
}
/* akhir prolog */
START_TEST(mempool_init_zero_test)
{
...
}
END_TEST
START_TEST(mempool_copy_test)
{
...
}
END_TEST
START_TEST(mempool_size_test)
{
...
}
END_TEST
int main (void)
{
Suite *s1 = suite_create("Mempool");
TCase *tc1_1 = tcase_create("MP Init");
TCase *tc1_2 = tcase_create("MP Util");
SRunner *sr = srunner_create(s1);
int nf;
/* Kode pra-jalan yang ditentukan pengguna */
tcase_add_checked_fixture(tc1_2, mp_setup, mp_teardown);
srunner_set_log(sr, "mplog.txt");
suite_add_tcase(s1, tc1_1);
tcase_add_test(tc1_1, mempool_init_zero_test);
suite_add_tcase(s1, tc1_2);
tcase_add_test(tc1_2, mempool_copy_test);
tcase_add_test(tc1_2, mempool_size_test);
srunner_run_all(sr, CK_ENV);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
/* Kode pasca-lari yang ditentukan pengguna */
jika (nf != 0) {
printf("Hei, ada yang salah! %d seluruh tes gagal!\n", nf);
}
kembali 0; /* Harness memeriksa output, selalu kembali sukses
tanpa memedulikan. */
}
--------------------------------------------------
Gunakan checkmk online menggunakan layanan onworks.net