테스트 실행 결과를 기반으로 동적 리포트 생성하기
자동화 테스트 환경에서 각 테스트 케이스의 실행 결과를 효과적으로 정리하고 리포트 형태로 저장하기 위해 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 ;
이와 같은 구조를 통해 다양한 테스트 실행 테이블로부터 일관된 형식의 리포트를 자동 생성할 수 있으며, 대시보드나 외부 리포팅 도구에서 쉽게 활용 가능한 정형 데이터를 제공할 수 있습니다.