본문 바로가기
Automation

QA 지원 도구가 필요해!! Python Tkinter로 QMS (QA Test Management System) 를 만들게 된 이야기

by Zeromk2 2021. 1. 1.
728x90

Postman으로 테스트에 필요한 기능들은 많이 자동화 해놨지만 여전히 테스트에는 시간이 많이 걸리는 precondition이나 step이 많았습니다.

한 곳에서 다 할 수있다면야 큰 문제가 되지 않았겠지만 어떤 셋팅은 Postman으로 하고, 

어떤 셋팅은 Nosqlbooster로 직접 DB를 수정해야 하고,

어떤 셋팅은 admin 페이지에서 해야 하니 여간 번거로운게 아니였습니다.

테스트전 사전셋팅에 시간이 점점 많이 사용되는 QA팀원들을 보며 이걸 해결해야 겠다고 생각했습니다.

 

Django + Python


마침 지금 강의도 듣고 있고 배운것도 써먹어 볼겸 이 조합으로 하는 것은 어떨까?

나는 회사에서 넉넉히 사놓은줄 알았지......

빠른 포기.

 

 

Python Standalone App


그렇다면 Python 으로 GUI툴을 만들어서 배포하는건 어떨까?

그런데 이 쪽은 아예 생각해본적도, 경험해본적도 없는 영역이였습니다. 

그래도 부담없이 시작할 수 있으니 토이 프로젝트 처럼 시작해보자. 하고 자료를 찾아보기 시작했습니다.

일단은 크게 2종류로 가닥이 나왔습니다.

Tkinter 아니면 PyQT5.

Tkinter는 python의 기본 내장형 GUI 라이브러리였고 PyQT5는 외부 라이브러리였습니다.

항상 세상 만사 모든 이치로 봤을 때 순정보다는 싸제가 이쁘고, 싸제보다는 순정이 호환성이 좋았습니다.

게다가 싸제는 비용까지 들지 않습니까? (실제로 PyQT5는 라이센스 비용이 있습니다)

이쁘게 만들어야 하는게 아니라 빠르게 편한 기능을 제공해야 했기에 저는 Tkinter로 가기로 했습니다. 

 

Tkinter를 사용하는건 다행히 크게 어렵지 않았습니다.

이 과정에서는 나도코딩님의 강의가 정말 많은 도움이 되었습니다.

그렌절이라도 드릴 수 있을 것 같아요 나도코딩님

 

다른 분들도 도움을 받으실 수 있을거라 생각하고 링크 남겨놓겠습니다.

 

 

 

뚝딱뚝딱 우당탕탕


최종적으로 구현된 UI는 이렇습니다. 

Python GUI 라이브러리 Tkinter 사용법 - Tutorial 1 포스팅에 mac용 어플리케이션 스크린샷이 있지만 이 글에는

윈도우 버전으로 올리도록 하겠습니다.

90년대 게임 인터페이스

 

Select_Server에서 테스트 대상 서버를 선택하는 것을 시작으로 모든 기능들을 사용할 수 있습니다.

최초로 API 요청을 보내는 서버가 결정되어야 하기 때문에 가장 선행되어야 하는 작업으로 처리해놨습니다.

server_menu = Menu(window)

select_server = Menu(server_menu, tearoff=0)
select_server.add_radiobutton(label="Staging", command=select_stg_server)
select_server.add_separator()
select_server.add_radiobutton(label="Develop", command=select_dev_server)
select_server.add_separator()
select_server.add_radiobutton(label="Live", command=select_live_server)

server_menu.add_cascade(label="Select_Server", menu=select_server)

window.configure(menu=server_menu)

** 이건 메뉴에 서버 선택 라디오 버튼을 추가하는 코드입니다.

서버 미 선택 상태에서 기능 사용 시도 시

 

그리고 보면 기능이나 메뉴들이 묘하게 왼쪽으로 쏠려있는 모습인데 그 이유가 있습니다.

버튼을 클릭해서 기능을 사용하는 것 까지는 좋은데, 내가 이 기능을 쓴건지 썼던건지 알 수 있는 방법이 없었습니다.

