QAC/CPP Report Maker
개발 개요
QAC/CPP(2.5)에서 나오는 결과물 중 필요한 정보(에러발생파일, 위치(행/열), 에러코드, 에러코드 정보)를 추출하려고 파이썬으로 제작하였다.
주요한 기능은 아래와 같다.
- 필요한 정보를 엑셀 파일로 추출가능함.
- 별도의 파라미터 설정이 필요없음.
개발 환경
개발은 python 2.7로 하였으며, 실행파일은 py2exe로 만들었다.
개발에 사용된 주요 모듈은 아래와 같다.
- python 2.7.3 : python 인터프리터
- xlwt 0.7.4 : 엑셀 작업을 위한 모듈
- py2exe 0.6.9 : python 스크립트를 exe로 만들기 위한 모듈
개발 소스
사용된 파이썬 스크립트
# -*- coding: cp949 -*-
from subprocess import Popen, PIPE
import os
import sys
import time
import xlwt
ignore_code_list = [999, 1095]
#ignore_code_list = []
def lignex1_errdsp(qacpp_path, QAC_OR_QACPP):
print "QACPP Report Maker by OOO S/W Engineering Team V0.1 2012.07.08 (Powered by Python2.7.3)"
print "(1/2) running errdsp.exe -- ",
qacpp_err = run_errdsp(qacpp_path, QAC_OR_QACPP)
print "DONE"
print "(2/2) making a report -- ",
make_report(qacpp_path, qacpp_err)
print "DONE"
def run_errdsp(qacpp_path, QAC_OR_QACPP):
# errdsp.exe 를 위한 설정을 한다.
ERRDSP_ARG = []
ERRDSP_ARG.append(qacpp_path + r'\bin\errdsp.exe')
ERRDSP_ARG.append(QAC_OR_QACPP)
ERRDSP_ARG.append(r'-via')
ERRDSP_ARG.append(qacpp_path + r'\temp\settings.via')
ERRDSP_ARG.append(r'-m')
ERRDSP_ARG.append(r'-format')
ERRDSP_ARG.append(r'"%F,%l,%c,%n,%t"')
ERRDSP_ARG.append(r'-list')
ERRDSP_ARG.append(qacpp_path + r'\temp\filelist.lst')
# 환경 변수를 얻어오고, QACPPBIN 을 추가한다.
temp_envs = os.environ
temp_envs["QACPPBIN"] = qacpp_path + r"\bin"
# errdsp.exe를 실행한다.
P_errdsp = Popen(ERRDSP_ARG, env = temp_envs, shell=False, stdout=PIPE)
output, error = P_errdsp.communicate()
qacpp_err = []
# output을 분석하여, 에러 DB를 작성한다.
for line in output.split('\n'):
if "Included" in line:
#print "Ignore line found : " + line + '\n'
continue
if len(line) < 5:
#print "Blank line found"
continue
#if len(line.split(',')) != 5:
# print "Split error line found : " + line + '\n'
# continue
file_name, error_row, error_col, error_code, error_text = line.split(',', 4)
error_dict = {}
error_dict["error_file_name"] = file_name[1:]
error_dict["error_row"] = int(error_row)
error_dict["error_col"] = int(error_col)
error_dict["error_code"] = int(error_code)
error_dict["error_text"] = error_text[:-2]
if error_dict["error_code"] in ignore_code_list:
continue
else:
qacpp_err.append(error_dict)
return qacpp_err
def make_report(qacpp_path, qacpp_err):
save_path = qacpp_path + r'\temp'
file_save_path = save_path + r'\qac_cpp_result.txt'
excel_save_path = save_path + r'\qac_cpp_result.xls'
# 결과서를 위한 파일을 연다.
f = open(file_save_path, "w")
# 결과서를 위한 엑셀파일을 연다.
wb = xlwt.Workbook('cp949')
ws = wb.add_sheet('QACPP2.5_Result')
row = 0
ws.write(row, 0, "File Name")
ws.write(row, 1, "Error Row")
ws.write(row, 2, "Error Column")
ws.write(row, 3, "Error Code")
ws.write(row, 4, "Error Text")
row = 1
# 에러 DB에 있는 내용을 파일과 엑셀파일로 export한다.
for item in qacpp_err:
f.write(item["error_file_name"] + '\t' + str(item["error_row"]) + '\t' + str(item["error_col"]) + '\t' + str(item["error_code"]) + '\t' + item["error_text"] + '\n')
ws.write(row, 0, item["error_file_name"])
ws.write(row, 1, item["error_row"])
ws.write(row, 2, item["error_col"])
ws.write(row, 3, item["error_code"])
try:
ws.write(row, 4, item["error_text"])
except:
#ws.write(row, 4, item["error_text"].encode('latin-1'))
ws.write(row, 4, "Encoding Error!")
row = row + 1
# 파일을 저장한다.
f.flush()
f.close()
# 엑셀파일을 저장한다.
wb.save(excel_save_path)
if __name__ == "__main__":
QAC_OR_QACPP = "QACPP"
if sys.argv[1] != "QACPP":
QAC_OR_QACPP = "QAC"
print("QAC_OR_QACPP : %s" % (QAC_OR_QACPP))
lignex1_errdsp(r'..\..', QAC_OR_QACPP)
py2exe 설정 스크립트
from distutils.core import setup
import py2exe
setup(console=['make_qacpp_report.py'],)
설정 방법
1. 압축 파일을 QAC/CPP 가 설치된 하부 폴더 중 bin 밑에 압축을 해제한다.
2. QAC/CPP의 메뉴 중 Analyse -> Cross-Module Analysis -> Configure 를 선택합니다.
3. Add 를 하고, 압축한 파일 중 make_qacpp_report.exe를 선택합니다. Additional parameters는 기본으로 둡니다.
4. 코딩규칙검증을 완료한 이후, Cross-Module Analysis -> Run 을 선택하여, QAC/CPP 용 결과파일을 만들도록 합니다.
5. 해당 작업이 Complete 됨을 확인합니다.
6. QAC/CPP 설치 폴더 밑의 Temp 폴더에 결과파일이 생성됨을 확인합니다.
7. qacPP_result.xls을 열어 원하는 정보가 있음을 확인하면 됩니다.
추후 해결 사항
추후 해결해야 하는 사항
- QAC에서도 제대로 동작하는지 확인
- QAC/CPP 3.0 용으로 개발 필요
- 인자로 QAC/CPP의 설치 위치를 받아서 동작하도록 수정
이 글은 스프링노트에서 작성되었습니다.