Python에서의 Testing/Debugging
Computer Science/python

Python에서의 Testing/Debugging

# Contents

  • Debugger
  • Python Debugger: pdb
  • Unit Test
  • Pdb Command의 종류    
    • Variable/Expression 검사
    • Breakpoints
    • Execution Control
    • Call Stack Control
    • Control Breakpoints

 

# Debugger

 - Debugger의 목적 : 프로그램을 실행했을 때나 문제가 발생하고 있을때 어떤일이 일어나고 있는지 확인이 가능함. 

 - 메인 기능 

  : 프로그램 실행을 관리하고, 프로그램을 멈췄을때 어떤 문제가 발생했는지 진단하며, 일정 조건하에서 프로그램이 멈추게 할 수 있다 -> 즉, 프로그램을 이해할 수 있도록 돕는 도구이다.

  

 - 필수불가결한 툴이고, 디버깅과 소스코드를 분석할 때 사용된다. 다른 사람이 짠 코드를 분석하며 이해할때도 사용가능.

 

# Python Debugger : pdb

 - pdb 는 python의 standard library의 일종이다. BSD-style 의 permissive license이며, copyleft 존재 X

 - Command Prompt/ GUI Debugger등의 다양한 형태로 존재한다.

 - debugger를 실행하는 여러 방법이 존재한다

  1) Explicit Trace Point : breakpoint 함수를 하드코딩해 넣어서 사용

  2) Debugging without modifying sources : "m-pdb" 옵션을 사용한다.

 

# 4 Phases for Debugging with Testing

 1) Test : wide range의 input을 통해 coverage를 넓힌다

 2) Stabilize : 특정한 오류를 재현한다

 3) Localize : 범위를 좁혀 오류의 근본 원인을 찾는다

 4) Correction : 오류를 고친다.

 

 

#Unit Testing

 -> 자신이 짠 코드를 모든 line에 대해서 testing하게 된다.

test를 위한 test_foo 함수를 만들어 디버깅

-> def foo() 코드 같은 경우에 만약 x가 실행되면 뒤의 많은 함수 (y(),v())등이 테스트가 안된다. 한번의 테스트에서 실행되는 범위를 Test Coverage라고 한다.

 

# pdb Commands

  1) help command = 'h'

  2) Explicit Trace point = '-m pdb'

    - Hard coding a breakpoint : break하고 싶은 위치에 breakpoint() 함수를 추가해넣는다.

pathutil코드의 4번째 줄에서 break 되었음을 알 수 있다.

 

 - Debugging without modfying source =실행 시에 'm -pdb' option 추가

  : python -m pdb filename[args]
   -
> code의 첫번째 실행 라인에서 멈춘다. (breakpoint() 함수 없이도 실행 가능)

 

  3) Special Variable in Python - '__name__','__file__'

    - __name__ : 실행되고 있는 현재 모듈의 이름을 갖고 변수이다.

   -  __file__: module의 전체 path를 갖고 있는 변수이다.

 

  4) Call Stack Control - 'w'/'bt','u'/'d'

 -> python은 python 프로그램을 실행시키는데 콜 스택이 사용된다.

 : 만약 function이 호출되면, 새로운 frame 이 call stack이 push된다.

- 'w','bt' : 해당 커맨드를 통해서 현재 stack frame을 출력하게 된다.

-'u' : current frame에서 더 오래된 frame으로 이동한다

-'d' : 더 새로운 frame으로 이동한다. 가장 최근 frame은 이동할게 X

 

+) 부연 설명

콜스택이란 현재 실행중인 서브루틴에 대한 정보들을 담아두는 스택구조의 메모리영역이다. 콜스택에는 크게 매개변수에 대한 정보, 반환 주소에 대한 정보, 지역변수에 대한 정보가 담긴다. 함수가 중첩 호출되는 과정을 통해서 콜스택에 매개변수, 지역변수, 반환 주소등이 push 된다. 매번 return 될 때마다 frame이 pop 된다.

 

5) Viewing Source - 'l','ll'

  - 'l(list) [first[,last]|.]'

  1) l 단독 사용 시 : 현재 실행중인 line의 근처 11줄 코드를 출력한다. l 계속 누르면 계속 다음거 출력

  2) l 100 : 100번째 줄에서부터 11줄 출력

  3) l . ->현재 위치 주변의 11 line 출력

  4) l 100,200 -> 범위 내의 line 100줄 출력

  5) 1 200,50 -> 만약 second argument가 첫번째 보다 작으면, 이는 count이다.

  - ll (longlist) : 현재 function의 모든 소스코드를 출력한다.

 

6) Examine the variables

 - 'p' (print) expression : 현재 line에서 expression을 실행하고 value를 출력한다.

- 'pp' expression : pretty-print 옵션을 사용해 좀더 예쁘게 출력이 가능하다.

- 'display' [expression] : 값이 변경될 때마다 자동출력하는 기능이다.

 -> display 단독 사용시 현재 display되고 있는 expression들을 모두 출력한다.

next command를 통해 다음 줄을 실행하면 변수값이 바뀐걸 tracking해준다.

- 'whatis' : argument의 type을 출력해준다.

사용 예제

 

 7) Breakpoints- 'b','cl','diable/enable'

 -> debugger가 breakpoint를 발견하면, 이는 멈추고 command를 출력해줄 것이다.

 - 'b' [([filename:] lineno | function)] : 함수명 or line 번호를 b 뒤에  추가하면 특정한 위치에 breakpoint 걸 수 있다.

 +) conditional breakpoint : 특정한 input 조건 하에서 function을 실행시킬 수 있다. 

b lineno/function 뒤에 특정한 condition을 추가할 수 있다. 

char이 h일때만 stop한다.

 

fn값이 D로 시작하므로 stop이 안걸리고 그대로 끝나는걸 확인할 수 있다.

- 'cl'(clear) bpnumber: 특정한 breakpoint를 제거한다. cl 단독 사용시 모든 breakpoint 제거.

- diable/enable bpnumber : breakpoint를 잠시 비활성화/활성화 할 수 있다.

 

8) Execution Control - 'c','n','s','r','unt'

 - c (continue) : 다음 중단점을 만날때까지 코드를 실행시킨다

 - n (next) : 현재 function의  다음 line을 실행하라

 - s (step) : 현재 line을 실행하다가 만약 외부 함수가 실행되면 멈춘다 

  ex) 만약 split()등의 함수를 사용하면 --call-- 뒤에 그 함수의 path를 출력한다.

- r (return) : 현재 function이 return할때까지 실행한다. --return--뒤에 결과값을 출력한다.

- unt (until) [lineno] : lineno에 다다르거나 숫자가 커질때까지 실행한다. 반복문에서 자주 사용된다.

 

+) 쉽게 정리된 사이트

http://pythonstudy.xyz/python/article/505-Python-%EB%94%94%EB%B2%84%EA%B9%85-PDB

 

예제로 배우는 파이썬 프로그래밍 - Python 디버깅 (PDB)

1. Python 디버깅 Python은 디버깅을 위해 pdb 라는 Python Debugger 모듈을 제공하고 있다. 이 디버거는 Step over/Step into, 중단점(breakpoint) 설정, 콜스택 검사, 소스 리스팅, 변수 치환 등 다양한 기능을 가지

pythonstudy.xyz

 

'Computer Science > python' 카테고리의 다른 글

파이썬으로 순열 경우의 수 구하기  (0) 2021.10.30
파이썬 문법 간단 정리  (0) 2021.10.24