개발 도구
*********

이 장에서 설명하는 모듈은 소프트웨어를 작성하는 것을 돕습니다. 예를 들
어, "pydoc" 모듈은 모듈을 가져와서 모듈의 내용을 기반으로 설명서를 만
듭니다. "doctest" 와 "unittest" 모듈에는 예상 출력이 만들어지는지 코드
를 자동으로 실행하고 확인하는 단위 테스트를 작성하기 위한 프레임워크가
포함되어 있습니다. **2to3**는 파이썬 2.x 소스 코드를 유효한 파이썬 3.x
코드로 변환할 수 있습니다.

이 장에서 설명하는 모듈 목록은 다음과 같습니다:

* "typing" --- 형 힌트 지원

  * Specification for the Python Type System

  * 형 에일리어스

  * NewType

  * Annotating callable objects

  * 제네릭

  * Annotating tuples

  * The type of class objects

  * Annotating generators and coroutines

  * 사용자 정의 제네릭 형

  * "Any" 형

  * 명목적 대 구조적 서브 타이핑

  * 모듈 내용

    * 특수 타이핑 프리미티브

      * 특수형

        * "Any"

        * "AnyStr"

        * "LiteralString"

        * "Never"

        * "NoReturn"

        * "Self"

        * "TypeAlias"

      * 특수 형태

        * "Union"

        * "Optional"

        * "Concatenate"

        * "Literal"

        * "ClassVar"

        * "Final"

        * "Required"

        * "NotRequired"

        * "Annotated"

        * "TypeGuard"

        * "Unpack"

      * Building generic types and type aliases

        * "Generic"

        * "TypeVar"

          * "__name__"

          * "__covariant__"

          * "__contravariant__"

          * "__infer_variance__"

          * "__bound__"

          * "__constraints__"

        * "TypeVarTuple"

          * "__name__"

        * "ParamSpec"

          * "args"

          * "kwargs"

          * "__name__"

        * "ParamSpecArgs"

        * "ParamSpecKwargs"

        * "TypeAliasType"

          * "__name__"

          * "__module__"

          * "__type_params__"

          * "__value__"

      * 기타 특수 지시자

        * "NamedTuple"

        * "NewType"

          * "__module__"

          * "__name__"

          * "__supertype__"

        * "Protocol"

        * "runtime_checkable()"

        * "TypedDict"

          * "__total__"

          * "__required_keys__"

          * "__optional_keys__"

    * 프로토콜

      * "SupportsAbs"

      * "SupportsBytes"

      * "SupportsComplex"

      * "SupportsFloat"

      * "SupportsIndex"

      * "SupportsInt"

      * "SupportsRound"

    * ABCs for working with IO

      * "IO"

      * "TextIO"

      * "BinaryIO"

    * 함수와 데코레이터

      * "cast()"

      * "assert_type()"

      * "assert_never()"

      * "reveal_type()"

      * "dataclass_transform()"

      * "overload()"

      * "get_overloads()"

      * "clear_overloads()"

      * "final()"

      * "no_type_check()"

      * "no_type_check_decorator()"

      * "override()"

      * "type_check_only()"

    * 인트로스펙션 도우미

      * "get_type_hints()"

      * "get_origin()"

      * "get_args()"

      * "is_typeddict()"

      * "ForwardRef"

    * 상수

      * "TYPE_CHECKING"

    * Deprecated aliases

      * Aliases to built-in types

        * "Dict"

        * "List"

        * "Set"

        * "FrozenSet"

        * "Tuple"

        * "Type"

      * Aliases to types in "collections"

        * "DefaultDict"

        * "OrderedDict"

        * "ChainMap"

        * "Counter"

        * "Deque"

      * Aliases to other concrete types

        * "Pattern"

        * "Match"

        * "Text"

      * Aliases to container ABCs in "collections.abc"

        * "AbstractSet"

        * "ByteString"

        * "Collection"

        * "Container"

        * "ItemsView"

        * "KeysView"

        * "Mapping"

        * "MappingView"

        * "MutableMapping"

        * "MutableSequence"

        * "MutableSet"

        * "Sequence"

        * "ValuesView"

      * Aliases to asynchronous ABCs in "collections.abc"

        * "Coroutine"

        * "AsyncGenerator"

        * "AsyncIterable"

        * "AsyncIterator"

        * "Awaitable"

      * Aliases to other ABCs in "collections.abc"

        * "Iterable"

        * "Iterator"

        * "Callable"

        * "Generator"

        * "Hashable"

        * "Reversible"

        * "Sized"

      * Aliases to "contextlib" ABCs

        * "ContextManager"

        * "AsyncContextManager"

  * Deprecation Timeline of Major Features

