← Назад к вопросам

На чем можешь проводить тестирование

2.0 Middle🔥 231 комментариев
#Python Core#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные инструменты тестирования в Python

В Python существует множество подходов и инструментов для тестирования, в зависимости от типа проекта и требований:

1. Unit-тестирование

pytest — самый популярный фреймворк для тестирования в Python. Он более гибкий и удобный, чем встроенный unittest:

import pytest

def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

@pytest.mark.parametrize("a,b,expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0),
])
def test_add_parametrized(a, b, expected):
    assert add(a, b) == expected

unittest — встроенная библиотека Python для написания тестов:

import unittest

class TestAdd(unittest.TestCase):
    def test_add_positive(self):
        self.assertEqual(add(2, 3), 5)
    
    def test_add_negative(self):
        self.assertEqual(add(-1, 1), 0)

2. Интеграционное тестирование

Для тестирования взаимодействия различных компонентов системы:

import pytest
from unittest.mock import Mock, patch

@patch("requests.get")
def test_fetch_user_data(mock_get):
    mock_get.return_value.json.return_value = {"id": 1, "name": "John"}
    result = fetch_user(1)
    assert result["name"] == "John"

3. Тестирование веб-приложений

Flask/Django тестирование с использованием встроенных test client:

from django.test import TestCase, Client

class UserTestCase(TestCase):
    def setUp(self):
        self.client = Client()
    
    def test_user_registration(self):
        response = self.client.post("/register/", {
            "username": "john",
            "password": "123456"
        })
        self.assertEqual(response.status_code, 201)

Playwright — для E2E тестирования веб-приложений:

from playwright.sync_api import sync_playwright

def test_login():
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto("https://example.com")
        page.fill("input[name=username]", "user@example.com")
        page.fill("input[name=password]", "password123")
        page.click("button[type=submit]")
        assert "Dashboard" in page.text_content()

4. Тестирование производительности

locust — для нагрузочного тестирования:

from locust import HttpUser, task, between

class UserBehavior(HttpUser):
    wait_time = between(1, 3)
    
    @task(1)
    def index(self):
        self.client.get("/")
    
    @task(2)
    def profile(self):
        self.client.get("/profile")

5. Тестирование с моками

unittest.mock — встроенная библиотека для создания моков:

from unittest.mock import Mock, MagicMock, patch

def test_database_call():
    mock_db = Mock()
    mock_db.query.return_value = [{"id": 1, "name": "test"}]
    
    result = get_user_from_db(mock_db, 1)
    assert len(result) == 1
    mock_db.query.assert_called_once()

6. Тестирование асинхронного кода

pytest-asyncio — для тестирования async функций:

import pytest
import asyncio

@pytest.mark.asyncio
async def test_async_function():
    result = await async_operation()
    assert result == "expected"

7. Инструменты анализа покрытия

coverage.py — для измерения покрытия кода:

# Запуск тестов с измерением покрытия
coverage run -m pytest
coverage report
coverage html  # Генерирует HTML отчет

8. Непрерывная интеграция

GitHub Actions, GitLab CI, Jenkins — для автоматического запуска тестов при каждом commit.

Выбор инструмента

  • Начинающим: pytest + unittest.mock
  • Веб-приложения: Django/Flask TestCase + Playwright для E2E
  • Микросервисы: pytest + httpx для HTTP тестирования
  • Асинхронный код: pytest-asyncio
  • Нагрузочное тестирование: locust
  • Покрытие кода: coverage.py

В большинстве проектов рекомендуется использовать pytest как основной инструмент, так как он стал индустриальным стандартом и обеспечивает максимальную гибкость при минимальном количестве boilerplate кода.