SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Python UnitTest
무엇을 테스트 해야 하지? == 무엇을 만들어야 하는지 모름
Test passes 
테스트를 통과 할 수 있게 최소 
한의 프로그래밍 
Test fails Refactor 
실패하는 테스트를 작성 
코드 의존성 제거 및 품질 향상
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
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
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())
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
Python3.4 Assertions
assertEqual(a, b) 
a와 b가 같으면 테스트 성공 그렇지 않으면 실패
assertNotEqual(a, b) 
a와 b가 같지 않으면 테스트 성공
assertTrue(x), assertFalse(x) 
함수 의미와 동일하게 True이거나 False이면 성공
assertIs(a, b), assertIsNot(a, b) 
a와 b가 같은 오브젝트 이면 성공하거나 아니면 성공
assertIsNone(x), assertIsNotNone(x) 
x가 None 이면 성공이거나 None이 아니면 성공
assertIn(a, b), assertNotIn(a, b) 
a가 b에 속해 있으면 성공, a가 b에 속하지 성공
assertIsInstance(a, b), assertNotIsInstance(a, b) 
a = object 
b= class 
a가 b의 인스턴스이면 성공, 아니면 성공
다양한 Exception을 테스트 할 수 있다 
assertRaises(exc, fun, *args, **kwds) 
def order(): 
raise Exception 
def test_order(self): 
with self.assertRaises(Exception): 
order()
Exception 메세지에 정규식이 매치가 되면 성공 
assertRaisesRegex(exc, r, fun, *args, **kwds) 
def test_exception_message_regex(self): 
self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$", int, 'XYZ')
더 있지만 생략 
https://docs.python.org/3.4/library/unittest.html#unittest.TestCase.assertAlmostEqual
Django에는 assertion이 더 있음 
https://docs.djangoproject.com/en/dev/topics/testing/tools/#assertions
Mock 
실제 어플리케이션 객체를 특정한 방식으로 흉내 내는 객체
3을 리턴하는 모의 객체 만들어 보기 
from unittest.mock import MagicMock 
class A(object): 
def test(self): 
pass 
class AuthTest(TestCase): 
def setUp(self): 
pass 
3을 리턴하도록 목 객체 생성 
def test_mock(self): 
inst = A() 
inst.method = MagicMock(return_value=3) 
self.assertEqual(inst.method(1), 3) 
inst.method.assert_called_with(1) 
정말 3을 리턴하는지 
테스트 
mock 객체가 호출 되었는지 확인
Raising an exception when a mock is called 
def test_side_effect(self): 
mock = Mock(side_effect=KeyError('Foo')) 
self.assertRaises(KeyError, mock)
patch 
mock.patch를 사용하면 외부 라이브러리의 행위를 바꿀 수 있다.
Fake client 
from django.test import Client 
from unittest.mock import MagicMock, Mock, patch 
def get_fake_request(status_code, content): 
m = Mock() 
m.status_code = status_code 
m.content = content 
def fake_get(url, *args, **kwargs): 
return m 
return fake_get 
class MockTest(TestCase): 
@patch('django.test.Client.get', get_fake_request(200, 'Fake')) 
def test_request(self): 
res = Client.get('http://fake.com') 
self.assertEqual(res.status_code, 200)
Django UnitTest
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
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 을 호출하여 로그인을 하면 됨
Rainist, For Making Better Decision 
http://www.rainist.com 
최명규

Contenu connexe

Tendances

Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드 Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드 SangIn Choung
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기OnGameServer
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증dagri82
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
Rest api 테스트 수행가이드
Rest api 테스트 수행가이드Rest api 테스트 수행가이드
Rest api 테스트 수행가이드SangIn Choung
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDSuwon Chae
 
Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Jaehoon Oh
 
[C++ lab] 9. 디버깅 테크닉
[C++ lab] 9. 디버깅 테크닉[C++ lab] 9. 디버깅 테크닉
[C++ lab] 9. 디버깅 테크닉MinGeun Park
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
Backend Master | 3.2.1 Test - JUnit
Backend Master | 3.2.1 Test - JUnitBackend Master | 3.2.1 Test - JUnit
Backend Master | 3.2.1 Test - JUnitKyunghun Jeon
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven DevelopmentChangHyeon Bae
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니Lusain Kim
 
테스트자동화와 TDD
테스트자동화와 TDD테스트자동화와 TDD
테스트자동화와 TDDSunghyouk Bae
 