* "pydoc" --- Documentation generator and online help system

* 파이썬 개발 모드

  * 파이썬 개발 모드의 효과

  * ResourceWarning 예

  * 잘못된 파일 기술자 에러 예

* "doctest" --- Test interactive Python examples

  * 간단한 사용법: 독스트링에 있는 예제 확인하기

  * 간단한 사용법: 텍스트 파일에 있는 예제 확인하기

  * 작동 방법

    * 어떤 독스트링을 검사합니까?

    * 독스트링 예제는 어떻게 인식됩니까?

    * 실행 컨텍스트란 무엇입니까?

    * 예외는 어떻게 됩니까?

    * 옵션 플래그

      * "DONT_ACCEPT_TRUE_FOR_1"

      * "DONT_ACCEPT_BLANKLINE"

      * "NORMALIZE_WHITESPACE"

      * "ELLIPSIS"

      * "IGNORE_EXCEPTION_DETAIL"

      * "SKIP"

      * "COMPARISON_FLAGS"

      * "REPORT_UDIFF"

      * "REPORT_CDIFF"

      * "REPORT_NDIFF"

      * "REPORT_ONLY_FIRST_FAILURE"

      * "FAIL_FAST"

      * "REPORTING_FLAGS"

      * "register_optionflag()"

    * 지시자

    * 경고

  * 기본 API

    * "testfile()"

    * "testmod()"

    * "run_docstring_examples()"

  * Unittest API

    * "DocFileSuite()"

    * "DocTestSuite()"

    * "failureException"

    * "set_unittest_reportflags()"

  * 고급 API

    * DocTest 객체

      * "DocTest"

        * "examples"

        * "globs"

        * "name"

        * "filename"

        * "lineno"

        * "docstring"

    * Example 객체

      * "Example"

        * "source"

        * "want"

        * "exc_msg"

        * "lineno"

        * "indent"

        * "options"

    * DocTestFinder 객체

      * "DocTestFinder"

        * "find()"

    * DocTestParser 객체

      * "DocTestParser"

        * "get_doctest()"

        * "get_examples()"

        * "parse()"

    * DocTestRunner 객체

      * "DocTestRunner"

        * "report_start()"

        * "report_success()"

        * "report_failure()"

        * "report_unexpected_exception()"

        * "run()"

        * "summarize()"

    * OutputChecker 객체

      * "OutputChecker"

        * "check_output()"

        * "output_difference()"

  * 디버깅

    * "script_from_examples()"

    * "testsource()"

    * "debug()"

    * "debug_src()"

    * "DebugRunner"

    * "DocTestFailure"

    * "test"

    * "example"

    * "got"

    * "UnexpectedException"

    * "test"

    * "example"

    * "exc_info"

  * 맺음말

