테스트 실행과 작성¶
참고
이 문서는 여러분이 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_ 접두사가 붙은 환경 변수를 사용하여 로케일을 설정할 수 있습니다.
예기치 않은 건너뜀¶
테스트 스위트를 실행하다 보면 “예기치 않은 건너뜀(unexpected skips)”이 보고되는 경우가 있습니다. 이는 테스트 모듈 전체를 건너뛰었지만, 테스트 스위트는 보통 해당 플랫폼에서 그 모듈의 테스트가 실행될 것으로 예상하는 경우를 나타냅니다.
흔한 원인은 빌드 의존성이 누락되어 선택적 모듈이 빌드되지 않은 것입니다. 이러한 경우 테스트를 건너뛸 때 보고되는 누락된 모듈은 컴파일과 빌드 과정에서 빌드에 실패했다고 보고된 모듈 중 하나와 일치해야 합니다.
그 밖의 경우에는 건너뜀 메시지에 문제의 원인을 파악하고 해결하는 데 도움이 될 만큼 충분한 세부 정보가 있어야 합니다(예를 들어 일부 플랫폼의 기본 보안 설정은 일부 테스트를 허용하지 않습니다).
작성하기¶
Python 테스트를 작성하는 것은 여러분 자신의 코드에 대한 테스트를 작성하는 것과 매우 비슷합니다. 테스트는 철저하고, 빠르고, 격리되어 있고, 일관되게 반복 가능하며, 가능한 한 단순해야 합니다. 정상 동작과 오류 조건 모두에 대한 테스트를 갖추도록 노력합니다. 테스트는 Lib/test 디렉터리에 있으며, 테스트를 포함하는 모든 파일에는 test_ 접두사가 붙습니다.
일반적인 테스트와 다른 점 하나는 test.support 모듈을 활용하도록 권장된다는 것입니다. 이 모듈에는 Python 테스트 스위트에 맞춰진 다양한 도우미가 들어 있으며, 이 도우미들은 플랫폼 차이, 자원 소비와 정리, 경고 관리 같은 흔한 문제를 해결하는 데 도움을 줍니다. 이 모듈은 표준 라이브러리 외부에서 사용하기에는 적합하지 않습니다.
기존 테스트 파일에 테스트를 추가할 때는 그 파일의 다른 테스트도 살펴보는 것이 좋습니다. 그러면 테스트를 견고하고 이식 가능하게 만들기 위해 어떤 예방 조치를 취해야 하는지 알 수 있습니다.
C API 테스트에 관해서는 Python의 C API 변경하기의 테스트 절을 참조하십시오.
벤치마크¶
벤치마킹은 변경 사항이 성능을 저하시키지 않는지 테스트하는 데 유용합니다.
Python 벤치마크 스위트에는 모든 Python 구현을 위한 벤치마크 모음이 있습니다. 벤치마크 실행에 관한 문서는 저장소의 README.txt에 있습니다.