안녕하세요! 김명관입니다. 이번에는 Python을 이용해 내 화면을 녹화해주는 QA용 블랙박스를 만들어 보았습니다. 제 강의를 듣는 분들께 항상 드리는 말씀이지만 만들 줄 알아도 실제로 만드는 것은 어렵죠.. 몇 년 전부터 이런 프로그램이 필요하다고 느꼈었는데요 드디어 만들게 되었네요. 왜 만들게 되었고, 어떻게 만들었는지 간단하게 공유해보겠습니다. 아니 또 왜 이렇게 된거지? 테스트를 한참 하다보면 제가 주목하지 않고 있던 요소에서 어느새 버그가 발생한 경우가 자주 있습니다. 보통 이럴 때는 아무리 재현 경로를 찾아보려고 해도 찾을 수가 없습니다. 머리 속으로 내가 무슨 행동을 했는지 기억해 내도 한계가 있죠.. 일단 버그 티켓을 작성하고, "재현 경로가 파악되지 않아 작성하지 못했습니다. 재현 경로를 찾는 즉시 내용 추가하겠습니다." 와 같이 쓰고 넘어가곤 했죠. 재현 경로를 찾기 전까지 버그는 그대로 방치되기도 했습니다. 이대로 두면 안되겠다! 라는 생각이 들었고 전부터 만들고 싶다는 생각만 가지고 있었던 QA용 블랙박스를 만들게 되었습니다. 왜 만들어 쓰나요? "툴을 쓰면 되지 왜 만드느라 시간을 쓰나요?" 필요한 것이 있으면 만들어 쓰는 편인 제가 종종 듣는 질문입니다. 저도 글을 쓰면서 QA용 블랙박스를 직접 만들게 된 이유를 생각해 보았습니다. 먼저, 저는 뭔가 만드는 것을 매우 좋아합니다. 만들면서 다양한 라이브러리를 익히는 것도 재미있고 그 과정에서 부가적인 지식들을 알게되는 것도 좋아합니다. 그리고 툴은 제가 원하는 것을 100% 충족해 주지 못하기 때문입니다. 제가 직접 만들었을때의 가장 큰 장점은 저와, 주변 사람들이 필요로 하는 기능을 얼마든지 커스터마이징 할 수 있다는 것입니다. 툴을 사용한다면 내가 원하는 모든 기능을 원하는 그대로 사용할수는 없겠죠. 이런 이유로 보통 직접 만들어 사용하고 있습니다. 내가 원하는 것은.. 기존의 화면 녹화 프로그램은 녹화를 중지하기 전까지 계속해서 화면을 녹화하고 있습니다. 녹화 파일의 크기는 계속해서 커지게 됩니다. 그리고 저는 몇 시간에 달하는 영상이 필요한 것이 아닙니다. 버그가 발생한 순간 제가 어떤 행동을 했는지 파악하기 위해, 그리고 버그티켓에 첨부하기 위해 짧은 1분 내외의 영상이 필요한 것이었습니다. 그렇게 제가 원하는 기능을 몇가지로 정리해 보았습니다. 내가 주로 작업하는 화면만 골라서 녹화할 것. 영상의 녹화 파일은 1분정도의 영상을 녹화할 것. 녹화 파일이 너무 많아지지 않도록 파일을 계속 관리해줄 것. 구현하기 내가 주로 작업하는 화면만 골라서 녹화할 것. Python으로 모니터 정보를 식별할 수 있는 screeninfo라는 라이브러리가 있습니다. 해당 라이브러리를 이용해 나의 모니터 정보를 출력하면 아래와 같이 출력됩니다. import screeninfo screen_info = screeninfo.get_monitors() print(screen_info) >>> [Monitor(x=0, y=2160, width=2400, height=1500, width_mm=302, height_mm=188, name='\\\\.\\DISPLAY1', is_primary=False), Monitor(x=0, y=0, width=3840, height=2160, width_mm=700, height_mm=390, name='\\\\.\\DISPLAY2', is_primary=True)] 모니터 객체가 리스트 형태로 출력되고 그 중 주모니터는 is_primary 라는 속성으로 구별됩니다. 저는 주로 작업을 주모니터에서 하기 때문에 제가 촬영할 화면을 아래와 같이 식별하였습니다. screen_info = screeninfo.get_monitors() for screen_iterator in screen_info: if screen_iterator.is_primary: width = screen_iterator.width height = screen_iterator.height 모니터 좌표값을 이용해 주모니터의 좌표 영역을 촬영하도록 width, height 변수를 설정했습니다. 영상의 녹화 파일은 1분정도의 영상을 녹화할 것. 기본적으로는 녹화를 시작하고 나서 종료하기 전까지는 계속해서 화면을 녹화하고 있습니다. 하지만 저는 긴 영상이 필요한 것이 아니고 버그 재현에 필요한 정도의 길이만 필요하기 때문에 대략 1분 전후로 하나의 영상을 끊고 싶었습니다. 2중 반복문 안에서 녹화 시작 시간과 현재 시간을 비교하여 60초를 지나는 시점에 break로 반복문을 종료하여 1분단위의 녹화 파일을 계속 만들어 내도록 구현하였습니다. 녹화 파일이 너무 많아지지 않도록 파일을 계속 관리해줄 것. 화면을 녹화할 때 가장 먼저 생각했던 기능입니다. 녹화 파일을 무한정 만들지 말고 필요한 수 만큼만 만들면 가장 오래된 파일을 지우도록 구현해 두었습니다. 녹화 파일들이 너무 많은 용량을 차지한다면 별로 실용적이지 못하다고 느낄 것 같았기 때문입니다. OS 모듈을 이용하여 녹화 파일들이 저장되는 폴더 내에 파일 개수를 확인하고 10개가 넘으면 지우도록 구현하였습니다. for root, sub, files in os.walk(path): if len(files) > 9: file_list = os.listdir(path) print(file_list) os.remove(f"{path}/{file_list[0]}") 결과 파일은 이렇게 보여지게 됩니다. 평범한 파일 리스트라서 특별할 것은 없습니다. 마무리 입력값 매크로 이후에 실무에서 정말 잘 사용하게 된 툴을 하나 만들게 되었네요! 저는 정말 잘 쓰고 있습니다. 실제로 업무 하면서 계속 녹화를 하고있고, 메모리나 cpu사용량을 확인해보니 장시간 사용하더라도 점유율이 낮아서 더 안심하고 사용하고 있습니다. 팀에도 공유 드렸는데요, 팀원 분들도 잘 사용하셨으면 좋겠습니다. 한가지 아쉬운 점은 MacOS에서는 어떤 코덱과 어떤 파일형식을 사용해도 영상 파일이 0초로 만들어지고 있습니다.. 혹시나 opencv2를 이용해 MacOS 화면 녹화하는 방법에 대해 아시는 분이 계시다면 비법..전수..부탁드립니다 ㅠㅠ QA용 블랙박스에 한가지 더 욕심이 있다면 화면 녹화 뿐 아니라 세션 정보도 기록되면 좋겠다는 생각을 하고 있습니다. 에러가 발생하는 시점의 세션도 캡쳐가 가능하도록 언젠가는 업그레이드 해보려고 합니다. 간만에 작성한 글 읽어주셔서 감사합니다!