* "unittest" --- Unit testing framework

  * 기본 예시

  * 명령행 인터페이스

    * 명령행 옵션

  * 테스트 탐색(Discovery)

  * 테스트 코드 구조 잡기

  * 이전의 테스트 코드를 다시 사용하기

  * 테스트 건너뛰기와 예상된 실패

    * "skip()"

    * "skipIf()"

    * "skipUnless()"

    * "expectedFailure()"

    * "SkipTest"

  * 부분 테스트(subtest)를 사용하여 테스트 반복 구별 짓기

  * 클래스와 함수

    * 테스트 케이스

      * "TestCase"

        * "setUp()"

        * "tearDown()"

        * "setUpClass()"

        * "tearDownClass()"

        * "run()"

        * "skipTest()"

        * "subTest()"

        * "debug()"

        * "assertEqual()"

        * "assertNotEqual()"

        * "assertTrue()"

        * "assertFalse()"

        * "assertIs()"

        * "assertIsNot()"

        * "assertIsNone()"

        * "assertIsNotNone()"

        * "assertIn()"

        * "assertNotIn()"

        * "assertIsInstance()"

        * "assertNotIsInstance()"

        * "assertRaises()"

        * "assertRaisesRegex()"

        * "assertWarns()"

        * "assertWarnsRegex()"

        * "assertLogs()"

          * "records"

          * "output"

        * "assertNoLogs()"

        * "assertAlmostEqual()"

        * "assertNotAlmostEqual()"

        * "assertGreater()"

        * "assertGreaterEqual()"

        * "assertLess()"

        * "assertLessEqual()"

        * "assertRegex()"

        * "assertNotRegex()"

        * "assertCountEqual()"

        * "addTypeEqualityFunc()"

        * "assertMultiLineEqual()"

        * "assertSequenceEqual()"

        * "assertListEqual()"

        * "assertTupleEqual()"

        * "assertSetEqual()"

        * "assertDictEqual()"

        * "fail()"

        * "failureException"

        * "longMessage"

        * "maxDiff"

        * "countTestCases()"

        * "defaultTestResult()"

        * "id()"

        * "shortDescription()"

        * "addCleanup()"

        * "enterContext()"

        * "doCleanups()"

        * "addClassCleanup()"

        * "enterClassContext()"

        * "doClassCleanups()"

      * "IsolatedAsyncioTestCase"

        * "asyncSetUp()"

        * "asyncTearDown()"

        * "addAsyncCleanup()"

        * "enterAsyncContext()"

        * "run()"

      * "FunctionTestCase"

    * 테스트 분류

      * "TestSuite"

        * "addTest()"

        * "addTests()"

        * "run()"

        * "debug()"

        * "countTestCases()"

        * "__iter__()"

    * 테스트를 로드하고 실행하기

      * "TestLoader"

        * "errors"

        * "loadTestsFromTestCase()"

        * "loadTestsFromModule()"

        * "loadTestsFromName()"

        * "loadTestsFromNames()"

        * "getTestCaseNames()"

        * "discover()"

        * "testMethodPrefix"

        * "sortTestMethodsUsing"

        * "suiteClass"

        * "testNamePatterns"

      * "TestResult"

        * "errors"

        * "failures"

        * "skipped"

        * "expectedFailures"

        * "unexpectedSuccesses"

        * "collectedDurations"

        * "shouldStop"

        * "testsRun"

        * "buffer"

        * "failfast"

        * "tb_locals"

        * "wasSuccessful()"

        * "stop()"

        * "startTest()"

        * "stopTest()"

        * "startTestRun()"

        * "stopTestRun()"

        * "addError()"

        * "addFailure()"

        * "addSuccess()"

        * "addSkip()"

        * "addExpectedFailure()"

        * "addUnexpectedSuccess()"

        * "addSubTest()"

        * "addDuration()"

      * "TextTestResult"

      * "defaultTestLoader"

      * "TextTestRunner"

        * "_makeResult()"

        * "run()"

      * "main()"

      * load_tests 프로토콜

  * 클래스와 모듈 픽스쳐

    * setUpClass 와 tearDownClass

    * setUpModule 과 tearDownModule

      * "addModuleCleanup()"

      * "enterModuleContext()"

      * "doModuleCleanups()"

  * 시그널 처리하기

    * "installHandler()"

    * "registerResult()"

    * "removeResult()"

    * "removeHandler()"

* "unittest.mock" --- mock object library

  * 간략 지침

  * Mock 클래스

    * "Mock"

      * "assert_called()"

      * "assert_called_once()"

      * "assert_called_with()"

      * "assert_called_once_with()"

      * "assert_any_call()"

      * "assert_has_calls()"

      * "assert_not_called()"

      * "reset_mock()"

      * "mock_add_spec()"

      * "attach_mock()"

      * "configure_mock()"

      * "__dir__()"

      * "_get_child_mock()"

      * "called"

      * "call_count"

      * "return_value"

      * "side_effect"

      * "call_args"

      * "call_args_list"

      * "method_calls"

      * "mock_calls"

      * "__class__"

    * "NonCallableMock"

    * "PropertyMock"

    * "AsyncMock"

      * "assert_awaited()"

      * "assert_awaited_once()"

      * "assert_awaited_with()"

      * "assert_awaited_once_with()"

      * "assert_any_await()"

      * "assert_has_awaits()"

      * "assert_not_awaited()"

      * "reset_mock()"

      * "await_count"

      * "await_args"

      * "await_args_list"

    * 호출

    * 어트리뷰트 삭제

    * 모의 객체 이름과 이름 어트리뷰트

    * 모의 객체를 어트리뷰트로 연결하기

  * 패처

    * patch

      * "patch()"

    * patch.object

      * "object()"

    * patch.dict

      * "dict()"

    * patch.multiple

      * "multiple()"

    * 패처 메서드: start와 stop

      * "stopall()"

    * 내장 패치

    * TEST_PREFIX

    * 패치 데코레이터 중첩하기

    * 패치할 곳

    * 디스크립터와 프락시 객체 패치하기

  * MagicMock과 매직 메서드 지원

    * 매직 메서드 모킹하기

    * 매직 모의 객체

      * "MagicMock"

      * "NonCallableMagicMock"

  * 도우미

    * sentinel

      * "sentinel"

    * DEFAULT

      * "DEFAULT"

    * call

      * "call()"

      * "call_list()"

    * create_autospec

      * "create_autospec()"

    * ANY

      * "ANY"

    * FILTER_DIR

      * "FILTER_DIR"

    * mock_open

      * "mock_open()"

    * 자동 사양

    * 실링 모의 객체 봉인하기

      * "seal()"

  * Order of precedence of "side_effect", "return_value" and *wraps*

