Sử dụng nâng cao hàm móc báo cáo Criterion: Theo dõi tiến độ và thống kê hiệu năng theo thời gian thực

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

Thẻ: unit-testing test-hooks performance-monitoring criterion-framework

Đăng vào ngày 6 tháng 6 lúc 20:04