π§ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅?
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅.
π ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ?
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ: ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ.
- ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ: Π²ΡΡΠ²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π²ΠΈΠ΄Π½Ρ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
- ΠΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ: ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅.
π οΈ ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- Python: pytest, unittest, requests
- JavaScript: Mocha, Chai, Jest
- Java: JUnit, TestNG
π§ͺ ΠΡΠΈΠΌΠ΅Ρ 1: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ»ΠΎΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π½ΠΎΠ²ΠΈΡΠΎΠΊ)
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΌΠΎΠ΄ΡΠ»Ρ: database.py ΠΈ user_service.py. ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ user_service ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ .
# database.py
def get_user_by_id(user_id):
# ΠΠ΄Π΅ΡΡ ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°ΠΏΡΠΎΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
return {"id": user_id, "name": "John Doe"}
# user_service.py
from database import get_user_by_id
def get_user_info(user_id):
user = get_user_by_id(user_id)
return f"User: {user['name']}, ID: {user['id']}"
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_integration.py
from user_service import get_user_info
def test_get_user_info():
result = get_user_info(1)
assert result == "User: John Doe, ID: 1"
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ user_service ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· database ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
π§ͺ ΠΡΠΈΠΌΠ΅Ρ 2: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ API (ΠΌΠΈΠ΄Π»)
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°Ρ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΊ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ API Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅.
# weather_service.py
import requests
def get_weather(city):
response = requests.get(f"http://api.weather.com/{city}")
return response.json()
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΊΠ°:
# test_weather_service.py
from unittest.mock import patch
from weather_service import get_weather
@patch('weather_service.requests.get')
def test_get_weather(mock_get):
mock_get.return_value.json.return_value = {"temperature": 22}
result = get_weather("Cancun")
assert result["temperature"] == 22
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΌΠΎΠΊΠ°Π΅ΠΌ Π²Π½Π΅ΡΠ½ΠΈΠΉ Π·Π°ΠΏΡΠΎΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ API, Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π½Π°Ρ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΡΠ²Π΅Ρ.
π§ͺ ΠΡΠΈΠΌΠ΅Ρ 3: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ (ΡΠ΅Π½ΡΠΎΡ)
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°: order_service ΠΈ payment_service. ΠΡ Ρ ΠΎΡΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π·Π°ΠΊΠ°Π·Π°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠΏΠ»Π°ΡΡ.
# order_service.py
import requests
def create_order(order_data):
response = requests.post("http://payment_service/pay", json=order_data)
return response.status_code
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_order_service.py
import requests
from unittest.mock import patch
from order_service import create_order
@patch('order_service.requests.post')
def test_create_order(mock_post):
mock_post.return_value.status_code = 200
order_data = {"product_id": 1, "quantity": 2}
result = create_order(order_data)
assert result == 200
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π·Π°ΠΊΠ°Π·Π°, ΡΠ΅ΡΠ²ΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΊ payment_service ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ.
π§ͺ ΠΡΠΈΠΌΠ΅Ρ 4: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ (ΠΌΠΈΠ΄Π»)
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
# user_repository.py
import sqlite3
def save_user(user):
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute("INSERT INTO users (name) VALUES (?)", (user['name'],))
conn.commit()
conn.close()
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_user_repository.py
import sqlite3
from user_repository import save_user
def test_save_user():
user = {"name": "Alice"}
save_user(user)
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name=?", (user['name'],))
result = cursor.fetchone()
conn.close()
assert result is not None
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
π§ͺ ΠΡΠΈΠΌΠ΅Ρ 5: ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ»ΠΎΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΊΠ° (ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»)
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ.
# notification_service.py
from email_service import send_email
def notify_user(user, message):
send_email(user['email'], message)
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΊΠ°:
# test_notification_service.py
from unittest.mock import patch
from notification_service import notify_user
@patch('notification_service.send_email')
def test_notify_user(mock_send_email):
user = {"email": "test@example.com"}
message = "Hello!"
notify_user(user, message)
mock_send_email.assert_called_with(user['email'], message)
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ²ΠΈΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ email.
π§© ΠΠ°Π΄Π°ΡΠΈ Π΄Π»Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ
- ΠΠΎΠ²ΠΈΡΠΎΠΊ: ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°ΠΉΠ».
- ΠΠΈΠ΄Π»: ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ API.
- Π‘Π΅Π½ΡΠΎΡ: ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ.
- ΠΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»: ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
- ΠΠΊΡΠΏΠ΅ΡΡ: ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
ΠΠΎΠ½Π΅ΡΠ½ΠΎ! ΠΠΈΠΆΠ΅ β π§© ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π΄Π»Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΡΠΊΠ΅. ΠΡΡ ΠΎΡ ΡΡΠΎΠ²Π½Ρ Π½ΠΎΠ²ΠΈΡΠΊΠ° Π΄ΠΎ ΡΠΊΡΠΏΠ΅ΡΡΠ°. ΠΠΎΠ³Π½Π°Π»ΠΈ!
π§© ΠΠΎΠ²ΠΈΡΠΎΠΊ: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ β ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² ΡΠ°ΠΉΠ»
π§ Π€ΡΠ½ΠΊΡΠΈΡ:
# file_writer.py
def save_to_file(filename, data):
with open(filename, "w") as f:
f.write(data)
π¬ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_file_writer.py
import os
from file_writer import save_to_file
def test_save_to_file():
test_filename = "test_output.txt"
test_data = "Hello, integration!"
save_to_file(test_filename, test_data)
with open(test_filename, "r") as f:
content = f.read()
assert content == test_data
os.remove(test_filename) # Π£Π±ΠΈΡΠ°Π΅ΠΌ Π·Π° ΡΠΎΠ±ΠΎΠΉ
π§ ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- ΠΠΈΡΠ΅ΠΌ ΡΠ°ΠΉΠ», ΡΠΈΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ β ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ ΡΡΠ°Π±ΠΎΡΠ°Π»Π°.
- ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ ΡΠΈΡΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π±Ρ.
π§© ΠΠΈΠ΄Π»: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ β Π²ΡΠ·ΠΎΠ² Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ API
π§ Π€ΡΠ½ΠΊΡΠΈΡ:
# cat_facts.py
import requests
def get_cat_fact():
r = requests.get("https://catfact.ninja/fact")
return r.json()["fact"]
π¬ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ (c requests-mock):
# test_cat_facts.py
import requests
import requests_mock
from cat_facts import get_cat_fact
def test_get_cat_fact():
with requests_mock.Mocker() as m:
m.get("https://catfact.ninja/fact", json={"fact": "Cats are awesome."})
fact = get_cat_fact()
assert fact == "Cats are awesome."
π§ ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- requests_mock Π΄Π°ΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ β Π²Π½Π΅ΡΠ½ΠΈΠΉ API ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΠ°ΡΡΡ, Π° ΡΠ΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌΠΈ.
π§© Π‘Π΅Π½ΡΠΎΡ: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ β ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ
π§ Π‘Π΅ΡΠ²ΠΈΡ:
# order_service.py
import requests
def create_order(order_data):
response = requests.post("http://payment-service/pay", json=order_data)
if response.status_code != 200:
raise Exception("Payment failed")
return {"status": "created", "payment": response.json()}
π¬ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_order_service.py
from unittest.mock import patch
from order_service import create_order
@patch("order_service.requests.post")
def test_create_order_success(mock_post):
mock_post.return_value.status_code = 200
mock_post.return_value.json.return_value = {"payment_id": "abc123"}
data = {"item": "coffee", "price": 100}
result = create_order(data)
assert result["status"] == "created"
assert result["payment"]["payment_id"] == "abc123"
π§ ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- ΠΠΎΠΊΠ°Π΅ΠΌ Π²ΡΠ·ΠΎΠ² payment-service, Π½ΠΎ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΊΠ°Π·Π° ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅.
π§© ΠΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ β ΠΠ + ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅
π§ ΠΠΎΠ΄ΡΠ»ΠΈ:
# user_repo.py
import sqlite3
def get_user_email(user_id):
conn = sqlite3.connect("test.db")
cur = conn.cursor()
cur.execute("SELECT email FROM users WHERE id = ?", (user_id,))
result = cur.fetchone()
conn.close()
return result[0] if result else None
# notifier.py
from user_repo import get_user_email
def send_notification(user_id, sender):
email = get_user_email(user_id)
if email:
sender.send(email, "Welcome!")
return True
return False
π¬ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_notifier.py
import sqlite3
from notifier import send_notification
from unittest.mock import Mock
def setup_test_db():
conn = sqlite3.connect("test.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER, email TEXT)")
cur.execute("DELETE FROM users")
cur.execute("INSERT INTO users VALUES (1, 'test@example.com')")
conn.commit()
conn.close()
def test_send_notification():
setup_test_db()
fake_sender = Mock()
result = send_notification(1, fake_sender)
fake_sender.send.assert_called_with("test@example.com", "Welcome!")
assert result is True
π§ ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- ΠΡΠΎ ΡΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½: ΠΠ + Π»ΠΎΠ³ΠΈΠΊΠ° + ΠΎΡΠΏΡΠ°Π²ΠΊΠ°.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠΊ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΈΡΠ΅ΠΌ, Π½ΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΠ (sqlite, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ).
π§© ΠΠΊΡΠΏΠ΅ΡΡ: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΈ
π Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ:
- ΠΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΎΡΠΌΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΠ»Π°ΡΡΠΆ
- Π‘ΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π² ΠΠ
- ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ email
π§ ΠΠΎΠ΄:
# subscription.py
from payment_service import charge_card
from user_repo import save_subscription
from mailer import send_email
def process_subscription(user, card_info):
if not charge_card(card_info):
raise Exception("Payment failed")
save_subscription(user["id"])
send_email(user["email"], "Subscription activated!")
return True
π¬ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ:
# test_subscription.py
from subscription import process_subscription
from unittest.mock import patch
@patch("subscription.send_email")
@patch("subscription.save_subscription")
@patch("subscription.charge_card")
def test_process_subscription(mock_charge, mock_save, mock_send):
mock_charge.return_value = True
user = {"id": 1, "email": "user@example.com"}
card = {"number": "4111 1111 1111 1111"}
result = process_subscription(user, card)
mock_charge.assert_called_once_with(card)
mock_save.assert_called_once_with(user["id"])
mock_send.assert_called_once_with(user["email"], "Subscription activated!")
assert result is True
π§ ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
- Π‘Π»ΠΎΠΆΠ½ΡΠΉ ΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²Π΅ΡΡ ΠΏΠΎΡΠΎΠΊ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠΈ
- ΠΡΠ΅ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ (ΠΏΠ»Π°ΡΡΠΆ, ΠΠ, ΠΏΠΈΡΡΠΌΠ°) β ΠΌΠΎΠΊΠ½ΡΡΡ
- Π’Π΅ΡΡ Π΄Π°ΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ: Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΡΡΠΎΠΊ ΠΎΡΠ²Π°Π»ΠΈΡΡΡ β ΡΠ²ΠΈΠ΄ΠΈΠΌ ΡΡΠ°Π·Ρ