* "unittest.mock" --- getting started

  * 모의 객체 사용하기

    * 메서드를 패치하는 모의 객체

    * 객체의 메서드 호출을 위한 모의 객체

    * 클래스 모킹하기

    * 모의 객체 이름 붙이기

    * 모든 호출 추적하기

    * 반환 값과 어트리뷰트 설정하기

    * 모의 객체로 예외 발생시키기

    * 부작용 함수와 이터러블

    * 비동기 이터레이터 모킹하기

    * 비동기 컨텍스트 관리자 모킹하기

    * 기존 객체에서 모의 객체 만들기

    * Using side_effect to return per file content

  * 패치 데코레이터

  * 추가 예

    * 연쇄 호출 모킹하기

    * 부분 모킹

    * 제너레이터 메서드 모킹하기

    * 모든 테스트 메서드에 같은 패치 적용하기

    * 연결되지 않은 메서드 모킹하기

    * 모의 객체로 여러 호출 확인하기

    * 가변 인자에 대처하기

    * 중첩 패치

    * MagicMock으로 딕셔너리 모킹하기

    * Mock 서브 클래스와 그 어트리뷰트

    * patch.dict로 임포트를 모킹하기

    * 호출 순서 추적과 덜 상세한 호출 어서션

    * 더 복잡한 인자 일치

* 2to3 --- Automated Python 2 to 3 code translation

  * 2to3 사용법

  * 변환자 목록

  * "lib2to3" --- 2to3's library

* "test" --- Regression tests package for Python

  * "test" 패키지를 위한 단위 테스트 작성하기

  * 명령 줄 인터페이스를 사용하여 테스트 실행하기

