테스트 실행 및 작성¶
참고
이 문서는 Python의 개발 중 체크아웃에서 작업하고 있다고 가정합니다. 그렇지 않다면 여기에 제시된 일부 내용은 이전 버전의 Python에서 사용할 수 없는 새로운 기능에 의존할 수 있으므로 작동하지 않을 수 있습니다.
실행¶
테스트 스위트를 실행하는 가장 짧고 간단한 방법은 체크아웃의 루트 디렉터리에서(Python을 빌드한 후) 다음 명령을 실행하는 것입니다:
이 명령은 테스트 대부분을 실행하지만 일부는 제외합니다. 제외되는 테스트는 특수한 종류의 리소스를 사용합니다. 예를 들어 인터넷에 접속하거나, 소리를 재생하거나, 데스크톱에 그래픽 인터페이스를 표시하려고 합니다. 테스트 스위트 실행이 지나치게 방해되지 않도록 이러한 테스트는 기본적으로 비활성화되어 있습니다. 이러한 추가 테스트 중 일부를 활성화하려면(그리고 참조 누수와 같은 다양한 문제의 디버깅에 도움이 되는 다른 플래그를 알아보려면) 도움말 텍스트를 읽으십시오:
./python -m test -h
./python.exe -m test -h
.\python.bat -m test -h
단일 테스트 파일을 실행하려면 테스트 파일 이름을 확장자 없이 인자로 지정하기만 하면 됩니다. 또한 개별 실패의 세부 정보가 표시되도록 상세 출력 모드(-v 사용)를 활성화하는 것이 좋습니다:
./python -m test -v test_abc
./python.exe -m test -v test_abc
.\python.bat -m test -v test_abc
단일 테스트 케이스를 실행하려면 unittest 모듈을 사용하고 테스트 케이스의 임포트 경로를 제공하십시오:
./python -m unittest -v test.test_abc.TestABC_Py
./python.exe -m unittest -v test.test_abc.TestABC_Py
.\python.bat -m unittest -v test.test_abc.TestABC_Py
일부 테스트 모듈은 직접 호출도 지원하며, 이는 IDE와 로컬 디버깅에 유용할 수 있습니다:
./python Lib/test/test_typing.py
./python.exe Lib/test/test_typing.py
.\python.bat Lib/test/test_typing.py
하지만 몇 가지 중요한 참고 사항이 있습니다:
이 테스트 실행 방식은 로컬 개발자의 필요만을 위해 존재하며 다른 용도로는 권장하지 않습니다
일부 모듈은 이를 전혀 지원하지 않습니다. 한 가지 예는
test_importlib모듈입니다. 다시 말해, 어떤 모듈에unittest.main()이 없다면 해당 모듈은 직접 호출을 지원하지 않을 가능성이 큽니다.
멀티 코어 또는 멀티 CPU 머신을 사용하는 경우, 여러 Python 프로세스를 사용하는 병렬 테스트를 활성화하여 실행 속도를 높일 수 있습니다:
./python -m test -j0
./python.exe -m test -j0
.\python.bat -m test -j0
마지막으로, 더 엄격한 설정에서 테스트를 실행하려면 test를 다음과 같이 실행할 수 있습니다:
./python -bb -E -Wd -m test -r -w -uall
./python.exe -bb -E -Wd -m test -r -w -uall
.\python.bat -bb -E -Wd -m test -r -w -uall
Python에 전달되는 여러 추가 플래그는 다양한 측면에서 Python이 훨씬 더 엄격하게 동작하도록 합니다(-Wd 플래그는 언젠가 -W error가 되어야 하지만, 테스트 스위트에서 아직 모든 경고를 처리하지 못했으므로 버그가 없는 Python이 -W error로 테스트 실행을 제대로 완료한다고 보장할 수 없습니다). 테스트 실행기의 -r 플래그는 테스트를 더 무작위적인 순서로 실행하여 여러 테스트가 서로 간섭하지 않는지 확인하는 데 도움이 됩니다. -w 플래그는 실패한 테스트를 다시 실행하여 실패가 일시적인지 일관적인지 확인하도록 합니다. -uall 플래그는 사용 가능한 모든 리소스를 사용하도록 허용하여 인터넷 접근 등이 필요한 테스트를 건너뛰지 않게 합니다.
참조 누수를 확인하려면(C 코드를 수정한 경우에만 필요함) 테스트 중에 -R 플래그를 사용하여 참조 누수 검사를 활성화할 수 있습니다. 예를 들어 다음 명령을 사용합니다:
python -m test <test_name> -R :
이 기본 설정은 참조 횟수를 안정화하기 위해 몇 차례의 초기 워밍업 실행을 수행한 다음, 누수를 확인하기 위해 추가로 실행합니다.
실행 횟수를 더 세밀하게 제어하려면 warmups 및 repeats를 명시적으로 지정할 수 있습니다:
python -m test <test_name> -R <warmups>:<repeats>
예를 들어 -R 3:2는 먼저 참조 횟수를 안정시키기 위해 테스트를 3번 실행한 다음, 누수를 확인하기 위해 2번 더 실행합니다.
CPython 체크아웃에 있는 Tools/scripts/run_tests.py 스크립트도 실행할 수 있습니다. 이 스크립트는 속도와 철저함 사이의 균형을 맞추려고 합니다. 하지만 가장 철저한 테스트를 원한다면 위에 제시된 엄격한 방식을 사용해야 합니다.
로케일 지원¶
일부 테스트를 성공적으로 실행하려면 특정 로케일이 필요합니다. 이러한 로케일은 대개 기본값이 아니거나, 영어가 아니거나, UTF-8이 아닌 로케일입니다. 필요한 로케일을 사용할 수 없으면 테스트를 건너뛰거나 드라이 런 모드로 실행합니다. 개발자 머신이나 빌드봇에 설정하면 유용할 수 있는 추가 로케일은 다음과 같습니다:
en_US(en_US.utf8,en_US.iso88591) — 표준 기본값de_DE(de_DE.UTF-8) 또는fr_FR(fr_FR.utf8,fr_FR.iso88591,fr_FR.iso885915@euro) — 일반적인 비영어권 로케일tr_TR(tr_TR.iso88599) — 터키어에는 “i”와 “I”의 대문자/소문자 변환 규칙이 서로 다릅니다.ps_AF—test_decimal에서 사용됩니다.
Linux와 macOS에서는 locale 명령을 사용하여 사용 가능한 로케일을 나열하고 설정을 변경할 수 있습니다. 환경 변수 LANG 및 LC_ 접두사가 붙은 환경 변수를 사용하여 로케일을 설정할 수 있습니다.
예기치 않은 건너뜀¶
테스트 스위트를 실행하다 보면 “예기치 않은 건너뜀”이 보고되는 경우가 있습니다. 이는 테스트 모듈 전체를 건너뛰었지만, 일반적으로 테스트 스위트에서는 해당 플랫폼에서 그 모듈의 테스트가 실행될 것으로 예상하는 경우를 나타냅니다.
흔한 원인은 빌드 의존성이 누락되어 선택적 모듈이 빌드되지 않은 것입니다. 이러한 경우 테스트를 건너뛸 때 보고된 누락 모듈은 컴파일 및 빌드에서 빌드에 실패했다고 보고된 모듈 중 하나와 일치해야 합니다.
그 밖의 경우에는 건너뜀 메시지가 문제의 원인을 파악하고 해결하는 데 도움이 될 만큼 충분한 세부 정보를 제공해야 합니다(예를 들어 일부 플랫폼의 기본 보안 설정에서는 특정 테스트를 허용하지 않습니다).
작성¶
Python용 테스트를 작성하는 것은 자신의 코드용 테스트를 작성하는 것과 매우 비슷합니다. 테스트는 철저하고, 빠르고, 격리되어 있으며, 일관되게 반복 가능하고, 가능한 한 단순해야 합니다. 정상 동작과 오류 조건을 모두 검사하는 테스트를 마련하고자 합니다. 테스트는 Lib/test 디렉터리에 있으며, 테스트가 포함된 모든 파일에는 test_ 접두사가 붙습니다.
일반적인 테스트와 다른 점 하나는 test.support 모듈을 활용하는 것이 권장된다는 것입니다. 이 모듈에는 Python 테스트 스위트에 맞게 설계되었으며 플랫폼 차이, 리소스 소비 및 정리, 경고 관리와 같은 일반적인 문제를 완화하는 데 도움이 되는 다양한 도우미가 포함되어 있습니다. 이 모듈은 표준 라이브러리 외부에서 사용하기에는 적합하지 않습니다.
기존 테스트 파일에 테스트를 추가할 때는 해당 파일의 다른 테스트도 살펴보는 것이 좋습니다. 그러면 테스트를 견고하고 이식 가능하게 만들기 위해 어떤 예방 조치를 취해야 하는지 알 수 있습니다.
C API 테스트에 관해서는 Python의 C API 변경하기의 테스트 절을 참조하십시오.
벤치마크¶
벤치마킹은 변경 사항으로 인해 성능이 저하되지 않는지 검사하는 데 유용합니다.
Python 벤치마크 스위트에는 모든 Python 구현을 위한 벤치마크 모음이 있습니다. 벤치마크 실행에 관한 문서는 저장소의 README.txt에 있습니다.