본문 바로가기

Tools

QAC/CPP Report Maker

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 를 선택합니다.

qacpp_report_maker_01.JPG

 

3. Add 를 하고, 압축한 파일 중 make_qacpp_report.exe를 선택합니다. Additional parameters는 기본으로 둡니다.

qacpp_report_maker_02.JPG

 

4. 코딩규칙검증을 완료한 이후, Cross-Module Analysis -> Run 을 선택하여, QAC/CPP 용 결과파일을 만들도록 합니다.

qacpp_report_maker_03.JPG

 

5. 해당 작업이 Complete 됨을 확인합니다.

qacpp_report_maker_03-01.JPG

 

6. QAC/CPP 설치 폴더 밑의 Temp 폴더에 결과파일이 생성됨을 확인합니다.

qacpp_report_maker_04.JPG

 

7. qacPP_result.xls을 열어 원하는 정보가 있음을 확인하면 됩니다.

qacpp_report_maker_05.JPG

 

추후 해결 사항

추후 해결해야 하는 사항

  • QAC에서도 제대로 동작하는지 확인
  • QAC/CPP 3.0 용으로 개발 필요
  • 인자로 QAC/CPP의 설치 위치를 받아서 동작하도록 수정

이 글은 스프링노트에서 작성되었습니다.