9. Testing and Debugging

Python에서 테스팅과 디버깅 방법을 알아보자.

75. Use repr strings for debugging output.

  • 내장 Python 타입에 print를 호출하는 것은 해당 타입의 사람이 읽을 수 있는 문자열 버전을 출력하므로 타입 정보를 가린다.
  • 내장 Python 타입에 repr을 호출하는 것은 값의 출력 가능한 문자열 버전을 제공한다. 이 repr 문자열들은 내장 eval 함수에 전달되어 원래 값을 얻을 수 있다.
  • 포맷 문자열 내의 %s는 str 처럼 사람이 읽을 수 있는 문자열을 제공한다. %r은 repr 처럼 출력 가능한 문자열을 제공한다. F-문자열은 !r 접미사를 특정하지 않는 한 치환 텍스트 표현식에 대한 사람이 읽을 수 있는 문자열을 제공한다.
  • 클래스에 __repr__ 특별 메소드를 정의해 인스턴스의 출력 가능한 표현식을 커스터마이즈하고 더 상세한 디버깅 정보를 제공할 수 있다.

76. Verify related behaviors in testcase subclasses.

  • unittest 내장 모듈로부터 TestCase 클래스를 상속받고 테스트하기 위한 동작마다 메소드를 정의해 테스트를 만들 수 있다. TestCase 클래스 내의 테스트 메소드는 test로 시작해야 한다.
  • 내장 assert 명령문을 사용하는 대신 TestCase 클래스 내에 정의된 assertEqual 등의 여러 헬퍼 메소드를 사용해 테스트 내 기대 동작을 확정하라.
  • 중복 코드를 줄이기 위해선 subTest 헬퍼 메소드를 이용해 데이터 기반 테스트를 쓰는 것을 고려하라.

77. Isolate tests from each other with setup, teardown, setupmodule, and teardownmodule.

  • 중요한 것은 단위 테스트 (독립된 기능에 대해)와 통합 테스트 (서로 상호작용하는 모듈에 대해)를 모두 쓰는 것이다.
  • setUp과 tearDown 메소드를 써서 테스트들이 서로 분리되고 깔끔한 테스트 환경을 가짐을 보장하라.
  • 통합 테스트에 대해서는 setUpModule과 tearDownModule의 모듈 레벨 함수를 써서 전체 테스트 모듈의 생애 주기 동안 그 테스트 모듈이 포함하는 모든 테스트 케이스들을 위해 필요한 테스트 환경을 관리하라.

78. Use mocks to test code with complex dependencies.

  • unittest.mock 모듈은 Mock 클래스를 사용해 인터페이스 동작을 모의 실험해볼 수 있는 방법을 제공한다. 모의 클래스는 테스트되는 코드의 의존성을 세팅하기 힘들 때 유용하다.
  • 모의 클래스를 사용할 때에는 Mock.assert_called_once_with 류의 함수를 통해 테스트되는 코드의 동작과 코드에 의해 호출되는 의존성 함수들의 동작을 모두 검증하는 것이 중요하다.
  • 키워드 한정 인자들과 unittest.mock.patch 류의 함수들은 모의 클래스를 테스트되는 코드에 주입하는 데 쓰인다.

79. Encapsulate dependencies to facilitate mock and testing.

  • 단위 테스트는 모의 환경을 세팅하기 위한 많은 반복된 중복 코드를 필요로 하지만, 하나의 해결법은 의존성의 기능을 클래스로 캡슐화해 모의 환경을 조성하기 더 쉽도록 하는 것이다.
  • unittest.mock 내장 모듈의 Mock 클래스는 새 모의 환경을 반환해 클래스를 모의 실험하며 이는 그것이 접근하는 특성 각각에 대한 모의 메소드로 동작할 수 있다.
  • 엔드 투 엔드 테스트에 대해서는 코드를 더 많은 헬퍼 함수를 갖도록 리팩토링해서 그 헬퍼 함수들이 명시적인 이음매로 기능함으로써 테스트 내에서 모의 의존성을 주입하는 데 사용할 수 있도록 할 가치가 있다.

80. Consider interactive debugging with pdb.

  • breakpoint 내장 함수를 호출함으로써 프로그램의 관심 지역으로부터 직접 Python 상호 작용적 디버거를 개시시킬 수 있다.
  • Python 디버거 프롬프트는 완전한 Python 쉘로 동작 중인 프로그램의 상태를 조사하고 수정할 수 있도록 한다.
  • pdb 쉘 명령어는 프로그램 실행을 정확하게 제어할 수 있도록 해 주고 프로그램 상태 조사와 프로그램 실행 진행을 번갈아서 할 수 있도록 해 준다.
  • pdb 모듈은 예외가 발생한 이후 이를 디버깅하는 데에도 쓰일 수 있는데 독립적인 Python 프로그램들에서 예외가 발생한 경우에도 쓸 수 있고 (python -m pdb -c continue를 사용) 상호 작용적 Python 인터프리터에서 발생한 경우에도 쓸 수 있다 (import pdb; pdb.pm()를 사용)

81. Use tracemalloc to understand memory usage and leaks.

  • Python 프로그램이 어떻게 메모리를 사용하고 누수시키는지를 이해하기는 어렵다.
  • gc 모듈은 어떤 오브젝트가 존재하는지를 이해하는 데 도움을 주나 어떤 식으로 할당되는지를 알려주지는 않는다.
  • tracemalloc 내장 모듈은 메모리 사용의 근원을 이해하기 위한 강력한 도구를 제공한다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중