티스토리 뷰

Web programing/Flask

Flask - pytest

내일도이렇게 2019. 11. 23. 14:23

회사에서 개발할 때 테스트 코드를 작성을 안하고 있다가 테스트 코드의 중요성을 느껴서 

'깔끔한 파이썬 탄탄한 백엔드' 책에 나온 파이썬 테스트 도구인 'pytest' 를 활용한 것을 정리해봤습니다.

 


설치 - pip install pytest 

(터미널)실행 - pytest 

 

pytest 는 파일 이름의 앞부분에 test_ 라고 되어 있는 파일들만 테스트파일로 인식하고 실행한다 . 

함수도 앞부분에 test_ 라고 되어 있는 함수들만 unittest 함수로 인식하고 실행한다. 

 

def multiply_by_two(x):
    return x * 2


def test_multiply_by_two():   ####### 1 
    assert multiply_by_two(4)  == 8     ####### 2
    
    
    
   
1. multiply_by_two 함수를 테스트하는 unit test 함수.
2. multiply_by_two(4) 가 8를 리턴하는지 테스트한다. 

 

터미널에서 pytest 실행

 

def multiply_by_two(x):
    return x * 2


def test_multiply_by_two():
    assert multiply_by_two(4)  == 7  ### 1
    
    

1.  8를 리턴해야 정상이므로 이 부분을 실행하게 되면 AssertionError 가 발생 

 

 

터미널에서 pytest 실행 

https://jmkim.tistory.com/20?category=797093 만든 API 테스트 코드를 구현했습니다.

import app
import pytest
import json

@pytest.fixture   ## 1    
def api():
    test_api = app.app ## 2  
    api=test_api.test_client() ##3  

    return api

def test_tweet(api): ## 4 
    #테스트 사용자 생성
    new_user = {
	  "email" : "wjdals0304@gmail.com",
	  "name" : "최시후",
	  "password" : "test1234",
	  "profile" : "hi"
    }

    resp = api.post(
        '/sign-up',
        data=json.dumps(new_user),
        content_type='application/json'
    )

    assert resp.status_code == 200

    resp_json = json.loads(resp.data.decode('utf-8'))
    new_user_id = resp_json['id']

    ##tweet
    resp = api.post(
        '/tweet',
        data = json.dumps({"tweet": "hello world!","id": new_user_id}),
        content_type = 'application/json'
    )

    assert resp.status_code == 200

    ## tweet 확인
    resp = api.get(f'/timeline/{new_user_id}')
    tweets = json.loads(resp.data.decode('utf-8'))

    assert resp.status_code == 200
    assert tweets  == {
        'user_id' : 1,
        'timeline' : [
            {
                'user_id' : 1,
                'tweet' : 'hello world!'
            }
        ]
    }



1. 다른 test 함수에 지정되어 있으면 pytest가 알아서 같은 이름의 함수의 리턴 값을 해당 인자에 넣어 준다.


2. flask api 가 있는 app을 넣어준다.


3. test_client 함수를 호출해서 테스트용 클라이언트를 사용해서 URI 기반으로 원하는 엔드포인트들을

   호출할 수 있게 된다.  마치 실제로 HTTP 전송을 하는 듯한 효과를 볼 수 있는 것이다.

   ( 물론 실제로 네트워크를 통한 HTTP 전송을 하는것은 아니며 코드상에서 실행되는 것)


4. pytest가 자동으로 지정된 인자를 넣어 준다.

 

 

pytest


Reference

 

깔끔한 파이썬 탄탄한 백엔드

'Web programing > Flask' 카테고리의 다른 글

Flask 시작하기(2)  (0) 2019.05.04
Flask 시작하기(1)  (0) 2019.05.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함