MySQL 저장 프로시저를 활용한 테스트 리포트 자동 집계 시스템

테스트 실행 결과를 기반으로 동적 리포트 생성하기

자동화 테스트 환경에서 각 테스트 케이스의 실행 결과를 효과적으로 정리하고 리포트 형태로 저장하기 위해 MySQL 저장 프로시저를 사용하는 방법을 설명합니다. 아래는 주어진 테스트 데이터를 분석하여 요약 정보를 report 테이블에 삽입하거나 업데이트하는 전체 로직입니다.

주요 테이블 구조

  • report: 집계된 테스트 결과를 저장하는 테이블
  • 필드: report_id(AUTO_INCREMENT), execution_flag, class_name, method_name, module, case_name, execution_amount, pass_amount, fail_amount, fail_reason, time, comment

핵심 저장 프로시저: sp_generate_test_summary

다음 프로시저는 특정 조건에 맞는 테스트 실행 데이터를 분석하고, 성공/실패 건수 및 실패 원인 등을 추출하여 리포트 테이블에 반영합니다.

DELIMITER $$

USE test_cases$$

DROP PROCEDURE IF EXISTS sp_generate_test_summary$$

CREATE PROCEDURE sp_generate_test_summary(
    IN input_table VARCHAR(100),
    IN target_class VARCHAR(100),
    IN target_method VARCHAR(100),
    IN exec_flag VARCHAR(100)
)
BEGIN
    -- 지역 변수 선언
    DECLARE v_class_name     VARCHAR(200) DEFAULT NULL;
    DECLARE v_method_name    VARCHAR(200) DEFAULT NULL;
    DECLARE v_module         VARCHAR(200) DEFAULT NULL;
    DECLARE v_case_title     VARCHAR(200) DEFAULT NULL;
    DECLARE v_pass_count     INT DEFAULT 0;
    DECLARE v_fail_count     INT DEFAULT 0;
    DECLARE v_failure_cause  TEXT DEFAULT NULL;
    DECLARE v_remarks        TEXT DEFAULT NULL;
    DECLARE dynamic_sql      TEXT;

    -- 성공한 테스트 수 조회
    SET @sql = CONCAT(
        'SELECT COUNT(*) FROM ', input_table,
        ' WHERE test_class = ''', target_class, '''',
        ' AND test_method = ''', target_method, '''',
        ' AND execution_flag = ''', exec_flag, '''',
        ' AND is_select = 1 AND is_pass = 1'
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    SELECT FOUND_ROWS() INTO v_pass_count;
    DEALLOCATE PREPARE stmt;

    -- 실패한 테스트 수 조회
    SET @sql = CONCAT(
        'SELECT COUNT(*) FROM ', input_table,
        ' WHERE test_class = ''', target_class, '''',
        ' AND test_method = ''', target_method, '''',
        ' AND execution_flag = ''', exec_flag, '''',
        ' AND is_select = 1 AND is_pass = 0'
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    SELECT FOUND_ROWS() INTO v_fail_count;
    DEALLOCATE PREPARE stmt;

    -- 모듈 이름 추출
    SET @sql = CONCAT(
        'SELECT DISTINCT test_module_name FROM ', input_table,
        ' WHERE execution_flag = ''', exec_flag, '''',
        ' AND test_method = ''', target_method, ''''
    );
    CALL sp_fetch_single_column_value(@sql, v_module);

    -- 테스트 케이스 한글명 추출
    SET @sql = CONCAT(
        'SELECT DISTINCT test_case_name FROM ', input_table,
        ' WHERE execution_flag = ''', exec_flag, '''',
        ' AND test_method = ''', target_method, ''''
    );
    CALL sp_fetch_single_column_value(@sql, v_case_title);

    -- 실패 사유 수집 (실제 결과 메시지 결합)
    SET @sql = CONCAT(
        'SELECT DISTINCT actual_result FROM ', input_table,
        ' WHERE test_class = ''', target_class, '''',
        ' AND test_method = ''', target_method, '''',
        ' AND execution_flag = ''', exec_flag, '''',
        ' AND is_select = 1 AND is_pass = 0 AND is_execution = 1'
    );
    CALL sp_fetch_single_column_value(@sql, v_failure_cause);

    -- 기존 레코드 존재 여부 확인 후 처리
    IF EXISTS (
        SELECT 1 FROM report 
        WHERE execution_flag = exec_flag 
          AND class_name = target_class 
          AND method_name = target_method
    ) THEN
        -- 기존 항목 업데이트
        UPDATE report 
        SET 
            module = v_module,
            case_name = v_case_title,
            execution_amount = v_pass_count + v_fail_count,
            pass_amount = v_pass_count,
            fail_amount = v_fail_count,
            fail_reason = v_failure_cause,
            comment = v_remarks,
            time = NOW()
        WHERE execution_flag = exec_flag 
          AND class_name = target_class 
          AND method_name = target_method;
    ELSE
        -- 신규 항목 삽입
        INSERT INTO report (
            execution_flag, class_name, method_name,
            module, case_name, execution_amount,
            pass_amount, fail_amount, fail_reason, time, comment
        ) VALUES (
            exec_flag, target_class, target_method,
            v_module, v_case_title, v_pass_count + v_fail_count,
            v_pass_count, v_fail_count, v_failure_cause, NOW(), v_remarks
        );
    END IF;
END$$

DELIMITER ;

보조 프로시저: sp_count_query_rows

임의의 SELECT 문의 결과 행 수를 반환하는 보조 프로시저입니다.

DELIMITER $$

USE test_cases$$

DROP PROCEDURE IF EXISTS sp_count_query_rows$$

CREATE PROCEDURE sp_count_query_rows(
    IN query_text TEXT,
    OUT row_count INT
)
BEGIN
    SET @q = query_text;
    PREPARE s FROM @q;
    EXECUTE s;
    SELECT FOUND_ROWS() INTO row_count;
    DEALLOCATE PREPARE s;
END$$

DELIMITER ;

보조 프로시저: sp_fetch_single_column_value

단일 컬럼 조회 결과를 모두 결합하여 하나의 문자열로 반환합니다. 중복 값은 제거하며, 다중 값을 ‘、’ 기호로 연결합니다.

DELIMITER $$

USE test_cases$$

DROP PROCEDURE IF EXISTS sp_fetch_single_column_value$$

CREATE PROCEDURE sp_fetch_single_column_value(
    IN source_query TEXT,
    OUT output_value TEXT
)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE temp_content VARCHAR(500);
    DECLARE combined_result TEXT DEFAULT '';

    -- 임시 테이블 사용
    DROP TEMPORARY TABLE IF EXISTS temp_result_set;
    
    SET @create_temp = CONCAT('CREATE TEMPORARY TABLE temp_result_set AS ', source_query);
    PREPARE stmt_create FROM @create_temp;
    EXECUTE stmt_create;
    DEALLOCATE PREPARE stmt_create;

    -- 커서 선언
    DECLARE result_cursor CURSOR FOR SELECT * FROM temp_result_set;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN result_cursor;

    read_loop: LOOP
        FETCH result_cursor INTO temp_content;
        IF done THEN
            LEAVE read_loop;
        END IF;

        IF combined_result = '' THEN
            SET combined_result = temp_content;
        ELSEIF temp_content IS NOT NULL AND CHAR_LENGTH(temp_content) > 0 THEN
            SET combined_result = CONCAT(combined_result, '、', temp_content);
        END IF;
    END LOOP;

    CLOSE result_cursor;
    DROP TEMPORARY TABLE temp_result_set;

    SET output_value = combined_result;
END$$

DELIMITER ;

이와 같은 구조를 통해 다양한 테스트 실행 테이블로부터 일관된 형식의 리포트를 자동 생성할 수 있으며, 대시보드나 외부 리포팅 도구에서 쉽게 활용 가능한 정형 데이터를 제공할 수 있습니다.

태그: MySQL 저장프로시저 동적SQL 리포트생성 테스트자동화

6월 9일 22:53에 게시됨