3. Test passes
테스트를 통과 할 수 있게 최소
한의 프로그래밍
Test fails Refactor
실패하는 테스트를 작성
코드 의존성 제거 및 품질 향상
4. Basic Example
import random
import unittest
class PizzaTest(unittest.TestCase):
def setUp(self):
self.seq = list(range(10))
def test_shuffle(self):
unittest.TestCase를 상속받아야 함
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, list(range(10)))
#리스트를 변경해야하는데 튜플은 변경이 안되어 TypeError 발생
self.assertRaises(TypeError, random.shuffle, (1,2,3))
def test_choice(self):
element = random.choice(self.seq)
self.assertTrue(element in self.seq)
def test_sample(self):
with self.assertRaises(ValueError):
#첫번째 파라미터가 가진 리스트 갯수 보다 많은 수를 입력하여 ValueError가 발생함
random.sample(self.seq, 20)
for element in random.sample(self.seq, 5):
self.assertTrue(element in self.seq)
테스트 함수 실행 될때마다 먼저 실행되는 준비 함수
테스트 할 함수의 이름이
test로 시작해야 함
$ python3 -m unittest tests.py
5. Test Discovery
테스트를 찾는 패턴을 커스터마이징 할 수 있다.
python -m unittest discover -s project_directory -p '*_test.py'
-v, --verbose
Verbose output
-s, --start-directory directory
Directory to start discovery (. default)
-p, --pattern pattern
Pattern to match test files (test*.py default)
-t, --top-level-directory directory
6. Test Suite
내가 원하는 대로 테스트 구성 하기
def suite():
suite = unittest.TestSuite()
suite.addTest(PizzaTest('test_choice'))
# suite.addTest(PizzaTest('test_sample'))
return suite
if __name__ == '__main__':
unittest.TextTestRunner().run(suite())
7. Test Skip
@unittest.skip("demonstrating skipping")
def test_nothing(self):
self.fail("shouldn't happen")
@unittest.skipIf(mylib.__version__ < (1, 3),
"not supported in this library version")
def test_format(self):
# Tests that work for only a certain version of the library.
pass
@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
# windows specific testing code
pass
16. 다양한 Exception을 테스트 할 수 있다
assertRaises(exc, fun, *args, **kwds)
def order():
raise Exception
def test_order(self):
with self.assertRaises(Exception):
order()
17. Exception 메세지에 정규식이 매치가 되면 성공
assertRaisesRegex(exc, r, fun, *args, **kwds)
def test_exception_message_regex(self):
self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$", int, 'XYZ')
18. 더 있지만 생략
https://docs.python.org/3.4/library/unittest.html#unittest.TestCase.assertAlmostEqual
19. Django에는 assertion이 더 있음
https://docs.djangoproject.com/en/dev/topics/testing/tools/#assertions
26. Request test
def test_test_view(self):
c = Client()
res = c.get('/test_view/', {})
e = {'result': 1}
self.assertJSONEqual(res.content.decode('utf-8'), json.dumps(e))
post, head, put, patch, delete, trace
27. login_required view 라면?
@login_required
def auth_view(request):
return HttpResponse(status=200)
def test_login_required_view(self):
client = Client()
res = client.login(username='debug', password='debug')
res = client.get('/auth_view/')
self.assertEqual(res.status_code, 200)
Client.login 을 호출하여 로그인을 하면 됨