Как реализуется функциональное тестирование в Python?

«Как реализуется функциональное тестирование в Python?» — вопрос из категории Тестирование, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Функциональное тестирование — это процесс проверки программного обеспечения на соответствие его функциональных требований и спецификаций. Оно фокусируется на том, что система делает, а не на том, как она это делает, проверяя каждую функцию на корректность работы с различными входными данными. Это гарантирует, что ПО выполняет свои задачи в соответствии с ожиданиями пользователя и бизнес-требованиями.

В Python для реализации функционального тестирования используются различные фреймворки и библиотеки, в зависимости от уровня тестирования:

1. Модульное и интеграционное тестирование (Unit/Integration Testing):

  • pytest: Популярный и гибкий фреймворк для написания тестов. Позволяет легко создавать тестовые функции, использовать мощные фикстуры и плагины.

    # app.py
    def add(a, b):
        return a + b
    
    # test_app.py
    def test_add_positive_numbers():
        assert add(2, 3) == 5
    
    def test_add_negative_numbers():
        assert add(-1, 1) == 0
  • unittest: Стандартный модуль Python, основанный на xUnit-подобной архитектуре.
  • doctest: Позволяет писать тесты прямо в docstrings функций, проверяя примеры использования.

2. Тестирование API:

  • requests: Библиотека для выполнения HTTP-запросов, часто используется для тестирования RESTful API.

    import requests
    
    def test_api_status_endpoint():
        response = requests.get("https://api.example.com/status")
        assert response.status_code == 200
        assert response.json()["status"] == "OK"
    
    def test_api_create_item():
        payload = {"name": "Test Item", "price": 10.99}
        response = requests.post("https://api.example.com/items", json=payload)
        assert response.status_code == 201 # Или 200, в зависимости от API
        assert response.json()["name"] == "Test Item"

3. Тестирование пользовательского интерфейса (UI Testing):

  • Selenium: Инструмент для автоматизации браузеров, позволяющий имитировать действия пользователя (клики, ввод текста, навигация) и проверять состояние элементов страницы.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service as ChromeService
    from webdriver_manager.chrome import ChromeDriverManager
    
    def test_login_page():
        # Установка драйвера Chrome (используя webdriver_manager для удобства)
        service = ChromeService(ChromeDriverManager().install())
        driver = webdriver.Chrome(service=service)
        driver.get("https://example.com/login")
    
        # Ввод учетных данных
        driver.find_element(By.ID, "username").send_keys("testuser")
        driver.find_element(By.ID, "password").send_keys("testpass")
        driver.find_element(By.ID, "submit").click()
    
        # Проверка успешного входа
        assert "Welcome, testuser" in driver.page_source
        driver.quit()