수동 테스트 API
Test Optimization 수동 테스트 API는 베타로 제공되며 변경될 수 있습니다.
2.13.0 버전부터 Datadog Python SDK는 필요에 따라 테스트 최적화 결과를 제출할 수 있는 Test Optimization API(ddtrace.ext.test_visibility)를 제공합니다.
API 실행
이 API는 클래스를 사용하여 테스트 최적화 이벤트를 제출하는 네임스페이스 메서드를 제공합니다.
테스트 실행에는 두 가지 단계가 있습니다.
- 검색: 예상되는 항목을 API에 알림
- 실행: 결과 제출(시작 및 완료 호출 사용)
검색 단계와 실행 단계가 분리되어 있어 테스트 러너 프로세스가 테스트를 수집하는 시점과 테스트가 시작되는 시점 사이에 간격을 둘 수 있습니다.
API 사용자는 API의 상태 저장소 내에서 Test Optimization 항목을 참조하는 데 사용되는 일관된 식별자(아래 설명됨)를 제공해야 합니다.
활성화 test_visibility
Test Optimization API를 사용하기 전에 ddtrace.ext.test_visibility.api.enable_test_visibility() 함수를 호출해야 합니다.
데이터가 올바르게 플러시되도록 프로세스가 종료되기 전에 ddtrace.ext.test_visibility.api.disable_test_visibility() 함수를 호출합니다.
도메인 모델
API는 테스트 세션, 테스트 모듈, 테스트 모음 및 테스트란 네 개의 개념을 기반으로 합니다.
모듈, 모음, 테스트는 Python Test Optimization API에서 계층 구조를 형성하며, 이는 항목 식별자의 상위 관계에 의해 표현됩니다.
테스트 세션
테스트 세션은 프로젝트의 테스트 실행을 나타내며, 일반적으로 테스트 명령의 실행에 해당합니다. Test Optimization 프로그램 실행 시 하나의 세션만 검색하고 시작 및 완료할 수 있습니다.
ddtrace.ext.test_visibility.api.TestSession.discover()를 호출하여 세션을 검색하고 테스트 명령, 지정된 프레임워크 이름 및 버전을 전달합니다.
ddtrace.ext.test_visibility.api.TestSession.start()를 호출하여 세션을 시작합니다.
테스트가 완료되면 ddtrace.ext.test_visibility.api.TestSession.finish()를 호출합니다.
테스트 모듈
테스트 모듈은 프로젝트 테스트 실행 내의 더 작은 작업 단위(예: 디렉터리)를 나타냅니다.
ddtrace.ext.test_visibility.api.TestModuleId()을(를) 호출하고 모듈 이름을 파라미터로 제공하여 TestModuleId를 생성하세요.
ddtrace.ext.test_visibility.api.TestModule.discover()를 호출하고 TestModuleId 객체를 인수로 전달하여 모듈을 검색하세요.
TestModuleId 객체를 인수로 전달하여 ddtrace.ext.test_visibility.api.TestModule.start()를 호출하고 모듈을 시작하세요.
모듈 내의 모든 하위 항목이 완료된 후 TestModuleId 객체를 인수로 전달하여 ddtrace.ext.test_visibility.api.TestModule.finish()를 호출하세요.
테스트 모음
테스트 모음은 프로젝트 모듈 내 테스트의 하위 집합(.py 파일 등)을 나타냅니다.
TestSuiteId를 생성하려면 상위 모듈의 TestModuleId와 모음 이름을 인수로 제공하여 ddtrace.ext.test_visibility.api.TestSuiteId()를 호출하세요.
TestSuiteId 객체를 인수로 전달하여 ddtrace.ext.test_visibility.api.TestSuite.discover()를 호출하고 모음을 검색하세요.
TestSuiteId 객체를 인수로 전달하여 ddtrace.ext.test_visibility.api.TestSuite.start()를 호출하고 모듈을 시작하세요.
모음 내의 모든 하위 항목이 완료된 후 TestSuiteId 객체를 인수로 전달하여 ddtrace.ext.test_visibility.api.TestSuite.finish()를 호출하세요.
테스트
테스트는 테스트 모음의 일부로 실행되는 단일 테스트 케이스를 나타냅니다.
TestId를 생성하려면 상위 모음의 TestSuiteId와 테스트 이름을 인수로 제공하여 ddtrace.ext.test_visibility.api.TestId()를 호출하세요. TestId() 메서드는 선택적 parameters 인수로 JSON 파싱 가능한 문자열을 허용합니다. parameters 인수는 이름은 같지만 파라미터 값이 다른 파라미터화된 테스트를 구분하는 데 사용할 수 있습니다.
ddtrace.ext.test_visibility.api.Test.discover()를 호출하고 TestId 객체를 인수로 전달하여 테스트를 검색하세요. Test.discover() 클래스 메서드는 선택적 resource 파라미터로 문자열을 허용하며, 기본값은 TestId의 name입니다.
ddtrace.ext.test_visibility.api.Test.start()를 호출하고 TestId 객체를 인수로 전달하여 테스트를 시작하세요.
ddtrace.ext.test_visibility.api.Test.mark_pass()를 호출하고 TestId 객체를 인수로 전달하여 테스트가 성공적으로 통과했음을 표시하세요.
ddtrace.ext.test_visibility.api.Test.mark_fail()을 호출하고 TestId 객체를 인수로 전달하여 테스트가 실패했음을 표시하세요. mark_fail()은 선택적 TestExcInfo 객체를 exc_info 파라미터로 허용합니다.
ddtrace.ext.test_visibility.api.Test.mark_skip()을 호출하고 TestId 객체를 인수로 전달하여 테스트가 건너뛰어졌음을 표시하세요. mark_skip()은 선택적 문자열을 skip_reason 파라미터로 허용합니다.
ddtrace.ext.test_visibility.api.Test.mark_fail() 클래스 메서드는 테스트 실패 중에 발생한 예외에 대한 정보를 보유합니다.
ddtrace.ext.test_visibility.api.TestExcInfo() 메서드는 세 개의 위치 파라미터를 사용합니다.
exc_type: 발생한 예외의 유형exc_value: 예외에 대한 BaseException 객체exc_traceback: 예외에 대한 Traceback 객체
ddtrace.ext.test_visibility.api.Test.discover() 클래스 메서드는 codeowners 파라미터로 선택적 문자열 목록을 허용합니다.
ddtrace.ext.test_visibility.api.Test.discover() 클래스 메서드는 source_file_info 파라미터로 선택적 TestSourceFileInfo 객체를 허용합니다. TestSourceFileInfo 객체는 주어진 테스트의 경로와 필요시 시작 및 종료 라인을 나타냅니다.
ddtrace.ext.test_visibility.api.TestSourceFileInfo() 메서드는 세 개의 위치 파라미터를 사용합니다.
path: pathlib.Path 객체(Test Optimization API에서 리포지토리 루트를 기준으로 상대 경로로 변환)start_line: 파일 내 테스트의 시작 라인을 나타내는 선택적 정수end_line: 파일 내 테스트의 종료 라인을 나타내는 선택적 정수
테스트 탐색 후 파라미터 설정
ddtrace.ext.test_visibility.api.Test.set_parameters() 클래스 메서드는 TestId 객체와 JSON으로 파싱 가능한 문자열을 인수로 받아 테스트의 parameters를 설정합니다.
참고: 이는 테스트와 관련된 파라미터를 덮어쓰지만 TestId 객체의 parameters 필드는 수정하지 않습니다.
테스트가 탐색된 후 파라미터를 설정하려면 parameters 필드가 설정되지 않은 경우에도 TestId 객체가 고유해야 합니다.
코드 예시
from ddtrace.ext.test_visibility import api
import pathlib
import sys
if __name__ == "__main__":
# Enable the Test Optimization service
api.enable_test_visibility()
# Discover items
api.TestSession.discover("manual_test_api_example", "my_manual_framework", "1.0.0")
test_module_1_id = api.TestModuleId("module_1")
api.TestModule.discover(test_module_1_id)
test_suite_1_id = api.TestSuiteId(test_module_1_id, "suite_1")
api.TestSuite.discover(test_suite_1_id)
test_1_id = api.TestId(test_suite_1_id, "test_1")
api.Test.discover(test_1_id)
# A parameterized test with codeowners and a source file
test_2_codeowners = ["team_1", "team_2"]
test_2_source_info = api.TestSourceFileInfo(pathlib.Path("/path/to_my/tests.py"), 16, 35)
parametrized_test_2_a_id = api.TestId(
test_suite_1_id,
"test_2",
parameters='{"parameter_1": "value_is_a"}'
)
api.Test.discover(
parametrized_test_2_a_id,
codeowners=test_2_codeowners,
source_file_info=test_2_source_info,
resource="overriden resource name A",
)
parametrized_test_2_b_id = api.TestId(
test_suite_1_id,
"test_2",
parameters='{"parameter_1": "value_is_b"}'
)
api.Test.discover(
parametrized_test_2_b_id,
codeowners=test_2_codeowners,
source_file_info=test_2_source_info,
resource="overriden resource name B"
)
test_3_id = api.TestId(test_suite_1_id, "test_3")
api.Test.discover(test_3_id)
test_4_id = api.TestId(test_suite_1_id, "test_4")
api.Test.discover(test_4_id)
# Start and execute items
api.TestSession.start()
api.TestModule.start(test_module_1_id)
api.TestSuite.start(test_suite_1_id)
# test_1 passes successfully
api.Test.start(test_1_id)
api.Test.mark_pass(test_1_id)
# test_2's first parametrized test succeeds, but the second fails without attaching exception info
api.Test.start(parametrized_test_2_a_id)
api.Test.mark_pass(parametrized_test_2_a_id)
api.Test.start(parametrized_test_2_b_id)
api.Test.mark_fail(parametrized_test_2_b_id)
# test_3 is skipped
api.Test.start(test_3_id)
api.Test.mark_skip(test_3_id, skip_reason="example skipped test")
# test_4 fails, and attaches exception info
api.Test.start(test_4_id)
try:
raise(ValueError("this test failed"))
except:
api.Test.mark_fail(test_4_id, exc_info=api.TestExcInfo(*sys.exc_info()))
# Finish suites and modules
api.TestSuite.finish(test_suite_1_id)
api.TestModule.finish(test_module_1_id)
api.TestSession.finish()
추가 구성은 구성 설정을 참조하세요.