* "test.support" --- 파이썬 테스트 스위트용 유틸리티

  * "TestFailed"

  * "ResourceDenied"

  * "verbose"

  * "is_jython"

  * "is_android"

  * "unix_shell"

  * "LOOPBACK_TIMEOUT"

  * "INTERNET_TIMEOUT"

  * "SHORT_TIMEOUT"

  * "LONG_TIMEOUT"

  * "PGO"

  * "PIPE_MAX_SIZE"

  * "Py_DEBUG"

  * "SOCK_MAX_SIZE"

  * "TEST_SUPPORT_DIR"

  * "TEST_HOME_DIR"

  * "TEST_DATA_DIR"

  * "MAX_Py_ssize_t"

  * "max_memuse"

  * "real_max_memuse"

  * "MISSING_C_DOCSTRINGS"

  * "HAVE_DOCSTRINGS"

  * "TEST_HTTP_URL"

  * "ALWAYS_EQ"

  * "NEVER_EQ"

  * "LARGEST"

  * "SMALLEST"

  * "busy_retry()"

  * "sleeping_retry()"

  * "is_resource_enabled()"

  * "python_is_optimized()"

  * "with_pymalloc()"

  * "requires()"

  * "sortdict()"

  * "findfile()"

  * "get_pagesize()"

  * "setswitchinterval()"

  * "check_impl_detail()"

  * "set_memlimit()"

  * "record_original_stdout()"

  * "get_original_stdout()"

  * "args_from_interpreter_flags()"

  * "optim_args_from_interpreter_flags()"

  * "captured_stdin()"

  * "captured_stdout()"

  * "captured_stderr()"

  * "disable_faulthandler()"

  * "gc_collect()"

  * "disable_gc()"

  * "swap_attr()"

  * "swap_item()"

  * "flush_std_streams()"

  * "print_warning()"

  * "wait_process()"

  * "calcobjsize()"

  * "calcvobjsize()"

  * "checksizeof()"

  * "anticipate_failure()"

  * "system_must_validate_cert()"

  * "run_with_locale()"

  * "run_with_tz()"

  * "requires_freebsd_version()"

  * "requires_linux_version()"

  * "requires_mac_version()"

  * "requires_IEEE_754()"

  * "requires_zlib()"

  * "requires_gzip()"

  * "requires_bz2()"

  * "requires_lzma()"

  * "requires_resource()"

  * "requires_docstrings()"

  * "requires_limited_api()"

  * "cpython_only()"

  * "impl_detail()"

  * "no_tracing()"

  * "refcount_test()"

  * "bigmemtest()"

  * "bigaddrspacetest()"

  * "check_syntax_error()"

  * "open_urlresource()"

  * "reap_children()"

  * "get_attribute()"

  * "catch_unraisable_exception()"

  * "load_package_tests()"

  * "detect_api_mismatch()"

  * "patch()"

  * "run_in_subinterp()"

  * "check_free_after_iterating()"

  * "missing_compiler_executable()"

  * "check__all__()"

  * "skip_if_broken_multiprocessing_synchronize()"

  * "check_disallow_instantiation()"

  * "adjust_int_max_str_digits()"

  * "SuppressCrashReport"

  * "SaveSignals"

    * "save()"

    * "restore()"

  * "Matcher"

    * "matches()"

    * "match_value()"

* "test.support.socket_helper" --- 소켓 테스트용 유틸리티

  * "IPV6_ENABLED"

  * "find_unused_port()"

  * "bind_port()"

  * "bind_unix_socket()"

  * "skip_unless_bind_unix_socket()"

  * "transient_internet()"

* "test.support.script_helper" --- 파이썬 실행 테스트용 유틸리티

  * "interpreter_requires_environment()"

  * "run_python_until_end()"

  * "assert_python_ok()"

  * "assert_python_failure()"

  * "spawn_python()"

  * "kill_python()"

  * "make_script()"

  * "make_zip_script()"

  * "make_pkg()"

  * "make_zip_pkg()"

* "test.support.bytecode_helper" --- 올바른 바이트 코드 생성 테스트를
  위한 지원 도구

  * "BytecodeTestCase"

  * "get_disassembly_as_string()"

  * "assertInBytecode()"

  * "assertNotInBytecode()"

* "test.support.threading_helper" --- Utilities for threading tests

  * "join_thread()"

  * "reap_threads()"

  * "start_threads()"

  * "threading_cleanup()"

  * "threading_setup()"

  * "wait_threads_exit()"

  * "catch_threading_exception()"

* "test.support.os_helper" --- Utilities for os tests

  * "FS_NONASCII"

  * "SAVEDCWD"

  * "TESTFN"

  * "TESTFN_NONASCII"

  * "TESTFN_UNENCODABLE"

  * "TESTFN_UNDECODABLE"

  * "TESTFN_UNICODE"

  * "EnvironmentVarGuard"

  * "FakePath"

  * "set()"

  * "unset()"

  * "can_symlink()"

  * "can_xattr()"

  * "change_cwd()"

  * "create_empty_file()"

  * "fd_count()"

  * "fs_is_case_insensitive()"

  * "make_bad_fd()"

  * "rmdir()"

  * "rmtree()"

  * "skip_unless_symlink()"

  * "skip_unless_xattr()"

  * "temp_cwd()"

  * "temp_dir()"

  * "temp_umask()"

  * "unlink()"

* "test.support.import_helper" --- Utilities for import tests

  * "forget()"

  * "import_fresh_module()"

  * "import_module()"

  * "modules_setup()"

  * "modules_cleanup()"

  * "unload()"

  * "make_legacy_pyc()"

  * "CleanImport"

  * "DirsOnSysPath"

* "test.support.warnings_helper" --- Utilities for warnings tests

  * "ignore_warnings()"

  * "check_no_resource_warning()"

  * "check_syntax_warning()"

  * "check_warnings()"

  * "WarningsRecorder"
