0. 개요 : Airtest란?
1. AirtestIDE는 중국의 넷이즈 게임즈 만든 테스트 자동화 툴
2. 파이썬 언어를 기반으로 제작
3. Airtest는 이미지 캡쳐를 이용하여 테스트를 자동화하는 툴
https://koreascience.kr/article/CFKO202125036551390.page
즉, 이미지를 캡쳐해 원하는 요소를 검증 해주는 파이썬 언어 기반 자동화 툴이다.
1. 기존 게임 테스트의 문제
아래 게임은 Pikmin Bloom으로, Unity 기반으로 만들어진 게임을 Appium inspector로 켜 본 결과다.
이미지에서 보다시피, 요소가 전혀 잡히지 않는다.
보통의 앱이라면, 아래와 같이 요소가 나와야 한다.
대다수의 게임이 이런진 모르겠으나, Unity 게임은 이런식으로 화면에서 요소(Element)를 찾을 수 없다.
따라서, 요소를 기반으로 클릭하는 Selenium스러운 방식을 사용하기 어려운 부분이 있다.
그렇다면 게임 자동화는 어떤 식으로 할 수 있을까?
2. 이미지 매칭
Opencv2에서, matchTemplate 함수가 있다.
import cv2
original_img = cv2.imread("original.png") # 원본 이미지
template_img = cv2.imread("template.png") # 원본에서 잘라낸, 찾고자 하는 템플릿 이미지
res = cv2.matchTemplate(original_img, template_img, cv2.TM_CCOEFF_NORMED) # 템플릿 이미지 찾기
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
'''
min_val = 템플릿과 가장 일치하지 않은 곳의 점수 (필요 없음, 값은 0~1)
max_val = 템플릿과 가장 일치한 곳의 점수 (필요함, 값은 0~1)
min_loc = 가장 일치하지 않은 곳의 좌표 (필요 없음)
max_loc = 가장 일치한 곳의 좌표 (이 곳이 목표 좌표)
'''
즉,
- 원본 이미지를 준비하고,
- 원본에서 찾고자 하는 요소을 잘라 준비하고,
- matchTemplate 기능을 이용해 max_val, max_loc 값을 얻고,
- max_val 값이 일정 수준(임계치) 넘길 시 max_loc 좌표를 돌려준다.
의 형식으로 "원하는 이미지가 어디있는지 찾기" 가 가능하다.
아래는 실제로 구현한 예시다.
이렇게 원본 이미지와, 템플릿 이미지를 준비하고 matchTemplate 함수를 활용하면
좌표를 찾아 낼 수 있다.
3. Airtest
Airtest는 이러한 방식으로 만들어진 것으로 확인된다.
airtest의 template_matching.py를 보면, (어느정도 전처리를 거친) 이미지를 템플릿매칭해서
best_match라는 이름으로 max_loc 좌표를 (전처리하여) 돌려준다.
4. 사용법
Airtest에서 다음과 같이 사용할 수 있는 함수가 있다.
airtest 함수 명 | 설명 | 유사한 명령어 |
start_app | 앱 실행 | adb shell am start |
touch | 이미지 터치 | adb shell input tap x y |
wait | 이미지 나타날 때 까지 대기 | WebdriverWait |
swipe | 스와이프 | adb shell input tap x y x y |
exists | 이미지가 화면 내 존재하는지 확인 | WebdriverWait |
text | 텍스트 입력 | adb shell input text |
keyevent | key event 입력 | adb shell input keyevent |
snapshot | 스크린 샷 | adb shell screencap |
sleep | 일정 시간 대기 | time.sleep(n) |
말고도 많은데
5. 한계
원하는 이미지가 가만히 있는다면 깔끔하게 목표 영역을 찾아낼 수 있다.
하지만, 누르고자 하는 영역이 움직이거나 색이 변한다면, 찾는 데에 실패할 수 있다.
ex 1.) lv 10까지는 "구매" 버튼이 빨간색인데, lv 11부터는 "구매" 버튼이 파란색으로 노출되는 ux 디자인
ex 2.) 버튼이 누르고 싶게 유도하기 위해 화려하게 이펙트가 발생
실제로, 이미지 매칭 유사도의 한계는 0.8이다.
또한, 안드로이드 기기를 대상으로 테스트 했을 때 결국 python의 subprocess에서 adb 명령어를 이용하여 화면을 불러오고, 캡쳐하고, 클릭하곤 한다.
appium 서버에, opencv 사용에, adb subprocess까지 하려고 하면 컴퓨터 자원을 아주 많이 잡아먹지 않을까?
디바이스가 하나 뿐이라면 문제가 없겠지만, 디바이스를 수십대 연결하면 컴퓨터가 비명을 지르지 않을까.. 생각된다!
6. 결론
Airtest IDE에서는 리포트 생성 기능도 있고, 캡처를 도와주고 빠르게 붙이는 강력한 기능도 있는데, 왜인지 마음이 안간다.
뭔가 쓰고싶지 않은 느낌?
아마 이런 거부감 때문에 현업에서는 새로운 툴 도입이 어려운 걸 수도 있다.
그치만 하나 확실한건, 이미지 매칭 기반 자동화 프로세스에 대해 배울 수 있는 훌륭한 프로젝트다!
많은 게임은 요소 찾는게 불가능 하지만, 어떻게든 자동화를 구현할 수는 있는듯.