Python은 Python 프로그래머의 삶을 더 쉽게 만들고 바퀴를 재발명하는 작업을 줄일 수 있는 광범위한 생태계를 발전시켰습니다. 그들이 개발한 도구가 최종 프로그램에 나타나지 않더라도 도구 개발자의 작업에는 동일한 개념이 적용됩니다. 이번 글에서는 Python 프로그래머가 꼭 알아야 할 개발자 도구를 소개하겠습니다.
개발자에게 가장 실질적인 도움은 코드 문서 작성을 돕는 것입니다. pydoc 모듈은 소스 코드의 독스트링을 기반으로 가져올 수 있는 모든 모듈에 대해 올바른 형식의 문서를 생성할 수 있습니다. Python에는 코드를 자동으로 테스트하고 코드의 정확성을 확인하는 두 가지 테스트 프레임워크가 포함되어 있습니다. 1) 소스 코드 또는 독립 실행형 파일 예제에서 테스트를 추출할 수 있는 doctest 모듈 사용 사례. 2) unittest 모듈인 이 모듈은 테스트 픽스처, 사전 정의된 테스트 스위트 및 테스트 검색 지원을 제공하는 모든 기능을 갖춘 자동화된 테스트 프레임워크입니다.
trace 모듈은 Python이 프로그램을 실행하는 방식을 모니터링하고 프로그램의 각 줄이 실행된 횟수를 표시하는 보고서를 생성할 수 있습니다. 이 정보는 자동화된 테스트 세트에서 다루지 않는 프로그램 실행 경로를 발견하는 데 사용될 수 있으며, 프로그램 호출 그래프를 연구하여 모듈 간의 종속성을 발견하는 데에도 사용될 수 있습니다. 테스트를 작성하고 실행하면 대부분의 프로그램에서 문제를 찾을 수 있습니다. Python은 대부분의 경우 처리되지 않은 오류를 콘솔에 인쇄할 수 있기 때문에 디버깅을 더 쉽게 만듭니다. 정보는 역추적입니다. 프로그램이 텍스트 콘솔에서 실행되지 않는 경우, 트레이스백은 로그 파일이나 메시지 대화 상자에 오류 정보를 출력할 수도 있습니다. 표준 트레이스백이 충분한 정보를 제공할 수 없는 경우 cgitb 모듈을 사용하여 지역 변수와 같은 모든 수준의 스택 및 소스 코드 컨텍스트에서 자세한 정보를 볼 수 있습니다. cgitb 모듈은 이러한 추적 정보를 HTML 형식으로 출력하여 웹 애플리케이션의 오류를 보고할 수도 있습니다.
문제가 있는 위치를 찾으면 대화형 디버거를 사용하여 디버그할 코드를 입력해야 합니다. pdb 모듈이 이 작업을 잘 수행할 수 있습니다. 이 모듈은 오류 발생 시 프로그램의 실행 경로를 표시할 수 있고, 디버깅을 위해 개체와 코드를 동적으로 조정할 수 있습니다. 프로그램을 테스트하고 디버깅한 후 다음 단계는 성능에 주의를 기울이는 것입니다. 개발자는 profile 및 timit 모듈을 사용하여 프로그램 속도를 테스트하고 프로그램에서 느린 것이 무엇인지 알아낼 수 있습니다. 그런 다음 문제를 수정하십시오. 코드의 이 부분은 조정을 위해 독립적으로 조정됩니다. Python 프로그램은 인터프리터를 통해 실행되며 인터프리터에 대한 입력은 원본 프로그램의 컴파일된 바이트코드 버전입니다. 이 바이트코드 컴파일 버전은 프로그램이 실행될 때 동적으로 생성되거나 프로그램이 패키지될 때 생성될 수 있습니다. compileall 모듈은 프로그램 패키징을 처리할 수 있으며, 설치 프로그램 및 패키징 도구에서 모듈 바이트코드가 포함된 파일을 생성하는 데 사용할 수 있는 패키징 관련 인터페이스를 노출합니다. 동시에 개발 환경에서는 compileall 모듈을 사용하여 소스 파일에 구문 오류가 있는지 확인할 수도 있습니다.
소스 코드 수준에서 pyclbr 모듈은 텍스트 편집기나 다른 프로그램이 함수나 클래스와 같은 Python 프로그램의 흥미로운 문자를 스캔할 수 있도록 클래스 뷰어를 제공합니다. 클래스 뷰어를 제공한 후에는 코드를 도입할 필요가 없으므로 잠재적인 부작용을 피할 수 있습니다.
함수, 클래스, 모듈의 첫 번째 줄이 문자열이면 그 문자열은 독스트링입니다. 독스트링을 포함하는 것은 좋은 프로그래밍 관행으로 간주될 수 있습니다. 왜냐하면 이러한 문자열은 Python 프로그램 개발 도구에 일부 정보를 제공할 수 있기 때문입니다. 예를 들어 help() 명령은 독스트링을 감지할 수 있으며, Python 관련 IDE도 독스트링을 감지할 수 있습니다. 프로그래머는 대화형 셸에서 독스트링을 보는 경향이 있으므로 이러한 문자열을 짧게 유지하는 것이 가장 좋습니다. 예를 들어
으르렁문서를 작성할 때 일반적인 문제는 문서와 실제 코드를 동기화 상태로 유지하는 방법입니다. 예를 들어, 프로그래머가 함수의 구현을 수정했지만 문서 업데이트를 잊어버릴 수 있습니다. 이 문제를 해결하기 위해 doctest 모듈을 사용할 수 있습니다. doctest 모듈은 독스트링을 수집하고 스캔한 후 테스트로 실행합니다. doctest 모듈을 사용하기 위해 우리는 일반적으로 테스트를 위한 새로운 독립 모듈을 만듭니다. 예를 들어 이전 예제 Test class가 mult.py 파일에 포함되어 있다면 다음과 같이 테스트용으로 새 testmult.py 파일을 생성해야 합니다. 팔로우 디스플레이:
# mult.py class Test: """ >>> a=Test(5) >>> a.multiply_by_2() 10 """ def __init__(self, number): self._number=number def multiply_by_2(self): return self._number*2
이 코드에서 doctest.testmod(module)은 특정 모듈의 테스트를 실행하고 실패한 테스트 수와 총 테스트 수를 반환합니다. 모든 테스트를 통과하면 출력이 생성되지 않습니다. 그렇지 않으면 예상 값과 실제 값의 차이를 보여주는 실패 보고서가 표시됩니다. 자세한 테스트 결과를 보려면 testmod(module, verbose=True)를 사용하세요.
별도의 테스트 파일을 생성하고 싶지 않은 경우 파일 끝에 해당 테스트 코드를 포함하는 방법도 있습니다.
# testmult.py import mult, doctest doctest.testmod(mult, verbose=True) # Trying: # a=Test(5) # Expecting nothing # ok # Trying: # a.multiply_by_2() # Expecting: # 10 # ok # 3 items had no tests: # mult # mult.Test.__init__ # mult.Test.multiply_by_2 # 1 items passed all tests: # 2 tests in mult.Test # 2 tests in 4 items. # 2 passed and 0 failed. # Test passed.
이러한 유형의 테스트를 수행하려면 -m 옵션을 사용하여 doctest 모듈을 호출할 수 있습니다. 일반적으로 테스트를 실행하면 출력이 없습니다. 자세한 정보를 보고 싶다면 -v 옵션을 추가하면 된다.
아아아아프로그램을 더 철저하게 테스트하고 싶다면 unittest 모듈을 사용할 수 있습니다. 단위 테스트를 통해 개발자는 프로그램을 구성하는 각 요소(예: 독립적인 함수, 메서드, 클래스 및 모듈)에 대해 일련의 독립적인 테스트 사례를 작성할 수 있습니다. 대규모 프로그램을 테스트할 때 이러한 테스트는 프로그램의 정확성을 확인하는 구성 요소 역할을 할 수 있습니다. 프로그램이 커짐에 따라 다양한 구성 요소에 대한 단위 테스트를 더 큰 테스트 프레임워크 및 테스트 도구로 결합할 수 있습니다. 이는 소프트웨어 테스트 작업을 크게 단순화하고 소프트웨어 문제를 찾아 해결하는 데 편리함을 제공할 수 있습니다.
아아아아단위 테스트를 사용할 때는 unittest.TestCase를 상속하는 클래스를 정의해야 합니다. 이 클래스에서 각 테스트는 메서드 형식으로 정의되고 test로 시작하는 이름이 지정됩니다. 예를 들어 'testsimplestring', 'testtypeconvert' 등이 있습니다. 메소드 이름 지정(메소드 이름이 test로 시작하는 한 어떻게 이름을 지정해도 괜찮다는 점을 강조할 필요가 있습니다). 각 테스트 내에서 어설션을 사용하여 다양한 조건을 확인할 수 있습니다.
실제 예:
프로그램에 메서드가 있고 이 메서드의 출력이 표준 출력(sys.stdout)을 가리킨다고 가정합니다. 이는 일반적으로 텍스트 정보를 화면에 출력하는 것을 의미합니다. 이를 증명하기 위해 코드를 테스트하려면 해당 입력을 제공하면 해당 출력이 표시됩니다.
아아아아내장된 인쇄 기능은 기본적으로 출력을 sys.stdout으로 보냅니다. 출력이 실제로 도착했는지 테스트하려면 독립 개체를 사용하여 출력을 시뮬레이션하고 프로그램의 예상 값에 대한 어설션을 만들 수 있습니다. unittest.mock 모듈의 patch() 메소드는 테스트 실행 컨텍스트에서만 객체를 교체할 수 있으며, 테스트가 완료된 직후 객체의 원래 상태를 반환합니다. . 다음은 urlprint() 메소드에 대한 테스트 코드입니다.
#urltest.py from io import StringIO from unittest import TestCase from unittest.mock import patch import url class TestURLPrint(TestCase): def test_url_gets_to_stdout(self): protocol = 'http' host = 'www' domain = 'example.com' expected_url = '{}://{}.{}\n'.format(protocol, host, domain) with patch('sys.stdout', new=StringIO()) as fake_out: url.urlprint(protocol, host, domain) self.assertEqual(fake_out.getvalue(), expected_url)
urlprint()函数有三个参数,测试代码首先给每个参数赋了一个假值。变量expected_url包含了期望的输出字符串。为了能够执行测试,我们使用了unittest.mock.patch()方法作为上下文管理器,把标准输出sys.stdout替换为了StringIO对象,这样发送的标准输出的内容就会被StringIO对象所接收。变量fake_out就是在这一过程中所创建出的模拟对象,该对象能够在with所处的代码块中所使用,来进行一系列的测试检查。当with语句完成时,patch方法能够将所有的东西都复原到测试执行之前的状态,就好像测试没有执行一样,而这无需任何额外的工作。但对于某些Python的C扩展来讲,这个例子却显得毫无意义,这是因为这些C扩展程序绕过了sys.stdout的设置,直接将输出发送到了标准输出上。这个例子仅适用于纯Python代码的程序(如果你想捕获到类似C扩展的输入输出,那么你可以通过打开一个临时文件然后将标准输出重定向到该文件的技巧来进行实现)。
위 내용은 Python 프로그래머가 꼭 알아야 할 개발자 도구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!