Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
파이썬테스트
Unit testing
순서와상관없이독립적으로실행가능한테스트
보통컴포넌트나모듈단위을대상으로테스트
Functional testing
결과 값이요구사항대로나왔는지확인
일종의시나리오테스트로요구사항을검증하는데사용
Integra...
Friskweb API
회원가입/ 로그인
JWT 인증토큰관련테스트
서비스
리스트받아오기, 디테일읽어오기
구매
인증리스트받아오기
각 인증진행테스트(FB, KFTC)
구매완료확인
마이페이지
나의인증현황받아오기
주문내역받아오...
기존의테스트코드
class AppTest(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.access_token = self.login()
...
기존테스트코드의한계
test_back.py에일괄적으로때려박고 있음
각 모듈별로정의된기능을따로테스트하기 힘듬
테스트시출력되는문구가 불친절해서assert_helper를또만듬
테스트모듈의재사용이힘듬
일부모듈에test fixt...
pytest
PyPy 팀이meta‑tracing JIT 컴파일러라는매우복잡한소프트웨어를테스
트하기 위해직접만들어온프레임워크(기존테스팅프레임워크들이제대로
만족을못했기 때문에)
기능이많고 개발이매우활성화되어있음
속도가 빠르...
간단히비교해보자‑ unittest
import unittest
class TruthTest(unittest.TestCase):
def testTrue(self):
assertEqual(True, 1)
def testFa...
간단히비교해보자‑ pytest
def testTrue(self):
assert True == 1
def testFalse(self):
assert False == 0
??!
pytest에대한소개
https://github.com/pytest‑dev
pytest
pytest tests/test_app.py
pytest backend/
pytest backend/b2c
pytest
test_, 또는_test가 붙은파이썬파일을알아서읽는다.
setup.py # your ...
pytest fixtures
# 모듈 내에서 사용하도록 설정
@pytest.fixture(scope="module")
# 세션에서 사용하도록 설정
@pytest.fixture(scope="session")
unittes...
pytest fixtures
import pytest
@pytest.fixture
def smtp():
import smtplib
return smtplib.SMTP("merlinux.eu")
def test_ehlo(...
pytest mark
@pytest.mark.skip(reason="test unnecessary")
def test_the_unknown():
...
각 테스트모듈에마킹(?) 할수있다.
이렇게 하면실패해도그냥스킵하고 ...
pytest monkeypatching
몽키패치란?
일반적인의미는런타임에서모듈, 변수를변경하는것을의미
테스트환경에서몽키패치는?
올바른동작을보장하기 위해오류가 발생하는외부데이터소스에대한데이
터호출을테스트해야할때사용(전역설...
Refactoring
쉬운유닛테스트를위해Factory pattern을적용해라
모듈단위로blueprint를등록해라.
configuration을import에쓰지마라
Application Factory Pattern
def create_app(config_filename):
app = Flask(__name__)
configure_app(app)
from yourapplication...
Configuration
from config import configure_app
app = Flask(__name__)
configure_app(app, 'develop')
class Config(object):
D...
Configuration
config = {
"default": "config.DevelopmentConfig",
"development": "config.DevelopmentConfig",
"production": "...
Exception / Error handling
모든메세지를error.py에하드코딩하는것이아니라
에러코드에대한메세지로인터페이스화
def bad_request(message):
response = jsonify({'sta...
Upcoming SlideShare
Loading in …5
×

Python Testing for Flask

306 views

Published on

Python Test Framework for Flask

Published in: Software
  • D0WNL0AD FULL ▶ ▶ ▶ ▶ http://1url.pw/yYpss ◀ ◀ ◀ ◀
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Python Testing for Flask

  1. 1. 파이썬테스트
  2. 2. Unit testing 순서와상관없이독립적으로실행가능한테스트 보통컴포넌트나모듈단위을대상으로테스트 Functional testing 결과 값이요구사항대로나왔는지확인 일종의시나리오테스트로요구사항을검증하는데사용 Integration testing 단위테스트를통과한기능이정상적으로동작하는지검증 통합모듈의기능, 모듈간의인터페이스검증 테스트시나리오를바탕으로한실행방법과 예상결과를정의후테스트
  3. 3. Friskweb API 회원가입/ 로그인 JWT 인증토큰관련테스트 서비스 리스트받아오기, 디테일읽어오기 구매 인증리스트받아오기 각 인증진행테스트(FB, KFTC) 구매완료확인 마이페이지 나의인증현황받아오기 주문내역받아오기, 보고서보기 회원탈퇴
  4. 4. 기존의테스트코드 class AppTest(unittest.TestCase): def setUp(self): self.app = app.test_client() self.access_token = self.login() def login(self): # 올바른 계정으로 로그인 시도 p = self.app.post('/signin', data={'id': 'ultratest' result = json.loads(p.data) self.assertEqual(result['e_msg'], ERROR.OK) return result['access_token'] def test_signin(self): # 잘못된 아이디로 로그인 시도 p = self.app.post('/signin', data={'id': 'thereisnoidli result = json.loads(p.data) self.assertEqual(result['e_msg'], ERROR.ID_NOT_EXISTS)
  5. 5. 기존테스트코드의한계 test_back.py에일괄적으로때려박고 있음 각 모듈별로정의된기능을따로테스트하기 힘듬 테스트시출력되는문구가 불친절해서assert_helper를또만듬 테스트모듈의재사용이힘듬 일부모듈에test fixture가 필요한경우, 클래스를또만들어서setup(), teardown()을지정 test/run.py를파이참으로실행해야가능
  6. 6. pytest PyPy 팀이meta‑tracing JIT 컴파일러라는매우복잡한소프트웨어를테스 트하기 위해직접만들어온프레임워크(기존테스팅프레임워크들이제대로 만족을못했기 때문에) 기능이많고 개발이매우활성화되어있음 속도가 빠르고 병렬처리가능 모듈화된test fixture assert rewriting 테스트케이스매개변수화 unittest, doctest도함께지원
  7. 7. 간단히비교해보자‑ unittest import unittest class TruthTest(unittest.TestCase): def testTrue(self): assertEqual(True, 1) def testFalse(self): assertEqual(False, 0) if __name__ == '__main__': unittest.main() unittest를import 해야한다 쓸데없이assertEqual 함수를권고한다
  8. 8. 간단히비교해보자‑ pytest def testTrue(self): assert True == 1 def testFalse(self): assert False == 0 ??!
  9. 9. pytest에대한소개 https://github.com/pytest‑dev
  10. 10. pytest pytest tests/test_app.py pytest backend/ pytest backend/b2c pytest test_, 또는_test가 붙은파이썬파일을알아서읽는다. setup.py # your setuptools Python package metadata mypkg/ __init__.py appmodule.py ... test/ test_app.py ...
  11. 11. pytest fixtures # 모듈 내에서 사용하도록 설정 @pytest.fixture(scope="module") # 세션에서 사용하도록 설정 @pytest.fixture(scope="session") unittest의Setup(), Teardown() function과 같은역할 테스트의전처리, 후처리작업을수행함 예를들면, DB Connection
  12. 12. pytest fixtures import pytest @pytest.fixture def smtp(): import smtplib return smtplib.SMTP("merlinux.eu") def test_ehlo(smtp): response, msg = smtp.ehlo() assert response == 250 assert 0 # for demo purposes fixture function을decorator를통해등록하고 사용가능.
  13. 13. pytest mark @pytest.mark.skip(reason="test unnecessary") def test_the_unknown(): ... 각 테스트모듈에마킹(?) 할수있다. 이렇게 하면실패해도그냥스킵하고 넘어간다! @pytest.mark.xfail(run=False) def test_function(): ... 당연히실패할테스트를작성하고 xfail() 이라고 마킹! http://doc.pytest.org/en/latest/skipping.html
  14. 14. pytest monkeypatching 몽키패치란? 일반적인의미는런타임에서모듈, 변수를변경하는것을의미 테스트환경에서몽키패치는? 올바른동작을보장하기 위해오류가 발생하는외부데이터소스에대한데이 터호출을테스트해야할때사용(전역설정, 네트워크액세스등) 주로파이썬과 같은동적프로그래밍언어에서사용
  15. 15. Refactoring
  16. 16. 쉬운유닛테스트를위해Factory pattern을적용해라 모듈단위로blueprint를등록해라. configuration을import에쓰지마라
  17. 17. Application Factory Pattern def create_app(config_filename): app = Flask(__name__) configure_app(app) from yourapplication.model import db db.init_app(app) from yourapplication.views.admin import admin from yourapplication.views.frontend import frontend app.register_blueprint(admin) app.register_blueprint(frontend) return app fixture에등록하여구조적으로테스트가능
  18. 18. Configuration from config import configure_app app = Flask(__name__) configure_app(app, 'develop') class Config(object): DEBUG = False TESTING = False DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config): DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config): DEBUG = True class TestingConfig(Config): TESTING = True
  19. 19. Configuration config = { "default": "config.DevelopmentConfig", "development": "config.DevelopmentConfig", "production": "config.ProductionConfig", "testing": "config.TestingConfig" } def configure_app(app, settings): app.config.from_object(config[settings]) 개발/ 프로덕션/ 테스트환경을마음대로설정가능
  20. 20. Exception / Error handling 모든메세지를error.py에하드코딩하는것이아니라 에러코드에대한메세지로인터페이스화 def bad_request(message): response = jsonify({'status': 'bad request', 'message' response.status_code = 400 return response def unauthorized(message): response = jsonify({'status': 'unauthorized', 'message' response.status_code = 401 return response def not_found(message): response = jsonify({'status': 'not found', 'message': messa response.status_code = 404 return response

×