Visual studio 사용 설명서(고급)
Visual studio 사용 설명서(고급)Visual studio 사용 설명서(고급)
Visual studio 사용 설명서(고급)Lusain Kim
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기Wonchang Song
 
Tobi 스프링 2장 php version
Tobi 스프링 2장   php versionTobi 스프링 2장   php version
Tobi 스프링 2장 php versionukjinkwoun
 
Introduce Katalon tool
Introduce Katalon toolIntroduce Katalon tool
Introduce Katalon tool재연 김
 
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드SangIn Choung
 

Tendances (20)

Unit Test With J Unit
Unit Test With J UnitUnit Test With J Unit
Unit Test With J Unit
 
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드 Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
Postman과 Newman을 이용한 RestAPI 테스트 자동화 가이드
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
Rest api 테스트 수행가이드
Rest api 테스트 수행가이드Rest api 테스트 수행가이드
Rest api 테스트 수행가이드
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDD
 
Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화Robot framework 을 이용한 기능 테스트 자동화
Robot framework 을 이용한 기능 테스트 자동화
 
[C++ lab] 9. 디버깅 테크닉
[C++ lab] 9. 디버깅 테크닉[C++ lab] 9. 디버깅 테크닉
[C++ lab] 9. 디버깅 테크닉
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
Backend Master | 3.2.1 Test - JUnit
Backend Master | 3.2.1 Test - JUnitBackend Master | 3.2.1 Test - JUnit
Backend Master | 3.2.1 Test - JUnit
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
테스트자동화와 TDD
테스트자동화와 TDD테스트자동화와 TDD
테스트자동화와 TDD
 
Visual studio 사용 설명서(고급)
Visual studio 사용 설명서(고급)Visual studio 사용 설명서(고급)
Visual studio 사용 설명서(고급)
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
Tobi 스프링 2장 php version
Tobi 스프링 2장   php versionTobi 스프링 2장   php version
Tobi 스프링 2장 php version
 
Introduce Katalon tool
Introduce Katalon toolIntroduce Katalon tool
Introduce Katalon tool
 
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
katalon studio 툴을 이용한 GUI 테스트 자동화 가이드
 
C++과 TDD
C++과 TDDC++과 TDD
C++과 TDD
 

En vedette

파이썬 TDD 101
파이썬 TDD 101파이썬 TDD 101
파이썬 TDD 101정주 김
 
Automating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on CloudAutomating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on CloudJonghyun Park
 
도도와 파이썬: 좋은 선택과 나쁜 선택
도도와 파이썬: 좋은 선택과 나쁜 선택도도와 파이썬: 좋은 선택과 나쁜 선택
도도와 파이썬: 좋은 선택과 나쁜 선택Jc Kim
 
테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례SangIn Choung
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Kyoung Up Jung
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)Kyoungchan Lee
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Joonsung Lee
 
Designnavi Portfolio
Designnavi PortfolioDesignnavi Portfolio
Designnavi PortfolioJung Hee Kim
 
Comas 회사소개서
Comas 회사소개서Comas 회사소개서
Comas 회사소개서himcap
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)Heungsub Lee
 
Jamin's portfolio for camp mobile_compact.version
Jamin's portfolio for camp mobile_compact.versionJamin's portfolio for camp mobile_compact.version
Jamin's portfolio for camp mobile_compact.versionJamin Park
 
정혜인 포트폴리오
정혜인 포트폴리오정혜인 포트폴리오
정혜인 포트폴리오henni31
 

En vedette (16)

Ajax in Django
Ajax in DjangoAjax in Django
Ajax in Django
 
파이썬 TDD 101
파이썬 TDD 101파이썬 TDD 101
파이썬 TDD 101
 
Testing In Django
Testing In DjangoTesting In Django
Testing In Django
 
Automating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on CloudAutomating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on Cloud
 
도도와 파이썬: 좋은 선택과 나쁜 선택
도도와 파이썬: 좋은 선택과 나쁜 선택도도와 파이썬: 좋은 선택과 나쁜 선택
도도와 파이썬: 좋은 선택과 나쁜 선택
 
Tuning Solr & Pipeline for Logs
Tuning Solr & Pipeline for LogsTuning Solr & Pipeline for Logs
Tuning Solr & Pipeline for Logs
 
테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기Go로 새 프로젝트 시작하기
Go로 새 프로젝트 시작하기
 
