Writer: Harim Kang
Intel korea Validation Team으로 저는 특정 프로젝트에 대한 테스팅 코드를 짜는 업무입니다. Test Code를 실행하고, 테스트 결과를 깔끔하게 csv로 정리하는 작업을 조금 더 간단한 프로젝트로 구성하여 글로 써보았습니다.
[Test Project Path]
│ test_exec.py
│
├───app
│ └───client.py
│
│
└───tests
├───input
│ test_case.json
│
└───output
class Client:
def __init__(self):
pass
def post(self, resource, data, content_type):
return {
"status_code": "201"
}
def get(self, resource):
resp = {
"status_code": "200",
"items": [
{
"created_at": "string",
"name": "string",
"project_id": 2,
"working_dir": "string"
}
]
}
return resp
def delete(self, resource):
return {
"status_code": "404"
}
import os
import csv
import json
import argparse
from app.client import Client
class TestExecution:
def __init__(self, csv_file, tc_id, tc_name, commands, expected_results):
# Constructing an object by receiving parameters
self.csv_file = csv_file
self.tc_id = tc_id
self.tc_name = tc_name
self.commands = commands
self.expected_results = expected_results
self.actual_result = None
self.status = "NOT TESTED"
def run(self):
print('=====Running APP=====')
# App execution and client creation
client = Client()
print('======Testing=====')
method = self.commands['--method']
resp = None
if method == "POST":
resp = client.post(self.commands['--resource'],
self.commands['--representation']['data'],
self.commands['--representation']['content-type'])
self.actual_result = resp['status_code']
elif method == "GET":
resp = client.get(self.commands['--resource'])
self.actual_result = resp
elif method == "DELETE":
resp = client.delete(self.commands['--resource'])
self.actual_result = resp['status_code']
if resp:
self.eval_status(resp)
self.write_output()
def eval_status(self, resp):
print('=====Evaluate Status=====')
# Function that determines status by checking whether status_code matches expected_status
if resp['status_code'] == self.expected_results['status_code']:
self.status = 'PASSED'
else:
self.status = 'FAILED'
def write_output(self):
print('====Write CSV=====')
data = [
self.tc_id,
self.tc_name,
self.expected_results,
self.actual_result,
self.status
]
with open(self.csv_file, 'a', newline='') as _outfile:
_writer = csv.writer(_outfile)
_writer.writerow(data)
if __name__ == '__main__':
# Instance to receive arguments of parser
parser = argparse.ArgumentParser(description='arguments supported')
parser.add_argument('-t', '--test_type', default='simple_test', help='input an test type [default : "simple_test"]')
args = parser.parse_args()
test_type = args.test_type.strip()
# Create Output CSV File
csv_file = './tests/output/' + test_type + '.csv'
if not os.path.isfile(csv_file):
header = [
'TC_ID',
'TC_Name',
'Expected_Result',
'Actual_Result',
'Status'
]
print('=====Create CSV File & Input CSV File Header...=====')
with open(csv_file, 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerow(header)
# Open Test Cases file(.json)
print('=====Test Case Load...=====')
json_data = json.load(open('./tests/input/test_case.json'))
for tc in json_data['test_cases']:
test = TestExecution(csv_file=csv_file,
tc_id=tc['tc_id'],
tc_name=tc['name'],
commands=tc['commands'],
expected_results=tc['expected_results'])
test.run()
테스트 케이스를 가져오는 코드는 아래와 같습니다.
# Open Test Cases file(.json)
print('=====Test Case Load...=====')
json_data = json.load(open('./tests/input/test_case.json'))
아래의 코드는 csv파일 맨 앞 줄에 지정한 변수를 넣는 작업입니다. 각 데이터의 열이 무엇을 의미하는지를 작성합니다.
# Create Output CSV File
csv_file = './tests/output/' + test_type + '.csv'
if not os.path.isfile(csv_file):
header = [
'TC_ID',
'TC_Name',
'Expected_Result',
'Actual_Result',
'Status'
]
print('=====Create CSV File & Input CSV File Header...=====')
with open(csv_file, 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerow(header)
TestExecution 객체에게 정보를 주고, run을 하면 테스트 수행 후, csv파일이 작성됩니다.
for tc in json_data['test_cases']:
test = TestExecution(csv_file=csv_file,
tc_id=tc['tc_id'],
tc_name=tc['name'],
commands=tc['commands'],
expected_results=tc['expected_results'])
test.run()
csv파일에 테스트 수행 결과를 작성하는 함수는 write_output() 함수입니다. 클래스의 변수들을 가져와서 파일을 작성합니다.
def write_output(self):
print('====Write CSV=====')
data = [
self.tc_id,
self.tc_name,
self.expected_results,
self.actual_result,
self.status
]
with open(self.csv_file, 'a', newline='') as _outfile:
_writer = csv.writer(_outfile)
_writer.writerow(data)
[Python] JSON 다루기 기초 (0) | 2020.05.22 |
---|---|
Docker 설치 및 사용법 (1) | 2019.12.31 |