test — Python용 회귀 테스트 패키지
test — Python용 회귀 테스트 패키지
참고: test 패키지는 Python 내부용으로만 쓰도록 되어 있어요. Python 코어 개발자들을 위해 문서화된 것이고, Python 표준 라이브러리 밖에서 이 패키지를 쓰는 것은 권장하지 않아요 — 여기 언급된 코드는 릴리스 사이에 예고 없이 바뀌거나 삭제될 수 있거든요.
test 패키지는 Python의 모든 회귀 테스트와 test.support, test.regrtest 모듈을 담고 있어요. test.support는 테스트를 향상시키는 데, test.regrtest는 테스트 스위트를 구동하는 데 쓰여요. test 패키지에서 이름이 test_로 시작하는 각 모듈은 특정 모듈이나 기능을 위한 테스트 스위트예요. 새 테스트는 모두 unittest나 doctest 모듈로 작성해야 해요. 오래된 테스트 중에는 sys.stdout으로 출력되는 결과를 비교하는 "전통적인" 스타일로 작성된 것도 있는데, 이 스타일은 더 이상 권장되지 않아요.
출처: Python 표준 라이브러리
본문
test 패키지용 단위 테스트 작성하기
unittest 모듈을 쓰는 테스트는 몇 가지 지침을 따르는 게 좋아요. 테스트 모듈 이름은 test_로 시작하고 테스트 대상 모듈 이름으로 끝내요. 테스트 메서드는 test_로 시작하고 무엇을 테스트하는지 설명으로 끝내야 해요(테스트 드라이버가 메서드로 인식하는 데 필요). 메서드에 docstring은 넣지 말고 주석(예: # Tests function returns only True or False)을 달아요 — docstring은 있으면 출력되기 때문이에요.
기본 보일러플레이트:
import unittest
from test import support
class MyTestCase1(unittest.TestCase):
# Only use setUp() and tearDown() if necessary
def setUp(self):
... code to execute in preparation for tests ...
def tearDown(self):
... code to execute to clean up after tests ...
def test_feature_one(self):
# Test feature one.
... testing code ...
def test_feature_two(self):
# Test feature two.
... testing code ...
... more test methods ...
class MyTestCase2(unittest.TestCase):
... same structure as MyTestCase1 ...
... more test classes ...
if __name__ == '__main__':
unittest.main()
이 패턴 덕분에 test.regrtest, 단독 스크립트(unittest CLI 지원), python -m unittest CLI 중 어느 것으로도 테스트 스위트를 돌릴 수 있어요.
회귀 테스트의 목표는 코드를 깨뜨려 보는 것이므로 몇 가지 지침이 필요해요:
- 테스트 스위트는 모든 클래스, 함수, 상수를 검사해야 해요(외부 공개 API뿐 아니라 "private" 코드까지).
- 화이트박스 테스트(테스트 작성 시 테스트 대상 코드를 검사)가 권장돼요. 블랙박스 테스트만으로는 모든 경계·모서리 케이스를 검사하기에 충분하지 않아요.
- 유효하지 않은 값 포함 모든 가능한 값을 테스트해요.
- 가능한 한 많은 코드 경로를 없애요. 분기가 일어나는 곳을 테스트하세요.
- 발견된 버그에 대해 명시적 테스트를 추가해요(미래에 오류 재발 방지).
- 테스트 후 정리를 확실히 해요(임시 파일 닫기/제거).
- 특정 OS 조건에 의존하는 테스트라면 테스트 전에 그 조건이 이미 있는지 확인해요.
- 가능한 한 적은 모듈을, 가능한 한 빨리 임포트해요.
- 코드 재사용을 극대화하세요. 입력 타입만 다른 테스트라면 기본 테스트 클래스를 서브클래싱해 코드 중복을 줄여요:
class TestFuncAcceptsSequencesMixin:
func = mySuperWhammyFunction
def test_func(self):
self.func(self.arg)
class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = [1, 2, 3]
class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = 'abc'
class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
arg = (1, 2, 3)
이 패턴에서 unittest.TestCase를 상속하는 모든 클래스는 테스트로 실행돼요. 위 예의 TestFuncAcceptsSequencesMixin은 데이터가 없어 단독 실행될 수 없으므로 unittest.TestCase를 상속하지 않아요.
명령줄 인터페이스로 테스트 실행하기
-m 옵션 덕분에 test 패키지를 스크립트로 실행해 회귀 테스트 스위트를 구동할 수 있어요: python -m test. 내부적으로 test.regrtest를 사용하고, 이전 Python에서 쓰던 python -m test.regrtest 호출도 여전히 동작해요. 스크립트를 단독 실행하면 test 패키지의 모든 회귀 테스트를 자동으로 시작해요 — 이름이 test_로 시작하는 모든 모듈을 찾아 임포트하고, test_main() 함수가 있으면 실행하거나, 없으면 unittest.TestLoader.loadTestsFromModule로 테스트를 로드해요. 실행할 테스트 이름을 인자로 넘길 수도 있어요. 단일 회귀 테스트를 지정하면(python -m test test_spam) 출력이 최소화되고 통과/실패만 출력돼요.
test를 직접 실행하면 테스트가 쓸 수 있는 리소스를 설정할 수 있어요. -u 명령줄 옵션으로 하는데, 값 all을 지정하면 모든 가능한 리소스를 켜요: python -m test -uall. 하나만 빼고 모두 원하면(더 흔해요), all 뒤에 원하지 않는 리소스들의 쉼표 구분 목록을 나열해요. python -m test -uall,-audio,-largefile은 audio와 largefile 리소스를 제외한 모든 리소스로 실행해요. 모든 리소스 목록과 더 많은 옵션은 python -m test -h. 다른 실행 방식: Unix에선 Python을 빌드한 최상위 디렉터리에서 make test, Windows에선 PCbuild 디렉터리에서 rt.bat. 3.14에서 기본으로 색상 출력, 환경 변수로 제어 가능.
test.support — Python 테스트 스위트용 유틸리티
test.support 모듈은 Python의 회귀 테스트 스위트를 지원해요. 공개 모듈이 아니고, 릴리스 사이에 역호환성 없이 API가 바뀔 수 있어요.
예외
exception test.support.TestFailed— 테스트가 실패할 때 발생시킬 예외.unittest기반 테스트와unittest.TestCase의 단언 메서드로 대체되어 폐기 예정.exception test.support.ResourceDenied—unittest.SkipTest의 서브클래스. 리소스(네트워크 연결 등)가 없을 때 발생.requires()가 발생시켜요.
상수
test.support.verbose— verbose 출력이 켜져 있으면True.test.regrtest가 설정.test.support.is_jython— 실행 인터프리터가 Jython이면True.test.support.is_android—sys.platform이android면True.test.support.is_emscripten,is_wasi—sys.platform이emscripten/wasi면True.test.support.is_apple_mobile—sys.platform이ios,tvos,watchos면True.test.support.is_apple—is_apple_mobile이True이거나sys.platform이darwin이면True.test.support.unix_shell— Windows가 아니면 셸 경로, 아니면None.test.support.LOOPBACK_TIMEOUT—127.0.0.1같은 루프백 인터페이스의 네트워크 서버를 쓰는 테스트용 타임아웃(초). 기본 10초.test.support.INTERNET_TIMEOUT— 인터넷으로 가는 네트워크 요청용 타임아웃. 기본 1분. 실패 표시보다는 테스트 건너뛰기에 쓰는 게 좋아요(transient_internet()참고).test.support.SHORT_TIMEOUT— 테스트가 "너무 오래" 걸리면 실패로 표시하는 타임아웃. 기본 30초.test.support.LONG_TIMEOUT— 테스트가 멈춤(hang)을 감지하는 타임아웃. 기본 5분.test.support.PGO— PGO에 유용하지 않은 테스트를 건너뛸 수 있을 때 설정.test.support.PIPE_MAX_SIZE— OS 파이프 버퍼보다 클 가능성이 큰 상수(쓰기를 블로킹하게).test.support.Py_DEBUG—Py_DEBUG매크로로 빌드(디버그 모드)면True. 3.12 추가.test.support.SOCK_MAX_SIZE— OS 소켓 버퍼보다 클 가능성이 큰 상수.test.support.TEST_SUPPORT_DIR—test.support가 들어 있는 최상위 디렉터리.test.support.TEST_HOME_DIR,TEST_DATA_DIR— 테스트 패키지 최상위/data디렉터리.test.support.MAX_Py_ssize_t— 큰 메모리 테스트용으로sys.maxsize로 설정.test.support.max_memuse,real_max_memuse—set_memlimit()이 설정하는 큰 메모리 테스트 메모리 한계(각각MAX_Py_ssize_t로 제한/제한 없음).test.support.MISSING_C_DOCSTRINGS— docstring 없이 빌드되면True.HAVE_DOCSTRINGS— 함수 docstring이 있으면True.test.support.TEST_HTTP_URL— 네트워크 테스트용 전용 HTTP 서버 URL.test.support.ALWAYS_EQ— 어떤 것과도 같은 객체.NEVER_EQ— 그 어떤 것과도 같지 않은 객체(ALWAYS_EQ와도).LARGEST— 그 자신 외엔 어떤 것보다 큰 객체.SMALLEST— 그 자신 외엔 어떤 것보다 작은 객체. 모두 혼합 타입 비교 테스트용.
함수
test.support.busy_retry(timeout, err_msg=None, /, *, error=True)—break가 루프를 멈출 때까지 루프 본문을 실행.timeout초 후error가 참이면AssertionError를, 거짓이면 루프만 멈춰요.for _ in support.busy_retry(support.SHORT_TIMEOUT): if check(): breakfor _ in support.busy_retry(support.SHORT_TIMEOUT, error=False): if check(): break else: raise RuntimeError('my custom error')test.support.sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)— 지수 백오프를 적용하는 대기 전략. 첫 반복 후 각 반복마다 대기하며 지연이 두 배로(최대max_delay초).test.support.is_resource_enabled(resource)— 리소스가 켜져 있고 가능하면True(리소스 목록은test.regrtest가 실행 중일 때만 설정).test.support.get_resource_value(resource)—-u resource=value로 지정된 리소스 값 반환. 비활성/미지정이면None.test.support.python_is_optimized()— Python이-O0/-Og로 빌드되지 않았으면True.test.support.with_pymalloc()—_testcapi.WITH_PYMALLOC반환.test.support.requires(resource, msg=None)— 리소스가 없으면ResourceDenied발생.__name__이'__main__'인 함수가 호출하면 항상True.test.support.sortdict(dict)— 키로 정렬된 dict의 repr 반환.test.support.findfile(filename, subdir=None)—filename파일 경로 반환. 없으면filename반환.subdir는 상대 경로.test.support.get_pagesize()— 페이지 크기(바이트). 3.12 추가.test.support.setswitchinterval(interval)—sys.setswitchinterval()설정. Android에선 시스템 멈춤 방지를 위한 최소 간격을 정의.test.support.check_impl_detail(**guards)— CPython 구현 특유 테스트를 가드. 호스트 플랫폼에 따라True/False.check_impl_detail() # Only on CPython (default). check_impl_detail(jython=True) # Only on Jython. check_impl_detail(cpython=False) # Everywhere except CPython.test.support.set_memlimit(limit)— 큰 메모리 테스트용max_memuse/real_max_memuse설정.test.support.record_original_stdout(stdout)— regrtest 시작 시 stdout 값을 저장.get_original_stdout()— 저장된 값 또는sys.stdout.test.support.args_from_interpreter_flags()— 현재sys.flags/sys.warnoptions를 재현하는 명령줄 인자 리스트.optim_args_from_interpreter_flags()—sys.flags의 최적화 설정 재현.test.support.captured_stdin(),captured_stdout(),captured_stderr()— 이름 붙은 스트림을 일시적으로io.StringIO객체로 바꾸는 컨텍스트 매니저.with captured_stdout() as stdout, captured_stderr() as stderr: print("hello") print("error", file=sys.stderr) assert stdout.getvalue() == "hello\n" assert stderr.getvalue() == "error\n"test.support.disable_faulthandler()—faulthandler를 잠시 비활성화하는 컨텍스트 매니저.test.support.gc_collect()— 가능한 한 많은 객체를 수집.disable_gc()— 진입 시 GC 비활성화(퇴장 시 이전 상태 복원).test.support.swap_attr(obj, attr, new_val)— 속성을 새 객체로 바꾸는 컨텍스트 매니저.with swap_attr(obj, "attr", 5): ...— 블록 동안obj.attr을 5로, 끝나면 복원.attr이 없으면 생성 후 블록 끝에서 삭제. "as" 절 대상엔 이전 값(None포함)이 할당.test.support.swap_item(obj, attr, new_val)— 항목을 바꾸는 버전(with swap_item(obj, "item", 5): ...,obj["item"]을 5로).test.support.flush_std_streams()—sys.stdout·sys.stderr의flush()호출(stderr 쓰기 전 로그 순서 일관성). 3.11 추가.test.support.print_warning(msg)—sys.__stderr__로 경고 출력. 형식f"Warning -- {msg}", 여러 줄이면 각 줄에 접두사. 3.9 추가.test.support.wait_process(pid, *, exitcode, timeout=None)—pid프로세스가 완료될 때까지 기다리고 종료 코드가exitcode인지 확인. 다르면AssertionError.timeout(기본SHORT_TIMEOUT) 초과 시 프로세스 죽이고AssertionError. Windows에선 타임아웃 기능 없음. 3.9 추가.test.support.calcobjsize(fmt)—fmt로 구조 멤버가 정의된PyObject크기(헤더+정렬 포함).calcvobjsize(fmt)—PyVarObject버전.test.support.checksizeof(test, o, size)—sys.getsizeof(o)+ GC 헤더 크기가size와 같음을 단언.@test.support.anticipate_failure(condition)— 조건부로@unittest.expectedFailure표시하는 데코레이터. 관련 tracker 이슈를 가리키는 주석 필요.test.support.system_must_validate_cert(f)— TLS 인증서 검증 실패 시 데코레이션된 테스트를 건너뜀.@test.support.run_with_locale(catstr, *locales)— 다른 로케일에서 실행 후 올바르게 재설정하는 데코레이터. 첫 번째 유효한 로케일 사용.@test.support.run_with_tz(tz)— 특정 시간대에서 실행 후 재설정.@test.support.requires_freebsd_version(*min_version),requires_linux_version(*min_version),requires_mac_version(*min_version)— 버전이 최소보다 낮으면 건너뛰는 데코레이터.@test.support.requires_gil_enabled— free-threaded 빌드에서 GIL이 비활성이면 건너뜀.@test.support.requires_IEEE_754— IEEE 754 아닌 플랫폼에서 건너뜀.@test.support.requires_zlib,requires_gzip,requires_bz2,requires_lzma— 해당 모듈이 없으면 건너뜀.@test.support.requires_resource(resource)— 리소스가 없으면 건너뜀.@test.support.requires_docstrings—HAVE_DOCSTRINGS일 때만 실행.requires_limited_api— Limited C API가 가능할 때만.@test.support.cpython_only— CPython에만 적용되는 테스트용 데코레이터.@test.support.impl_detail(msg=None, **guards)—check_impl_detail()을 guards에 호출.False면msg를 이유로 건너뜀.@test.support.thread_unsafe(reason=None)— 스레드 안전하지 않은 테스트 표시(--parallel-threads여도 한 스레드에서 실행).@test.support.no_tracing— 테스트 동안 추적을 잠시 끔.@test.support.refcount_test— 참조 카운팅 관련 테스트용. CPython이 아니면 실행 안 함.@test.support.bigmemtest(size, memuse, dry_run=True)— bigmem 테스트용 데코레이터.size는 요청 크기(임의 단위),memuse는 단위당 바이트 수. 예:@bigmemtest(size=_4G, memuse=2).@test.support.bigaddrspacetest— 주소 공간을 채우는 테스트용 데코레이터.test.support.linked_to_musl()—musl로 컴파일된 증거가 없으면False, 있으면 버전 3-튜플((0, 0, 0)또는 실제 버전) 반환.skip데코레이터용.emscripten/wasi는 musl로 간주.test.support.check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)—statement컴파일로 구문 오류 테스트.errtext는 발생한SyntaxError문자열 표현과 매칭될 정규식.lineno/offset이None이 아니면 예외의 값과 비교.test.support.open_urlresource(url, *args, **kw)— url 열기. 실패하면TestFailed.test.support.reap_children()— 서브프로세스를 시작할 때마다test_main끝에서 사용. 좀비(자식)가 남아 리소스를 잡고 refleak 검사를 방해하지 않게.test.support.get_attribute(obj, name)— 속성 가져오기.AttributeError면unittest.SkipTest발생.test.support.catch_unraisable_exception()—sys.unraisablehook()으로 unraisable 예외를 잡는 컨텍스트 매니저. 예외 값 저장은 참조 순환, 객체 저장은 부활(resurrect)을 만들 수 있으므로 컨텍스트 매니저 퇴장 시 정리.
3.8 추가.with support.catch_unraisable_exception() as cm: # code creating an "unraisable exception" ... # check the unraisable exception: use cm.unraisable ... # cm.unraisable attribute no longer exists at this point # (to break a reference cycle)test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)— 테스트 패키지용unittestload_tests프로토콜 일반 구현.import os from test.support import load_package_tests def load_tests(*args): return load_package_tests(os.path.dirname(__file__), *args)test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())—other_api에 없는ref_api의 속성/함수/메서드 집합 반환(ignore제외). 기본적으로_로 시작하는 private 속성은 건너뛰되 매직 메서드(__로 시작/끝)는 포함. 3.5 추가.test.support.patch(test_instance, object_to_patch, attr_name, new_value)—object_to_patch.attr_name을new_value로 덮고 테스트 인스턴스에 복원 정리 등록.test.support.run_in_subinterp(code)— 서브인터프리터에서 코드 실행.tracemalloc이 켜져 있으면unittest.SkipTest.@test.support.isolation.runInSubprocess(*, options=(), env=None, timeout=None)— 데코레이션된 테스트를 격리된 새 인터프리터 서브프로세스에서 실행(전역/인터프리터 상태 공유 안 함). 메서드나 전체TestCase서브클래스를 데코레이션할 수 있어요. 서브프로세스의 실패/오류/건너뜀은 해당 테스트로 보고되고, 실패한subtests는 개별 보고돼요. 메서드 데코레이션이면 그 메서드만 서브프로세스에서 실행되고 모든 픽스처(setUp()/tearDown()등)는 부모와 서브프로세스 모두에서 실행돼요. 클래스 데코레이션이면 전체 클래스가 단일 서브프로세스에서,setUpClass()실패는 클래스 전체로 보고돼요. 서브프로세스는 부모의 리소스(-u), 메모리 한계(-M), verbosity(-v)를 상속해요.options는 서브프로세스 인터프리터 옵션 시퀀스,env는 환경 변수 매핑(None값은 변수 해제;-E/-I는PYTHON*변수 무시),timeout은 대기 초(기본 무제한). 서브프로세스 지원 없는 플랫폼에선 건너뜀.test.support.isolation.runningInSubprocess—runInSubprocess()가 만든 격리 서브프로세스에서 실행 중이면True, 아니면False.test.support.check_free_after_iterating(test, iter, cls, args=())— 반복 후cls인스턴스가 해제되는지 단언.test.support.missing_compiler_executable(cmd_names=[])— 나열된(또는 비어 있으면 모든) 컴파일러 실행 파일 존재 확인. 첫 번째 없는 것 또는None.test.support.check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())—module의__all__변수에 모든 공개 이름이 포함되는지 단언. 공개 이름은 공개 이름 규약 매칭과 모듈 정의 여부로 자동 감지.name_of_module은 API가 정의될 수 있는 모듈(예:csv와_csv),extra는 자동 감지 안 되는 공개 이름,not_exported는 공개로 취급하면 안 되는 이름.
3.6 추가.import bar import foo import unittest from test import support class MiscTestCase(unittest.TestCase): def test__all__(self): support.check__all__(self, foo) class OtherTestCase(unittest.TestCase): def test__all__(self): extra = {'BAR_CONST', 'FOO_CONST'} not_exported = {'baz'} # Undocumented name. # bar imports part of its API from _bar. support.check__all__(self, bar, ('bar', '_bar'), extra=extra, not_exported=not_exported)test.support.skip_if_broken_multiprocessing_synchronize()—multiprocessing.synchronize모듈이 없거나 세마포어 구현이 없거나 잠금 생성이OSError면 테스트 건너뜀. 3.10 추가.test.support.check_disallow_instantiation(test_case, tp, *args, **kwds)— 타입tp가args/kwds로 인스턴스화될 수 없음을 단언. 3.10 추가.test.support.adjust_int_max_str_digits(max_digits)— 컨텍스트 동안sys.set_int_max_str_digits()설정을 바꿔 정수↔문자열 변환의 자릿수 제한을 다르게 허용하는 컨텍스트 매니저. 3.11 추가.
클래스
class test.support.SuppressCrashReport— 서브프로세스의 충돌이 예상되는 테스트에서 크래시 다이얼로그 팝업을 막는 컨텍스트 매니저. Windows에선SetErrorMode로 Windows Error Reporting 다이얼로그 비활성화, UNIX에선resource.setrlimit()으로resource.RLIMIT_COREsoft limit을 0으로. 퇴장 시 이전 값 복원.class test.support.SaveSignals—signal핸들러가 등록한 시그널 핸들러를 저장/복원하는 클래스.save(self)는 시그널 번호→현재 핸들러 딕셔너리 저장,restore(self)는 저장된 핸들러로 설정.class test.support.Matcher—matches(self, d, **kwargs)(단일 dict를 인자와 매칭),match_value(self, k, dv, v)(저장된 값dv를 주어진v와 매칭).
test.support.socket_helper — 소켓 테스트용 유틸리티
3.9 추가.
test.support.socket_helper.IPV6_ENABLED— 이 호스트에서 IPv6가 켜져 있으면True.test.support.socket_helper.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)— 바인딩에 적합한 미사용 포트 반환. 임시 소켓을0.0.0.0/포트 0에 바인딩해 OS에서 임시(ephemeral) 포트를 얻은 후 그 소켓을 닫고 포트를 반환해요. 서버 소켓을 특정 포트에 바인딩해야 하는 테스트에선bind_port()를 우선 권장(하드코딩된 포트는 동시 실행 불가능해 빌드봇에 문제).test.support.socket_helper.bind_port(sock, host=HOST)— 소켓을 빈 포트에 바인딩하고 포트 번호 반환. 임시 포트에 의존(동시 실행 안전).sock.family가AF_INET이고sock.type이SOCK_STREAM일 때 소켓에SO_REUSEADDR/SO_REUSEPORT가 설정되어 있으면 예외.SO_EXCLUSIVEADDRUSE가 가능하면(Windows) 설정해 테스트 동안 다른 사람이 바인딩 못 하게.test.support.socket_helper.bind_unix_socket(sock, addr)— Unix 소켓 바인딩.PermissionError면unittest.SkipTest.@test.support.socket_helper.skip_unless_bind_unix_socket— Unix 소켓용bind()가 동작해야 하는 테스트용 데코레이터.test.support.socket_helper.transient_internet(resource_name, *, timeout=30.0, errnos=())— 인터넷 연결의 다양한 문제가 예외로 나타나면ResourceDenied를 발생시키는 컨텍스트 매니저.
test.support.script_helper — Python 실행 테스트용 유틸리티
test.support.script_helper.interpreter_requires_environment()—sys.executable인터프리터가 실행되려면 환경 변수가 필요하면True.@unittest.skipIf()와 함께 격리 모드(-I)나 무환경 모드(-E) 서브인터프리터를 시작해야 하는 테스트에 사용.PYTHONHOME설정으로 대부분의 테스트스위트가 돌아갈 수 있어요.test.support.script_helper.run_python_until_end(*args, **env_vars)— 서브프로세스에서 인터프리터 실행용 환경 설정. 값은__isolated,__cleanenv,__cwd,TERM포함 가능. 3.9에서 stderr 공백 제거 중단.test.support.script_helper.assert_python_ok(*args, **env_vars)— 인터프리터 실행이 성공(rc == 0)함을 단언하고(return code, stdout, stderr)튜플 반환.__cleanenv설정 시env_vars를 새 환경으로.__isolated가False가 아니면 격리 모드(-I). 3.9 변경.test.support.script_helper.assert_python_failure(*args, **env_vars)— 실행이 실패(rc != 0)함을 단언하고 튜플 반환. 옵션은assert_python_ok()참고.test.support.script_helper.spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)— 주어진 인자로 Python 서브프로세스 실행.kw는subprocess.Popen()에 전달.subprocess.Popen객체 반환.test.support.script_helper.kill_python(p)—subprocess.Popen프로세스가 완료될 때까지 실행하고 stdout 반환.test.support.script_helper.make_script(script_dir, script_basename, source, omit_suffix=False)— 스크립트 생성.omit_suffix가False면.py추가. 전체 경로 반환.test.support.script_helper.make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)—script_name의 파일을 담는 zip 생성.(full path, full path of archive name)튜플 반환.test.support.script_helper.make_pkg(pkg_dir, init_source='')—__init__파일을 담은 디렉터리 생성.test.support.script_helper.make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)— zip 패키지 디렉터리 생성.compiled가True면 소스 파일을 컴파일해 추가. zip 경로와 아카이브 이름 튜플 반환.
test.support.bytecode_helper — 바이트코드 생성 테스트용 도구
3.9 추가.
class test.support.bytecode_helper.BytecodeTestCase(unittest.TestCase)— 바이트코드 검사용 커스텀 단언 메서드를 가진 클래스.get_disassembly_as_string(co)—co의 디스어셈블리를 문자열로 반환.assertInBytecode(x, opname, argval=_UNSPECIFIED)—opname이 있으면instr반환, 아니면AssertionError.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)—opname이 있으면AssertionError.
test.support.threading_helper — 스레딩 테스트용 유틸리티
3.10 추가.
test.support.threading_helper.join_thread(thread, timeout=None)— 스레드를 타임아웃 안에 조인. 지나도 살아 있으면AssertionError.@test.support.threading_helper.reap_threads— 테스트가 실패해도 스레드가 정리되게 하는 데코레이터.test.support.threading_helper.start_threads(threads, unlock=None)— 스레드 시퀀스를 시작하는 컨텍스트 매니저.unlock은 예외가 발생해도 스레드 시작 후 호출되는 함수(예:threading.Event.set()). 퇴장 시 시작된 스레드 조인 시도.test.support.threading_helper.threading_cleanup(*original_values)—original_values에 없는 스레드 정리. 테스트가 백그라운드 스레드를 남기면 경고.test.support.threading_helper.threading_setup()— 현재 스레드 수와 dangling 스레드 복사본 반환.test.support.threading_helper.wait_threads_exit(timeout=None)—with문 안에서 만들어진 모든 스레드가 종료될 때까지 기다리는 컨텍스트 매니저.test.support.threading_helper.catch_threading_exception()—threading.excepthook()으로threading.Thread예외를 잡는 컨텍스트 매니저. 잡으면exc_type,exc_value,exc_traceback,thread속성 설정(퇴장 시 삭제, 참조 순환 회피).
3.8 추가.with threading_helper.catch_threading_exception() as cm: # code spawning a thread which raises an exception ... # check the thread exception, use cm attributes: # exc_type, exc_value, exc_traceback, thread ... # exc_type, exc_value, exc_traceback, thread attributes of cm no longer # exists at this point # (to avoid reference cycles)test.support.threading_helper.run_concurrently(worker_func, nthreads, args=(), kwargs={})— 워커 함수를 여러 스레드에서 동시에 실행. 모든 스레드가 끝난 뒤 예외가 하나라도 있으면 다시 발생.
test.support.os_helper — os 테스트용 유틸리티
3.10 추가.
상수: FS_NONASCII(os.fsencode()로 인코딩 가능한 비 ASCII 문자), SAVEDCWD(os.getcwd()), TESTFN(임시 파일 이름으로 안전한 이름), TESTFN_NONASCII, TESTFN_UNENCODABLE(엄격 모드 파일시스템 인코딩으로 인코딩 불가 이름, None 가능), TESTFN_UNDECODABLE(bytes형, 디코딩 불가), TESTFN_UNICODE(비 ASCII 임시 파일 이름).
class test.support.os_helper.EnvironmentVarGuard— 환경 변수를 임시로 설정/해제하는 클래스. 컨텍스트 매니저로 쓰고os.environ을 질의/수정하는 완전한 딕셔너리 인터페이스 제공. 퇴장 시 변경 롤백. 3.1에서 딕셔너리 인터페이스 추가.set(envvar, value)— 환경 변수 임시 설정.unset(envvar, *others)— 하나 이상 임시 해제. 3.14에서 복수 해제.
class test.support.os_helper.FakePath(path)— 단순 path-like 객체.__fspath__()가 경로 인자를 반환.path가 예외면__fspath__()에서 발생.test.support.os_helper.can_symlink()— OS가 심볼릭 링크 지원 시True.can_xattr()— xattr 지원 시True.test.support.os_helper.change_cwd(path, quiet=False)— CWD를 임시로path로 바꾸고 그 디렉터리를 yield하는 컨텍스트 매니저.quiet이False면 오류 시 예외,True면 경고만.test.support.os_helper.create_empty_file(filename)— 빈 파일 생성(있으면 자르기).test.support.os_helper.fd_count()— 열린 파일 디스크립터 수.test.support.os_helper.fs_is_case_insensitive(directory)—directory의 파일시스템이 대소문자 구분 없으면True.test.support.os_helper.make_bad_fd()— 임시 파일을 열고 닫아 그 디스크립터를 반환(무효 fd).test.support.os_helper.rmdir(filename)—os.rmdir()호출. Windows에선 파일 존재를 확인하는 대기 루프로 감쌈(백신 프로그램이 파일을 잡고 삭제를 막을 수 있음).test.support.os_helper.rmtree(path)—shutil.rmtree()또는os.lstat()/os.rmdir()로 경로와 내용 제거. Windows에선 대기 루프.@test.support.os_helper.skip_unless_symlink,skip_unless_xattr— 심볼릭 링크/xattr 지원 필요한 테스트용 데코레이터.test.support.os_helper.temp_cwd(name='tempcwd', quiet=False)— 임시 디렉터리를 만들고 CWD를 바꾸는 컨텍스트 매니저.name이None이면tempfile.mkdtemp()사용.quiet이False면 오류 시 예외.test.support.os_helper.temp_dir(path=None, quiet=False)—path에 임시 디렉터리를 만들고 yield.path가None이면tempfile.mkdtemp().quiet이False면 오류 시 예외.test.support.os_helper.temp_umask(umask)— 프로세스 umask를 임시로 설정하는 컨텍스트 매니저.test.support.os_helper.unlink(filename)—os.unlink()호출. Windows에선 대기 루프.
test.support.import_helper — 임포트 테스트용 유틸리티
3.10 추가.
test.support.import_helper.forget(module_name)—sys.modules에서 모듈 제거하고 바이트 컴파일된 파일 삭제.test.support.import_helper.import_fresh_module(name, fresh=(), blocked=(), deprecated=False)— 임포트 전sys.modules에서 대상 모듈을 제거해 새 복사본을 임포트/반환.reload()와 달리 원래 모듈은 영향 없음.fresh는 추가로 제거할 모듈,blocked는 임포트 중 캐시에서None으로 대체해ImportError를 강제할 모듈.deprecated가True면 폐기 메시지 억제.
3.1 추가.# Get copies of the warnings module for testing without affecting the # version being used by the rest of the test suite. One copy uses the # C implementation, the other is forced to use the pure Python fallback # implementation py_warnings = import_fresh_module('warnings', blocked=['_warnings']) c_warnings = import_fresh_module('warnings', fresh=['_warnings'])test.support.import_helper.import_module(name, deprecated=False, *, required_on=())— 모듈 임포트/반환. 못 하면unittest.SkipTest.required_on은sys.platform과 비교할 플랫폼 접두사. 3.1 추가.test.support.import_helper.modules_setup()—sys.modules복사본 반환.modules_cleanup(oldmodules)— 내부 캐시 보존을 위해oldmodules와encodings를 제외한 모듈 제거.test.support.import_helper.unload(name)—sys.modules에서 삭제.test.support.import_helper.make_legacy_pyc(source)— PEP 3147/488 pyc 파일을 레거시 위치로 이동하고 그 경로 반환. PEP pyc 파일은 존재해야 함.class test.support.import_helper.CleanImport(*module_names)— 임포트가 새 모듈 참조를 반환하도록 강제하는 컨텍스트 매니저. 예:with CleanImport('foo'): importlib.import_module('foo').class test.support.import_helper.DirsOnSysPath(*paths)—sys.path에 디렉터리를 임시로 추가하는 컨텍스트 매니저.sys.path복사본에 인자 추가 후 컨텍스트 종료 시 복원. 블록 내 모든sys.path수정(객체 교체 포함)도 되돌아가요.
test.support.warnings_helper — 경고 테스트용 유틸리티
3.10 추가.
test.support.warnings_helper.ignore_warnings(*, category)—category(Warning또는 서브클래스) 인스턴스인 경고를 억제.warnings.catch_warnings()+warnings.simplefilter('ignore', category=category)와 대략 동등.
3.8 추가.@warning_helper.ignore_warnings(category=DeprecationWarning) def test_suppress_warning(): # do somethingtest.support.warnings_helper.check_no_resource_warning(testcase)—ResourceWarning이 발생하지 않았는지 확인하는 컨텍스트 매니저. 퇴장 전ResourceWarning을 발생시킬 수 있는 객체를 제거해야 함.test.support.warnings_helper.check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)—statement컴파일로 구문 경고 테스트.SyntaxWarning이 정확히 한 번 발생하고 오류로 전환 시SyntaxError가 되는지도 확인. 3.8 추가.test.support.warnings_helper.check_warnings(*filters, quiet=True)— 경고가 올바르게 발생했는지 테스트하기 쉬운warnings.catch_warnings()편의 래퍼.("message regexp", WarningCategory)2-튜플을 위치 인자로 받아요. 필터가 주어지거나quiet=False면 경고가 예상대로인지 확인: 각 필터는 최소 하나의 경고와 매칭되어야 하고 필터에 매칭되지 않는 경고가 있으면 실패. 인자가 없으면check_warnings(("", Warning), quiet=True). 진입 시WarningRecorder인스턴스 반환,warnings속성으로 목록 접근, 최근 경고 속성을 레코더로 직접 접근 가능,reset()으로 목록 초기화.
깊게 파고들 때:with check_warnings(("assertion is always true", SyntaxWarning), ("", UserWarning)): exec('assert(False, "Hey!")') warnings.warn(UserWarning("Hide me!"))
3.2에서 필터/quiet 인자 추가.with check_warnings(quiet=True) as w: warnings.warn("foo") assert str(w.args[0]) == "foo" warnings.warn("bar") assert str(w.args[0]) == "bar" assert str(w.warnings[0].args[0]) == "foo" assert str(w.warnings[1].args[0]) == "bar" w.reset() assert len(w.warnings) == 0class test.support.warnings_helper.WarningsRecorder— 단위 테스트용 경고 기록 클래스.
더 알아보기
unittest— PyUnit 회귀 테스트 작성.doctest— 문서화 문자열에 내장된 테스트.- Kent Beck의 Test Driven Development — 코드보다 테스트를 먼저 쓰는 법.