test — Python용 회귀 테스트 패키지

test — Python용 회귀 테스트 패키지

참고: test 패키지는 Python 내부용으로만 쓰도록 되어 있어요. Python 코어 개발자들을 위해 문서화된 것이고, Python 표준 라이브러리 밖에서 이 패키지를 쓰는 것은 권장하지 않아요 — 여기 언급된 코드는 릴리스 사이에 예고 없이 바뀌거나 삭제될 수 있거든요.

test 패키지는 Python의 모든 회귀 테스트와 test.support, test.regrtest 모듈을 담고 있어요. test.support는 테스트를 향상시키는 데, test.regrtest는 테스트 스위트를 구동하는 데 쓰여요. test 패키지에서 이름이 test_로 시작하는 각 모듈은 특정 모듈이나 기능을 위한 테스트 스위트예요. 새 테스트는 모두 unittestdoctest 모듈로 작성해야 해요. 오래된 테스트 중에는 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,-largefileaudiolargefile 리소스를 제외한 모든 리소스로 실행해요. 모든 리소스 목록과 더 많은 옵션은 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.ResourceDeniedunittest.SkipTest의 서브클래스. 리소스(네트워크 연결 등)가 없을 때 발생. requires()가 발생시켜요.

상수

  • test.support.verbose — verbose 출력이 켜져 있으면 True. test.regrtest가 설정.
  • test.support.is_jython — 실행 인터프리터가 Jython이면 True.
  • test.support.is_androidsys.platformandroidTrue.
  • test.support.is_emscripten, is_wasisys.platformemscripten/wasiTrue.
  • test.support.is_apple_mobilesys.platformios, tvos, watchosTrue.
  • test.support.is_appleis_apple_mobileTrue이거나 sys.platformdarwin이면 True.
  • test.support.unix_shell — Windows가 아니면 셸 경로, 아니면 None.
  • test.support.LOOPBACK_TIMEOUT127.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_DEBUGPy_DEBUG 매크로로 빌드(디버그 모드)면 True. 3.12 추가.
  • test.support.SOCK_MAX_SIZE — OS 소켓 버퍼보다 클 가능성이 큰 상수.
  • test.support.TEST_SUPPORT_DIRtest.support가 들어 있는 최상위 디렉터리.
  • test.support.TEST_HOME_DIR, TEST_DATA_DIR — 테스트 패키지 최상위/data 디렉터리.
  • test.support.MAX_Py_ssize_t — 큰 메모리 테스트용으로 sys.maxsize로 설정.
  • test.support.max_memuse, real_max_memuseset_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():
            break
    
    for _ 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.stderrflush() 호출(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_docstringsHAVE_DOCSTRINGS일 때만 실행. requires_limited_api — Limited C API가 가능할 때만.
  • @test.support.cpython_only — CPython에만 적용되는 테스트용 데코레이터.
  • @test.support.impl_detail(msg=None, **guards)check_impl_detail()을 guards에 호출. Falsemsg를 이유로 건너뜀.
  • @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/offsetNone이 아니면 예외의 값과 비교.
  • test.support.open_urlresource(url, *args, **kw) — url 열기. 실패하면 TestFailed.
  • test.support.reap_children() — 서브프로세스를 시작할 때마다 test_main 끝에서 사용. 좀비(자식)가 남아 리소스를 잡고 refleak 검사를 방해하지 않게.
  • test.support.get_attribute(obj, name) — 속성 가져오기. AttributeErrorunittest.SkipTest 발생.
  • test.support.catch_unraisable_exception()sys.unraisablehook()으로 unraisable 예외를 잡는 컨텍스트 매니저. 예외 값 저장은 참조 순환, 객체 저장은 부활(resurrect)을 만들 수 있으므로 컨텍스트 매니저 퇴장 시 정리.
    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)
    
    3.8 추가.
  • test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern) — 테스트 패키지용 unittest load_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_namenew_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/-IPYTHON* 변수 무시), timeout은 대기 초(기본 무제한). 서브프로세스 지원 없는 플랫폼에선 건너뜀.
  • test.support.isolation.runningInSubprocessrunInSubprocess()가 만든 격리 서브프로세스에서 실행 중이면 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는 공개로 취급하면 안 되는 이름.
    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)
    
    3.6 추가.
  • test.support.skip_if_broken_multiprocessing_synchronize()multiprocessing.synchronize 모듈이 없거나 세마포어 구현이 없거나 잠금 생성이 OSError면 테스트 건너뜀. 3.10 추가.
  • test.support.check_disallow_instantiation(test_case, tp, *args, **kwds) — 타입 tpargs/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_CORE soft limit을 0으로. 퇴장 시 이전 값 복원.
  • class test.support.SaveSignalssignal 핸들러가 등록한 시그널 핸들러를 저장/복원하는 클래스. save(self)는 시그널 번호→현재 핸들러 딕셔너리 저장, restore(self)는 저장된 핸들러로 설정.
  • class test.support.Matchermatches(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.familyAF_INET이고 sock.typeSOCK_STREAM일 때 소켓에 SO_REUSEADDR/SO_REUSEPORT가 설정되어 있으면 예외. SO_EXCLUSIVEADDRUSE가 가능하면(Windows) 설정해 테스트 동안 다른 사람이 바인딩 못 하게.
  • test.support.socket_helper.bind_unix_socket(sock, addr) — Unix 소켓 바인딩. PermissionErrorunittest.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를 새 환경으로. __isolatedFalse가 아니면 격리 모드(-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 서브프로세스 실행. kwsubprocess.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_suffixFalse.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 패키지 디렉터리 생성. compiledTrue면 소스 파일을 컴파일해 추가. 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 속성 설정(퇴장 시 삭제, 참조 순환 회피).
    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)
    
    3.8 추가.
  • 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하는 컨텍스트 매니저. quietFalse면 오류 시 예외, 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를 바꾸는 컨텍스트 매니저. nameNone이면 tempfile.mkdtemp() 사용. quietFalse면 오류 시 예외.
  • test.support.os_helper.temp_dir(path=None, quiet=False)path에 임시 디렉터리를 만들고 yield. pathNone이면 tempfile.mkdtemp(). quietFalse면 오류 시 예외.
  • 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를 강제할 모듈. deprecatedTrue면 폐기 메시지 억제.
    # 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'])
    
    3.1 추가.
  • test.support.import_helper.import_module(name, deprecated=False, *, required_on=()) — 모듈 임포트/반환. 못 하면 unittest.SkipTest. required_onsys.platform과 비교할 플랫폼 접두사. 3.1 추가.
  • test.support.import_helper.modules_setup()sys.modules 복사본 반환. modules_cleanup(oldmodules) — 내부 캐시 보존을 위해 oldmodulesencodings를 제외한 모듈 제거.
  • 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)와 대략 동등.
    @warning_helper.ignore_warnings(category=DeprecationWarning)
    def test_suppress_warning():
        # do something
    
    3.8 추가.
  • test.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!"))
    
    깊게 파고들 때:
    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) == 0
    
    3.2에서 필터/quiet 인자 추가.
  • class test.support.warnings_helper.WarningsRecorder — 단위 테스트용 경고 기록 클래스.

더 알아보기

  • unittest — PyUnit 회귀 테스트 작성.
  • doctest — 문서화 문자열에 내장된 테스트.
  • Kent Beck의 Test Driven Development — 코드보다 테스트를 먼저 쓰는 법.