Designnavi Portfolio
Designnavi PortfolioDesignnavi Portfolio
Designnavi Portfolio
 
Comas 회사소개서
Comas 회사소개서Comas 회사소개서
Comas 회사소개서
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
Jamin's portfolio for camp mobile_compact.version
Jamin's portfolio for camp mobile_compact.versionJamin's portfolio for camp mobile_compact.version
Jamin's portfolio for camp mobile_compact.version
 
정혜인 포트폴리오
정혜인 포트폴리오정혜인 포트폴리오
정혜인 포트폴리오
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 

Similaire à Python Unittest

자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Jaeman An
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개Jong Pil Won
 
파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310Yong Joon Moon
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowRyan Park
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018KyungHo Jung
 
xUnitTestPattern/chapter7
xUnitTestPattern/chapter7xUnitTestPattern/chapter7
xUnitTestPattern/chapter7종빈 오
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료수홍 이
 
데이터베이스패턴
데이터베이스패턴데이터베이스패턴
데이터베이스패턴Suan Lee
 
Linq to object using c#
Linq to object using c#Linq to object using c#
Linq to object using c#병걸 윤
 

Similaire à Python Unittest (20)

자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개
 
JUnit & AssertJ
JUnit & AssertJJUnit & AssertJ
JUnit & AssertJ
 
파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Scala
ScalaScala
Scala
 
Swt J Face 2/3
Swt J Face 2/3Swt J Face 2/3
Swt J Face 2/3
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018
 
xUnitTestPattern/chapter7
xUnitTestPattern/chapter7xUnitTestPattern/chapter7
xUnitTestPattern/chapter7
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
Tdd 4장
Tdd 4장Tdd 4장
Tdd 4장
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료
 
데이터베이스패턴
데이터베이스패턴데이터베이스패턴
데이터베이스패턴
 
Linq to object using c#
Linq to object using c#Linq to object using c#
Linq to object using c#
 

Python Unittest

  • 2. 무엇을 테스트 해야 하지? == 무엇을 만들어야 하는지 모름
  • 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
  • 9. assertEqual(a, b) a와 b가 같으면 테스트 성공 그렇지 않으면 실패
  • 10. assertNotEqual(a, b) a와 b가 같지 않으면 테스트 성공
  • 11. assertTrue(x), assertFalse(x) 함수 의미와 동일하게 True이거나 False이면 성공
  • 12. assertIs(a, b), assertIsNot(a, b) a와 b가 같은 오브젝트 이면 성공하거나 아니면 성공
  • 13. assertIsNone(x), assertIsNotNone(x) x가 None 이면 성공이거나 None이 아니면 성공
  • 14. assertIn(a, b), assertNotIn(a, b) a가 b에 속해 있으면 성공, a가 b에 속하지 성공
  • 15. assertIsInstance(a, b), assertNotIsInstance(a, b) a = object b= class a가 b의 인스턴스이면 성공, 아니면 성공
  • 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
  • 20. Mock 실제 어플리케이션 객체를 특정한 방식으로 흉내 내는 객체
  • 21. 3을 리턴하는 모의 객체 만들어 보기 from unittest.mock import MagicMock class A(object): def test(self): pass class AuthTest(TestCase): def setUp(self): pass 3을 리턴하도록 목 객체 생성 def test_mock(self): inst = A() inst.method = MagicMock(return_value=3) self.assertEqual(inst.method(1), 3) inst.method.assert_called_with(1) 정말 3을 리턴하는지 테스트 mock 객체가 호출 되었는지 확인
  • 22. Raising an exception when a mock is called def test_side_effect(self): mock = Mock(side_effect=KeyError('Foo')) self.assertRaises(KeyError, mock)
  • 23. patch mock.patch를 사용하면 외부 라이브러리의 행위를 바꿀 수 있다.
  • 24. Fake client from django.test import Client from unittest.mock import MagicMock, Mock, patch def get_fake_request(status_code, content): m = Mock() m.status_code = status_code m.content = content def fake_get(url, *args, **kwargs): return m return fake_get class MockTest(TestCase): @patch('django.test.Client.get', get_fake_request(200, 'Fake')) def test_request(self): res = Client.get('http://fake.com') self.assertEqual(res.status_code, 200)
  • 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 을 호출하여 로그인을 하면 됨
  • 28. Rainist, For Making Better Decision http://www.rainist.com 최명규