C

CUnit을 활용한 리눅스 C언어 테스트 에비던스 자동화 가이드

지오준 2025. 7. 24.
반응형

🎯 목적

앞에서 직접 작성한 로그 저장 함수를 사용했지만, **보다 체계적인 테스트 프레임워크(CUnit)**를 활용하면 테스트 작성, 실행, 결과 출력이 더욱 편리해집니다. 여기에 에비던스 자동 저장 기능을 추가하면 자동화된 품질 검증 시스템을 구축할 수 있습니다.


📌 1. CUnit이란?

CUnit은 C언어용 유닛 테스트 프레임워크로, 테스트 케이스 및 테스트 스위트를 구성하고 테스트 결과를 콘솔 또는 XML 파일로 출력할 수 있습니다.


🧰 2. 설치 방법 (Ubuntu 기준)

sudo apt-get update
sudo apt-get install libcunit1 libcunit1-doc libcunit1-dev

🛠️ 3. 샘플 프로젝트 구조

cunit_test/
├── add.c
├── add.h
├── test_add.c
└── evidence_writer.c

📄 4. 코드 구성

✅ add.h

// add.h
#ifndef ADD_H
#define ADD_H

int add(int a, int b);

#endif

✅ add.c

// add.c
#include "add.h"

int add(int a, int b) {
    return a + b;
}

✅ evidence_writer.c (에비던스 저장)

// evidence_writer.c
#include <stdio.h>
#include <time.h>

void write_evidence_to_file(const char* test_case, const char* result, const char* detail) {
    FILE *fp = fopen("cunit_evidence.log", "a");
    if (fp == NULL) return;

    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] TEST: %s | RESULT: %s | DETAIL: %s\n",
            t->tm_year+1900, t->tm_mon+1, t->tm_mday,
            t->tm_hour, t->tm_min, t->tm_sec,
            test_case, result, detail);

    fclose(fp);
}

✅ test_add.c

// test_add.c
#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include "add.h"

extern void write_evidence_to_file(const char*, const char*, const char*);

void test_add_func(void) {
    int result = add(2, 3);
    if (result == 5) {
        write_evidence_to_file("test_add_func", "PASS", "2 + 3 == 5");
    } else {
        char detail[100];
        snprintf(detail, sizeof(detail), "Expected 5 but got %d", result);
        write_evidence_to_file("test_add_func", "FAIL", detail);
    }
    CU_ASSERT(result == 5);
}

int main() {
    if (CUE_SUCCESS != CU_initialize_registry())
        return CU_get_error();

    CU_pSuite suite = CU_add_suite("AddSuite", 0, 0);
    if (!suite) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    if (!CU_add_test(suite, "test of add()", test_add_func)) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    CU_basic_set_mode(CU_BRM_VERBOSE);  // 상세 출력
    CU_basic_run_tests();               // 테스트 실행
    CU_cleanup_registry();
    return CU_get_error();
}

🔧 5. 컴파일 및 실행

gcc -o cunit_test test_add.c add.c evidence_writer.c -lcunit
./cunit_test

📂 6. 테스트 결과 예시

🖥️ 콘솔 출력

Suite: AddSuite
  Test: test of add() ... passed
Run Summary:    Type  Total    Ran Passed Failed Inactive
               tests      1     1     1     0        0

📝 로그 파일 (cunit_evidence.log)

[2025-07-23 10:45:12] TEST: test_add_func | RESULT: PASS | DETAIL: 2 + 3 == 5

💡 팁: XML 출력 기능 활용하기 (CI/CD 연동)

CUnit은 XML 출력도 가능합니다. CI 툴(Jenkins 등)에서 활용하려면 다음처럼 XML 방식으로 설정하세요.

CU_set_output_filename("cunit_output");
CU_list_tests_to_file();
CU_automated_run_tests();

실행하면 cunit_output.xml로 자동 저장됩니다.


✅ 결론

  • CUnit을 사용하면 테스트 코드 작성이 구조화되고,
  • 로그 파일로 테스트 에비던스를 쉽게 확보할 수 있으며,
  • XML 출력까지 활용하면 CI/CD 파이프라인과 연동하여 자동화된 테스트 보고서 시스템도 구축 가능합니다.

📎 참고 링크


반응형

댓글