4.3 테스트 #Writing Idiomatic Python 3.1

oen·2022년 10월 26일
0

1. 자동화된 테스트 툴 사용

대부분의 경우에는 표준 라이브러리의 unittest 모듈로 충분하다.
파이썬의 표준 라이브러리 대부분이 unittest로 테스트한다.
장점:

  • 자동으로 test discovery 제공
  • test cases, test suits(테스트 케이스를 묶어놓은 것) 만들 때 객체 지향 리소스
  • 커맨드라인 인터페이스 사용이 쉬움
  • 테스트의 일부분을 부분적으로 활성화/비활성화 시킬 수 있음

두 번째로 인기 있는 써드파티 테스트 툴로는 nose와 py.test가 있다. 둘 다 PyPI에서 설치 가능. unittest 기능 확장

프로젝트에서 필요한 기능에 따라 어떤 걸 쓸지 선택하면 된다.

2. 어플리케이션 코드와 테스트 코드를 구분하기

테스트 하려는 코드와 같은 파일에 작성해서 테스트를 실행시키거나
if __name__ == '__main__로 파일을 직접 실행시켜서 테스트 코드를 실행시키면 안된다.

같은 파일에 작성하면 안되는 이유:

  • 테스트 모듈은 커맨드라인에서 독립적으로 실행할 수 있어야 한다.
  • 테스트 코드는 쉽게 분리될 수 있어야 한다.
  • 테스트 코드를 변경할 일은 잘 없다
  • 테스트한 코드는 쉽게 리팩토링이 가능하다.
  • C로 작성된 코드는 반드시 테스트코드와 어플리케이션 코드가 구분되어야한다. 파이썬은 이 규칙을 따라가면 된다.

3.리팩토링을 돕기 위해 unit tests 사용

리팩토링으로 기능이 바뀌어선 안되고, 가독성 좋게 구조가 바뀌어야 하는데, 유닛 테스트 없이는 어떤 부분이 잘못 되었는지 알기 어렵다.
유닛 테스트를 사용하면 버그를 빨리 캐치해서 빨리 고칠 수 있다.
유닛 테스트는 코드의 작은 부분을 독립적으로 테스트한다.
유닛 테스트 대상은 보통 함수, 클래스, 전체 모듈이다. 그리고 코드의 동작만 테스트한다.
따라서 데이터베이스 쿼리나 네트워크커넥션 코드 같은 경우에는 모킹해서 컨트롤해야한다.
만약 코드가 실패해도 코드 자체에 문제가 있는지 테스태하는 게 목표이지 코드 자체와 관련없는 것들 때문에 실패하는지 알아내는게 목표가 아니다.

리팩토링을 해도 코드의 내부 구조만 변경하는 거기 때문에, 코드의 아웃풋 테스트는 계속 통과해야 한다. 만약 테스트가 실패했다면, 리팩토링이 잘못된 것.

그리고 유닛 테스트는 자동화되어야 한다.

4.assert 메소드

unittest.TestCase 클래스에는 assertTrue 말고도 많은 assert 메소드들이 포함되어 있다. 적절한 assert 메소드를 사용하자.

👎

class Test(unittest.TestCase):
	def test_adding_positive_ints(self):
    	self.assertTrue(my_addtion(2, 2) == 4)
    
    def test_increment(self):
    	self.assertTrue(increment(1) > 1)
    
    def test_divisors_of_prime_number(self):
    	self.assertTrue(get_divisors(11) is None)

👍

class Test(unittest.TestCase):
	def test_adding_positive_ints(self):
    	self.assertEqual(my_addtion(2, 2), 4)
    
    def test_increment(self):
    	self.assertGreaterThan(increment(1), 1)
    
    def test_divisors_of_prime_number(self):
    	self.assertIsNone(get_divisors(11))
profile
🐾

0개의 댓글