PythonAutomationTest 플러그인이 필요합니다. 이 플러그인을 활성화하는 단계는 다음과 같습니다.
- 편집(Edit) > 플러그인(Plugins) 을 선택하여 플러그인(Plugin) 패널을 엽니다.
- 검색창을 사용하여 플러그인을 찾습니다.
- 해당하는 체크박스를 활성화합니다.
- 언리얼 에디터를 재시작합니다.
PythonAutomationTest 플러그인
PythonAutomationTest 플러그인은 현재 프로젝트에서 Python 스크립트를 자동으로 검색하여 테스트 자동화(Test Automation) 창에 테스트로 추가합니다. 이 플러그인은 자동화 테스트 시스템이 실패를 포착하고 잠복성 명령에 대처할 방법을 제공하도록 Python 스크립트를 래핑합니다.
플러그인을 활성화하면 프로젝트 및 플러그인 /Content/Python 폴더에 있는 test_*.py 패턴으로 이름이 지정된 Python 스크립트가 플러그인에 포함됩니다. 서브 폴더 구조는 파싱되어 테스트 이름에 반영되며, 그 결과 각 테스트가 다음 위치에 배치됩니다.
Editor > Python > Project/Plugin Name > Sub-folder Structure > Test Name
Python 스크립트 자체에서는 무엇이든 가능합니다. 파일(File) > Python 스크립트 실행(Execute Python Script) 을 통해 스크립트를 실행할 수 있습니다. 테스트 결과에는 모든 예외, 로그 오류 및 경고가 포함됩니다.
잠복성 명령 처리하기
비차단 함수를 호출한 경우, 이를 완료하려면 에디터에서 틱이 필요합니다.
에디터는 Python 스크립트 실행 중에는 틱하지 않으므로 글로벌 인터프리터 잠금(GIL)을 해제하고 포스트 슬레이트 콜백을 예약하고 python 을 다시 호출해야 합니다. 이를 수행하는 한 가지 방법은 다음과 같은 방식으로 Python 자동화 스케줄러를 사용하는 것입니다.
import unreal
@unreal.AutomationScheduler.add_latent_command
def load_some_stuff():
pass
이 인스트럭션은 등록한 순서대로 실행됩니다. 제너레이터를 등록하거나 콜백에서 함수 또는 제너레이터를 반환하여 동적으로 예약할 수 있습니다.
@unreal.AutomationScheduler.add_latent_command
def do_some_stuff():
print('initiate')
yield
print('start loop')
for i in xrange(10):
print('loop %d'% i)
task = get_a_task_somehow()
while not task.is_task_done():
yield
print('task %d done'% i)
오류 보고
테스트 실행 중에 3가지 방법으로 오류를 보고할 수 있습니다.
- Python
assert사용 - 현재 테스트에서 모든 추가 코드 실행을 차단하고 테스트 리포트에 Python 콜 스택을 포함합니다. raise Exception("<error>")- 현재 테스트에서 모든 추가 코드 실행을 차단하고 예외를 보고합니다.- 에디터 명령 또는
unreal.log_error("<error>")를 통해 오류 기록 - 테스트 리포트에 메시지를 포함하고 실행을 계속합니다.
예상 로그 오류
다음 Python 코드를 통해 예상 C++ 프레임워크 오류를 활용할 수 있습니다.
unreal.AutomationLibrary.add_expected_log_error(expected_pattern_string, occurrences=1, exact_match=False)
이 함수는 오류와 경고를 일치시킵니다. 같은 패턴으로 연속 호출해도 횟수가 누적되지 않습니다. 발생(occurrences) 횟수가 다르면 실패로 보고되므로 처음에 발생 횟수가 정확해야 합니다.
스크린샷 지원
자동화 스케줄러를 사용하여 Python 테스트 중에 스크린샷을 찍을 수 있습니다.
자동화 라이브러리의 take_high_res_screenshot 함수는 고해상도 스크린샷을 요청합니다. 그러나 고해상도 스크린샷 완성에는 추가 에디터 틱이 필요하므로 다음 단계로 진행하기 전에 스케줄러를 사용하여 테스트를 일시정지해야 합니다.
예시
다음은 레벨 로딩 이후 다양한 카메라에서 여러 번 스크린샷을 찍는 예시입니다.
import unreal
@unreal.AutomationScheduler.add_latent_command
def setup_level():
unreal.EditorLevelLibrary.load_level("/Game/mymap")
@unreal.AutomationScheduler.add_latent_command
def take_all_cam_screenshots():
level_actors = unreal.EditorLevelLibrary.get_all_level_actors()
all_cameras = unreal.EditorFilterLibrary.by_class(
level_actors,
unreal.CameraActor
)
for cam in all_cameras:
camera_name = cam.get_actor_label()
task = unreal.AutomationLibrary.take_high_res_screenshot(1280, 720, camera_name, camera=cam,)
if not task.is_valid_task():
continue
print ('Requested screenshot for '+ camera_name )
while not task.is_task_done():
yield
이미지 비교 지원
다음 명령을 사용하여 이미지 파일을 테스트 레퍼런스와 비교할 수 있습니다.
unreal.AutomationLibrary.compare_image_against_reference(image_file_path, comparison_name, comparison_tolerance)
이 함수는 이미지를 읽고 비교를 위해 이미지가 성공적으로 큐에 등록되면 true를 반환합니다. 큐에 등록된 비교는 테스트 종료 시 평가됩니다.
원격 측정 지원
다음 함수를 사용하여 Python 테스트 중에 원격 측정 데이터를 저장할 수 있습니다.
unreal.AutomationLibrary.add_test_telemetry_data(datapoint, measurement, context)
measurement 파라미터는 float입니다.
다음 함수를 사용하여 테스트에 사용하는 스토리지 이름을 변경할 수 있습니다.
unreal.AutomationLibrary.set_test_telemetry_storage(name)