Criterion là framework kiểm thử đơn vị hiện đại cho ngôn ngữ C/C++, cung cấp hệ thống hàm móc (hook) linh hoạt để theo dõi quy trình kiểm thử. Bài viết này hướng dẫn cách tận dụng các điểm móc này để xây dựng hệ thống giám sát thông minh.
Khái niệm về hệ thống móc báo cáo
Hệ thống móc trong Criterion cho phép chèn đoạn mã tùy chỉnh vào các giai đoạn khác nhau của chu kỳ kiểm thử. Cơ chế này được định nghĩa trong tệp hooks.h, hỗ trợ theo dõi toàn bộ quá trình từ khởi tạo đến kết thúc.
Các loại móc chính và ứng dụng
- Móc toàn cục:
PRE_ALL,POST_ALL- Xử lý dữ liệu tổng thể - Móc nhóm test:
PRE_SUITE,POST_SUITE- Quản lý tập hợp test case - Móc từng test case:
PRE_INIT,PRE_TEST,POST_TEST,POST_FINI- Theo dõi chi tiết từng test - Móc sự kiện đặc biệt:
ASSERT,THEORY_FAIL,TEST_CRASH- Xử lý lỗi bất thường
Triển khai giám sát tiến độ theo thời gian thực
#include <criterion/hooks.h>
#include <stdio.h>
int tong_so_test = 0;
int so_test_da_ket_thuc = 0;
ReportHook(PRE_ALL) {
struct criterion_test_set *ds_test = param;
tong_so_test = ds_test->count;
printf("Bắt đầu chạy %d test case...\n", tong_so_test);
}
ReportHook(PRE_TEST) {
struct criterion_test *test = param;
printf("Đang thực thi: %s::%s\n", test->suite->name, test->name);
}
ReportHook(POST_TEST) {
struct criterion_test_stats *ket_qua = param;
so_test_da_ket_thuc++;
float ti_le = (float)so_test_da_ket_thuc / tong_so_test * 100;
printf("Test %s::%s %s (%.1f%% hoàn thành)\n",
ket_qua->test->suite->name,
ket_qua->test->name,
ket_qua->result == CRITERION_SUCCESS ? "thành công" : "thất bại",
ti_le);
}
Thu thập và phân tích hiệu năng
ReportHook(POST_TEST) {
struct criterion_test_stats *ket_qua = param;
double thoi_gian = (double)ket_qua->elapsed_time / CLOCKS_PER_SEC;
printf("Test %s::%s mất %.6f giây\n",
ket_qua->test->suite->name,
ket_qua->test->name,
thoi_gian);
}
Tạo báo cáo tùy chỉnh định dạng JSON
ReportHook(PRE_ALL) {
printf("{\"tests\": [\n");
}
ReportHook(POST_TEST) {
struct criterion_test_stats *ket_qua = param;
printf(" {\n");
printf(" \"nhom\": \"%s\",\n", ket_qua->test->suite->name);
printf(" \"ten\": \"%s\",\n", ket_qua->test->name);
printf(" \"ket_qua\": \"%s\",\n", ket_qua->result == CRITERION_SUCCESS ? "thanh_cong" : "that_bai");
printf(" \"thoi_gian\": %.6f\n", (double)ket_qua->elapsed_time / CLOCKS_PER_SEC);
printf(" },\n");
}
ReportHook(POST_ALL) {
printf("]}\n");
}
Lưu ý khi triển khai
- Giữ hàm móc ngắn gọn để tránh ảnh hưởng hiệu năng
- Đảm bảo tính an toàn luồng khi chạy song song
- Tránh phát sinh ngoại lệ trong quá trình xử lý
- Sử dụng cơ chế ghi log từ
src/log/logging.cđể debug