티스토리 뷰

[doctest]



고품질의 소프트웨어를 개발하는 한 가지 접근법은 개발되는 각 함수에 대한 테스트를 작성하고, 그것들을 개발 프로세스 중에 자주 실행하는 것입니다.

doctest 모듈은 모듈을 훑어보고 프로그램의 독스트링들에 내장된 테스트들을 검사하는 도구를 제공합니다. 

테스트 만들기는 평범한 호출을 그 결과와 함께 독스트링으로 복사해서 붙여넣기를 하는 수준으로 간단해집니다. 

사용자에게 예제를 함께 제공해서 설명서를 개선하고, doctest 모듈이 설명서에서 코드가 여전히 사실인지 확인하도록 합니다.

>>> print(average([21, 30, 70])) 의 결과값이 40.0 이 아니면 오류 메세지를 출력한다.

결과값 40.0 은 맨 마지막줄에 와야 한다.


>>> 뒤에 인풋에 대한 코드를 삽입할수 있다.


함수 밖에 글로벌 함수를 인자로 받을 수 있다.


a = 21

def average(values):
"""

:param values:
:return:
>>> global a
>>> print(average([a, 30, 70]))
40.0
"""
return sum(values) / len(values)


import doctest
doctest.testmod()


[py.test]



https://python-guide-kr.readthedocs.io/ko/latest/writing/tests.html



[unittest]



TDD (Test Driven Development)를 하기 위한 파이썬 표준 라이브러리이다.

unittest.TestCase를 상속받아 Custom Test Class를 정의한다.

test_로 시작하는 함수를 정의하면 unittest가 실행되면서 해당 함수를 테스트한다.

[TestCase.assert ]
1) assertEqual(A, B, Msg) - A, B가 같은지 테스트
2) assertNotEqual(A, B, Msg) - A, B가 다른지 테스트
3) assertTrue(A, Msg) - A가 True인지 테스트
4) assertFalse(A, Msg) - A가 False인지 테스트
5) assertIs(A, B, Msg) - A, B가 동일한 객체인지 테스트
6) assertIsNot(A, B, Msg) - A, B가 동일하지 않는 객체인지 테스트
7) assertIsNone(A, Msg) - A가 None인지 테스트
8) assertIsNotNone(A, Msg) - A가 Not None인지 테스트
9) assertRaises(ZeroDivisionError, myCalc.add, 4, 0) - 특정 에러 확인

import unittest


def is_prime(n):
return not bool([i for i in range(2, n) if not n % i])


def count_prime(n):
return len([i for i in range(2, n+1) if is_prime(i)])


class Test(unittest.TestCase):
def test_prime(self):
self.assertEqual(count_prime(10), 4)


if __name__ == '__main__':
unittest.main()


[Fixture]



Fixture란 테스트가 수행되기 이전에 준비과정 혹은 테스트가 종료된 이후에 클린업하는 과정을 말한다. 예를 들어, 테스트를 위한 임시 데이터 베이스나 폴더를 생성하고 테스트가 끝난후에 이들을 정리하는 등의 일이다.

  • setUp()

    • 각 테스트 메소드를 호출하기 이전에 호출되는 메소드이다. 테스트 케이스가 실행될 때 마다 사용된다.
  • tearDown()

    • 각 테스트가 끝난 이후에 호출되는 메소드이다. 테스트 과정에서 exception이 발생해도 실행된다. setUp 메소드가 성공했을 경우에만 호출된다.
  • setUpClass()

    • 해당 테스트 클래스가 시작되기 이전 단 한번 호출되는 메소드이다. setUp메소드는 각 테스트 메소드 이전에 항상 호출 된다. 메소드에 @classmethod라는 데코레이터를 달아줘야하고 메소드 인자로 cls를 넘겨줘야한다.
  • tearDownClass()

    • 해당 테스트 클래스가 종료된 이후 단 한번 호출되는 메소드이다. tearDown메소드는 각 테스트 메소드가 끝난 이후 항상 호출된다. 메소드에 @classmethod라는 데코레이터를 달아줘야하고 메소드 인자로 cls를 넘겨줘야한다.




import unittest


def remove_blank(text):
return text.replace(' ', '')


def remove_new_line(text):
return text.replace('\n', '')


def add_semicolon(text):
return text + ';'


class TestFixture(unittest.TestCase):

@staticmethod
def setUpClass():
print('setUpClass')

@staticmethod
def tearDownClass():
print('tearDownClass')

def setUp(self):
print('setUp')

def tearDown(self):
print('tearDown')

def test_remove_blank(self):
text = "Hi, I'm SJ Quant"
removed = remove_blank(text)
self.assertNotIn(' ', removed)

def test_remove_new_line(self):
text = "Hi, I'm SJ Quant\nNice to meet you."
removed = remove_new_line(text)
self.assertNotIn('\n', removed)

def test_add_semicolon(self):
text = "console.log('Hello, World')"
added = add_semicolon(text)
self.assertEqual(added, "console.log('Hello, World');")


if __name__ == '__main__':
unittest.main()








댓글