그래서 성공여부와 시간을 찍어주는 기능을 각 버튼 우측에 출력되도록 추가해놨습니다.

success_label = Label({대상frame}}, image=photo)
success_label.grid(row=0, column=9, pady=0)
time = datetime.now().strftime('%H:%M')
time_stamp = Label(user_account_frame, text=time)
time_stamp.grid(row=0, column=10)

OK 이미지와 타임스탬프 표시 기능

 

UI틀을 잡아가면서 DB를 직접 수정했었던 셋팅을 API로 사용할 수 있게 백엔드 개발자 분께 API 요청을 해놨습니다.

다행히도 빠르게 만들어서 배포해주셔서 admin 페이지에서 사용하는 API까지 합쳐서 제 코드에 다 명시해놨습니다.

requests 라이브러리를 써서 API를 사용했고 response data를 return해서 코드 내에서 사용할 수 있게 하였습니다.

그리고 필요한 data들은 yaml 파일로 관리하였습니다.

    with open(pyaml) as p:
        doc = yaml.load(p, Loader=yaml.FullLoader)
    doc['account_id'] = account_id.get()
    doc['account_pass'] = account_pass.get()

    with open(pyaml, 'w') as p:
        yaml.dump(doc, p)

** doc라는 변수에 yaml파일을 읽어온 값들을 넣는 코드입니다. pyaml은 해당 yaml파일의 경로가 저장된 변수에요
** account_id와 accound_pass는 Entry로 선언된 곳의 textvariable 값 입니다.

 

API 하나로 사용가능한 셋팅이 있는 반면, 복잡한 것들은 API를 15개나 쏴야 하는 경우도 있었습니다.

이건 구현하는데 시간이 좀 걸리긴 했지만

그래도 만들기 힘들면 쓰기는 쉽겠지 라는 생각을하면서 꾸준히 조금씩 개발해 나갔습니다.

 

 

완성! 하지만 배포에 발이 묶이다.


와! 다 만들었다!! 모든 기능이 다 정상동작하고 있고 팀 내에 시연도 끝났다. 이제 배포만 하면 된다!

 

아... 그런데 배포에 다시 발이 묶이게 됩니다.

하나의 python 파일로만 개발이 끝났다면 쉽게 응용프로그램으로 만들 수 있었을 텐데 

이미지도 사용하고 있고, 별도로 함수화 해놓은 API들도 있고, yaml 파일도 있었습니다.

이것들을 모두 빌드해야 했었고 pyinstaller와 py2app 사이에서 발만 동동 구르며 자료들을 찾아보고 있었습니다.

그리고 결국 pyinstaller로 응용파일 프로그램 생성에 성공합니다!

 

pyinstaller -w --add-data '{추가해야하는 파일경로}:{추가되어야하는 파일경로}' --add-data '{추가해야하는 파일경로}:{추가되어야하는 파일경로}' {tkinter코드가있는python파일}.py

** 터미널 작성 커맨드 입니다.
** --add-data는 추가해야 하는 파일이 있는만큼 계속 추가해서 작성하는게 가능합니다.

그리고 QA팀원들에게 배포하기 시작합니다.

다행히도 팀원분들이 너무 좋다며 서로 사용법을 공유하고

필요한 기능도 적극적으로 저에게 요청을 해주고 있습니다. (1.1.0 버전 가야하는건가...)

토이 프로젝트가 성공적으로 마무리 되었고 팀 내에 좋은 영향도 주는 것 같아 개인적으로 매우 뿌듯한 경험이였습니다.

 

물론 python 코드는 엉망이였고 고급문법이나 고급기술같은건 찾아볼 수 없지만 

서버 사이드 백엔드는 아니지만....

 

python을 좀 더 알아가는 계기가 되었고 다른 것도 할 수 있을 것 같다는 자신감까지 얻게 되었습니다.

앞으로 1.1.0 버전을 업데이트 하게 될지, 또 다른 테스트 자동화나 테스트 지원을 할 지는 모르겠지만 

어떤 것이 되었든 즐겁고 재미있는 과정이 될 것 같습니다. :)

댓글