Szukaj…


Testowanie naszej aplikacji Hello World

Wprowadzenie

W tym minimalistycznym przykładzie za pomocą pytest sprawdzimy, czy rzeczywiście nasza aplikacja Hello World zwraca „Hello, World!” z kodem stanu HTTP OK 200, po trafieniu żądaniem GET na adres URL /

Najpierw zainstalujmy pytest w naszym virtualenv

pip install pytest

I tylko dla odniesienia, nasza aplikacja witaj na świecie:

# hello.py
from flask import Flask

app = Flask(__name__)

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

Definiowanie testu

Obok naszego hello.py definiujemy moduł testowy o nazwie test_hello.py , który zostanie odkryty przez py.test

# 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!'

Dla porównania, w tym momencie nasza struktura projektu uzyskana za pomocą polecenia tree to:

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

Uruchamianie testu

Teraz możemy uruchomić ten test za pomocą polecenia py.test , które automatycznie wykryje nasze test_hello.py i test_hello.py w nim funkcję testową

$ py.test

Powinieneś zobaczyć jakieś dane wyjściowe i wskazanie, że 1 test przeszedł pomyślnie, np

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

Testowanie JSON API zaimplementowanego w Flask

W tym przykładzie założono, że wiesz, jak przetestować aplikację Flask za pomocą zapytania

Poniżej znajduje się interfejs API, który pobiera dane wejściowe JSON z wartościami całkowitymi a i b np. {"a": 1, "b": 2} , dodaje je i zwraca sumę a + b w odpowiedzi JSON np. {"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']})

Testowanie tego interfejsu API za pomocą pytest

Możemy to przetestować za pomocą 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

Teraz uruchom test za py.test polecenia py.test .

Uzyskiwanie dostępu do zmiennych sesji i manipulowanie nimi w testach za pomocą Testowania kolby

Większość aplikacji internetowych używa obiektu sesji do przechowywania niektórych ważnych informacji. Te przykłady pokazują, w jaki sposób można przetestować taką aplikację za pomocą Testowania kolb. Pełny przykład działania jest również dostępny na github .

Więc najpierw zainstaluj Flask-Testing na swoim virtualenv

pip install flask_testing

Aby móc korzystać z obiektu sesji, musisz ustawić tajny klucz

app.secret_key = 'my-seCret_KEy'

Wyobraźmy sobie, że masz w swojej aplikacji funkcję, która musi przechowywać pewne dane w zmiennych sesji takich jak ta

@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'

Aby przetestować tę funkcję, możesz zaimportować test_testowy i pozwolić klasie testowej na dziedziczenie test_testowy.TestCase. Zaimportuj również wszystkie niezbędne biblioteki

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

Bardzo ważne przed rozpoczęciem testowania jest wdrożenie funkcji create_app, w przeciwnym razie wystąpi wyjątek.

  def create_app(self):
    return app

Aby przetestować, czy aplikacja działa zgodnie z oczekiwaniami, masz kilka możliwości. Jeśli chcesz się tylko upewnić, że funkcja ustawia określone wartości zmiennej sesji, możesz po prostu zachować kontekst i uzyskać dostęp do 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')

Kolejną przydatną sztuczką jest rozróżnianie metod GET i POST , tak jak w następnej funkcji testowej

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')

Teraz wyobraź sobie, że twoja funkcja oczekuje, że zostanie ustawiona zmienna sesyjna i reaguje inaczej na określone wartości, takie jak ta

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

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

Aby przetestować tę funkcję, musisz użyć tak zwanej transakcji sesji i otworzyć sesję w kontekście klienta testowego. Ta funkcja jest dostępna od wersji Flask 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')

Przeprowadzanie testów jest jak zwykle w przypadku najbardziej nieprzystosowanych

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

I w wierszu poleceń

python tests/test_myapp.py

Innym dobrym sposobem na uruchomienie testów jest użycie takiego Unittest Discovery:

python -m unittest discover -s tests


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow