수색…


Hello World 앱 테스트

소개

이 미니멀리스트 예제에서는 pytest 를 사용하여 Hello World 앱이 실제로 "Hello, World!"를 리턴하는지 테스트 할 것입니다. HTTP OK 상태 코드 200을 사용하여 URL / URL에서 GET 요청으로 조회하면

먼저 pytest 를 virtualenv에 설치합시다.

pip install pytest

참고로이 안녕하세요 세계 앱 :

# hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

테스트 정의

우리의 hello.py 와 함께, 우리는 py.test 의해 발견 될 test_hello.py 라는 테스트 모듈을 정의한다.

# test_hello.py
from hello import app

def test_hello():
    response = app.test_client().get('/')

    assert response.status_code == 200
    assert response.data == b'Hello, World!'

검토하기 위해 tree 명령으로 얻은 프로젝트 구조는 다음과 같습니다.

.
├── hello.py
└── test_hello.py

테스트 실행하기

이제이 테스트를 py.test 명령으로 실행할 수 있습니다.이 명령은 test_hello.py 와 그 내부의 테스트 함수를 자동으로 발견합니다.

$ py.test

1 개의 테스트가 통과되었다는 표시와 출력이 있어야합니다.

=== test session starts ===
collected 1 items 
test_hello.py .
=== 1 passed in 0.13 seconds ===

Flask에 구현 된 JSON API 테스트

이 예제에서는 pytest를 사용하여 Flask 앱테스트하는 방법을 알고 있다고 가정합니다.

다음은 정수 값 ab 예 : {"a": 1, "b": 2} )가있는 JSON 입력을 가져와 JSON 응답에 sum a + b 를 반환하는 API입니다 (예 : {"sum": 3} .

# hello_add.py
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/add', methods=['POST'])
def add():
    data = request.get_json()
    return jsonify({'sum': data['a'] + data['b']})

pytest 로이 API 테스트하기

우리는 pytest 테스트 할 수있다.

# test_hello_add.py
from hello_add import app
from flask import json

def test_add():        
    response = app.test_client().post(
        '/add',
        data=json.dumps({'a': 1, 'b': 2}),
        content_type='application/json',
    )

    data = json.loads(response.get_data(as_text=True))

    assert response.status_code == 200
    assert data['sum'] == 3

이제 py.test 명령으로 테스트를 실행하자.

Flask-Testing을 사용하여 테스트에서 세션 변수 액세스 및 조작

대부분의 웹 응용 프로그램은 세션 객체를 사용하여 중요한 정보를 저장합니다. 이 예제는 Flask-Testing을 사용하여 그러한 응용 프로그램을 테스트하는 방법을 보여줍니다. github 에서도 전체 작동 예제를 사용할 수 있습니다.

먼저 가상 테스트에 Flask-Testing을 설치하십시오.

pip install flask_testing

세션 객체를 사용하려면 비밀 키를 설정해야합니다.

app.secret_key = 'my-seCret_KEy'

애플리케이션 변수에 다음과 같은 세션 변수에 데이터를 저장해야한다고 가정 해 봅시다.

@app.route('/getSessionVar', methods=['GET', 'POST'])
def getSessionVariable():
  if 'GET' == request.method:
    session['sessionVar'] = 'hello'
  elif 'POST' == request.method:
    session['sessionVar'] = 'hi'
  else:
    session['sessionVar'] = 'error'

  return 'ok'

이 함수를 테스트하려면 flask_testing을 가져 와서 테스트 클래스가 flask_testing.TestCase를 상속받을 수있게합니다. 필요한 모든 라이브러리 가져 오기

import flask
import unittest
import flask_testing
from myapp.run import app
    
class TestMyApp(flask_testing.TestCase):

테스트를 시작하기 전에 create_app 함수를 구현하는 것이 매우 중요합니다. 그렇지 않으면 예외가 발생합니다.

  def create_app(self):
    return app

원하는대로 응용 프로그램을 테스트하려면 두 가지 가능성이 있습니다. 함수가 특정 값을 세션 변수로 설정한다는 것을 확실하게 보장 하려면 컨텍스트를 유지하고 flask.session에 액세스 하면됩니다

def testSession1(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.get('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hello')

한가지 더 유용한 트릭은 다음 테스트 함수에서와 같이 GET 메소드와 POST 메소드를 구별하는 것입니다

def testSession2(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.post('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hi')

이제 함수가 세션 변수를 설정하고이 값과 같은 특정 값에 대해 다른 반응을 보일 것이라고 생각해보십시오.

@app.route('/changeSessionVar')
def changeSessionVariable():
  if session['existingSessionVar'] != 'hello':
    raise Exception('unexpected session value of existingSessionVar!')

  session['existingSessionVar'] = 'hello world'
  return 'ok'

이 함수를 테스트하려면 세션 트랜잭션 을 사용하고 테스트 클라이언트의 컨텍스트에서 세션을 열어야합니다. 플라스크 0.8 이후이 기능을 사용할 수 있습니다.

def testSession3(self):
    with app.test_client() as lTestClient:
      #keep the session
      with lTestClient.session_transaction() as lSess:
        lSess['existingSessionVar'] = 'hello'

      #here the session is stored
      lResp = lTestClient.get('/changeSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['existingSessionVar'], 'hello world')

테스트를 실행하는 것은 unittest에서 평소와 같습니다.

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

그리고 명령 행에서

python tests/test_myapp.py

테스트를 실행하는 또 다른 좋은 방법은 unittest Discovery를 다음과 같이 사용하는 것입니다.

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow