Как реализуется функциональное тестирование в 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()

Ответ 18+ 🔞

А, функциональное тестирование! Ну это когда ты, сука, проверяешь, работает ли твоя программа так, как она должна работать, а не как она там внутри устроена. Не важно, как она это делает — через жопу или через нос. Главное, чтобы на выходе получалось то, что ожидает пользователь, а не какая-нибудь хуйня. Бизнес-требования, блядь, святое! Если они говорят «кнопка должна быть зелёной и открывать дверь», то она должна быть зелёной и открывать дверь, а не красной и звать нахуй.

В Питоне для этого есть целый овердохуища инструментов, смотря что тестируешь.

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: Стандартный, дедовский способ. Как палка-копалка — работает, но скучно.
  • doctest: Вообще пиздец какой-то. Ты пишешь примеры прямо в документации к функции, и они же становятся тестами. Хитро, блядь.

2. Тестирование API: Тут уже не кишки, а внешние шланги. Бьём по серверу запросами и смотрим, не обосрётся ли он.

  • requests: Библиотека, чтобы долбить 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()

    Вот и вся магия, блядь. Главное — не забывать, что тестируешь ты функционал, а не свою психическую устойчивость. Хотя последнее тоже часто проверяется.