π ΠΠ°ΠΊ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Flask, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ unittest Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ². ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ:
import unittest
from your_app import app
class FlaskAppTest(unittest.TestCase):
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ»Π°Π³ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask
app.testing = True
def setUp(self):
self.app = app.test_client()
def test_home_page(self):
# ΠΡΠΏΡΠ°Π²ΡΡΠ΅ GET-Π·Π°ΠΏΡΠΎΡ Π½Π° Π³Π»Π°Π²Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
response = self.app.get('/')
# ΠΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ°Π²Π΅Π½ 200 (ΡΡΠΏΠ΅ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ)
self.assertEqual(response.status_code, 200)
# ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ° Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ
self.assertEqual(response.data, b'ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!')
if __name__ == '__main__':
unittest.main()
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΊΠ»Π°ΡΡ ΡΠ΅ΡΡΠΎΠ² FlaskAppTest, Π³Π΄Π΅ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΡΠ»Π°Π³ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄ setUp(), ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΡΠ΅ΠΌ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ test_home_page(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ GET-Π·Π°ΠΏΡΠΎΡ Π½Π° Π³Π»Π°Π²Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΡΠ²Π΅ΡΠ°.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΡΠΎΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ», ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Flask. ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ Π½Π°ΡΠ°ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ:
pip install pytest Flask-Testing
`pytest` ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠΌ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ², Π° `Flask-Testing` ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
2. ΠΠ°ΠΏΡΡΠΊ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ
ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅. Π Flask Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ Π²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
from flask import Flask
def create_app():
app = Flask(__name__)
app.config['TESTING'] = True
return app
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ².
3. ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²
ΠΠ»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ² Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ pytest. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠ»ΡΡΠ°Π΅Π²:
- ΠΠΌΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ:
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΈΠΊΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
- ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ:
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
import pytest
@pytest.fixture
def app():
app = create_app()
return app
def test_home_page(client):
response = client.get('/')
assert response.status_code == 200
assert b"Welcome to the home page" in response.data
pytest
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
4. ΠΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ API
ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ API Π² Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π±Π΅Π· Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊ API. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ `responses` Π΄Π»Ρ ΠΌΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²:
import responses
@responses.activate
def test_api(client):
responses.add(responses.GET, 'http://api.example.com/users', json={'users': [{ 'name': 'John' }]}, status=200)
response = client.get('/users')
assert response.status_code == 200
assert response.json == {'users': [{ 'name': 'John' }]}
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅ΡΡ ΠΎΡ API ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΡΡΠΎ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΈ ΠΎΡΠ²Π΅ΡΡ.
5. ΠΠΎΠΊΡΡΡΠΈΠ΅ ΠΊΠΎΠ΄Π° ΡΠ΅ΡΡΠ°ΠΌΠΈ
ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΠΊΠΎΠ΄Π° ΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΠΎΠΊΡΡΡΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΡΡΡΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
ΠΠ»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΊΡΡΡΠΈΡ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ `coverage`. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΡΠΎΠ² Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠΊΡΡΡΠΈΡ ΠΊΠΎΠ΄Π°:
pytest --cov=your_app
ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΡΠ΅Ρ ΠΎ ΠΏΠΎΠΊΡΡΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΡΡΡΡ, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Flask. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠ΅ΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ pytest, ΠΈ ΠΏΠΎΠΊΡΡΠ»ΠΈ ΠΊΠΎΠ΄ ΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°.