JavaRush /Курсы /Python SELF /Тестирование и отладка скрипта для обеспечения стабильнос...

Тестирование и отладка скрипта для обеспечения стабильности

Python SELF
38 уровень , 4 лекция
Открыта

1. Методы тестирования скриптов

Добро пожаловать на нашу лекцию, посвященную самому любимому процессу всех программистов — отладке и тестированию! Если вы уже освоили создание замечательного ботика с Selenium, настало время узнать, как превратить его из сумасбродного робота в послушного исполнителя, который не только работает, но и делает это стабильно. Ведь не хочется, чтобы ваш бот в самый ответственный момент вдруг решил "отдохнуть".

Начнем с обсуждения различных методов тестирования ваших скриптов. Тестирование — это как обязательный визит к врачу: никто не хочет, но без него никак. Даже самый блестящий скрипт нуждается в проверке на прочность и надежность. Хорошая новость в том, что в Python имеется множество инструментов для помощи в этом деле.

Unit-тесты

Все начинается с юнит-тестов. Они как маленькие швейцарские часы, проверяющие каждую шестеренку вашего механизма. В Python библиотека unittest является стандартом де-факто для написания юнит-тестов. Основная идея заключается в тестировании отдельных "юнитов" или частей вашего кода в изоляции.


import unittest
from my_selenium_script import my_function

class TestMyFunction(unittest.TestCase):

    def test_success_case(self):
        result = my_function("expected input")
        self.assertEqual(result, "expected output")

unittest.main()

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

Интеграционные тесты

Когда у вас уже есть основания доверять каждому из "юнитов", настала пора проверить их взаимодействие друг с другом. Интеграционные тесты, как идеальное свидание, показывают, как отдельные компоненты работают вместе. Здесь вы можете использовать те же библиотеки, но подходите к тестированию с другой стороны.


class TestIntegration(unittest.TestCase):

    def test_full_workflow(self):
        # Представьте, что каждый шаг — это вызов функции вашего алгоритма
        open_page()
        fill_form()
        submit_form()
        self.assertTrue(check_results())

Интеграционные тесты могут быть более сложными и занимать больше времени, но они дают уверенность, что вся система работает как единое целое.

2. Отладка и исправление ошибок

Теперь, когда мы поговорили о тестировании, давайте погрузимся в более интригующую часть — отладку. Отладка — это когда ваш бот решает ударится в самодеятельность и начинает импровизировать, а вы пытаетесь вернуть его к сценарию.

Инструменты отладки

Прекрасный инструмент для отладки в Python — это pdb. Он позволяет вам поставить выполнение скрипта на паузу и исследовать его состояние, шаг за шагом. Давайте рассмотрим пример:


import pdb

def some_function(value):
    pdb.set_trace()  # Здесь выполнение приостановится
    result = value + 1
    return result

some_function(3)

Запустив этот код, вы попадете в интерактивную среду, где сможете шагать по коду, смотреть значения переменных, изменять их и даже продолжать выполнение программы по шагам. Это сильно облегчает жизнь, когда ваш скрипт, казалось бы, делает нечто странное.

Визуализация состояния страницы

Для визуальной отладки полезно сохранять скриншоты страницы на каждом этапе выполнения скрипта. Это поможет увидеть, какие элементы отображаются на экране и как выглядит страница в момент ошибки.


driver.save_screenshot("page_state.png")

Стратегии поиска и устранения ошибок

К сожалению, никакой отладчик не покажет вам, где в коде была допущена фундаментальная ошибка в логике. Здесь на помощь приходят стратегии:

  • Логирование: Добавление логирования повсюду. Как сказал кто-то мудрый, "если не знаешь, что происходит с кодом, значит, у тебя недостаточно логов". Использование библиотеки logging помогает не засорять ваш код print() функциями и дает больше контроля.
  • Чтение кода вслух: Иногда задачи мозга решаются лучше, если проговорить, что делает код. Звучит смешно, но это работает!
  • Разделение на модули: Четко разделите части кода на модули или функции. Это позволит проще определить, где именно произошел сбой.

3. Анализ ваших скриптов Selenium

Для создания надежного скрипта важно протестировать его работу в различных сценариях. Вот несколько примеров таких сценариев:

Отсутствие элементов на странице

Во время отладки важно убедиться, что все нужные элементы присутствуют на странице и доступны для взаимодействия. Используйте метод find_elements() и проверяйте длину возвращаемого списка, чтобы избежать ошибок NoSuchElementException.


elements = driver.find_elements_by_class_name("class_name")
if len(elements) == 0:
    logging.warning("Элементы не найдены")
else:
    logging.info("Элементы успешно найдены")

Непредвиденные состояния страницы

Например, страницы с разными формами загрузки или разными элементами, которые появляются в зависимости от условий. Скрипт должен быть готов к обработке таких ситуаций.


try:
    special_offer = driver.find_element(By.ID, "special_offer")
    logging.info("Нашли спецпредложение и выполняем действия")
except NoSuchElementException:
    logging.info("Спецпредложение не найдено, продолжаем без него")

Вариативные элементы на странице

При тестировании нужно учесть, что на одной и той же странице элементы могут изменяться (например, разные баннеры, рекламные блоки и т.д.). Тестируйте скрипт с учетом разных состояний страницы.

Проверка на различных браузерах

Разные браузеры могут обрабатывать страницы по-разному, поэтому для обеспечения стабильности полезно тестировать скрипт на нескольких браузерах (например, Chrome, Firefox, Edge). Selenium позволяет запускать тесты на разных браузерах через различные веб-драйверы.


from selenium import webdriver

# Запуск на Chrome
driver = webdriver.Chrome()

# Запуск на Firefox
driver = webdriver.Firefox()

# Запуск на Edge
driver = webdriver.Edge()

4. Автоматизация тестирования скрипта

Написание тестов с использованием unittest

Используйте библиотеку unittest, чтобы автоматически запускать тесты для разных частей вашего скрипта. Это позволит вам регулярно проверять работоспособность каждого элемента.


import unittest
from selenium import webdriver

class SeleniumTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://example.com")

    def test_element_presence(self):
        driver = self.driver
        element = driver.find_element_by_id("submit_button")
        self.assertIsNotNone(element, "Элемент не найден на странице")

    def tearDown(self):
        self.driver.quit()

unittest.main()

Создание тестового набора с параметрами

Создайте наборы тестов для проверки различных комбинаций элементов и сценариев. Например, можно проверять страницы с разными параметрами, такими как различные формы данных в форме ввода.

Проверка на устойчивость и производительность

  • Проверяйте стабильность скрипта на больших объемах данных: Убедитесь, что скрипт способен обрабатывать большие объемы данных и работать в течение длительного времени.
  • Запускайте регулярное тестирование: Регулярно запускайте тесты для мониторинга стабильности скрипта, особенно если сайт, с которым вы работаете, часто обновляется.
  • Оценивайте производительность: Избегайте долгих ожиданий и медленных элементов. Используйте таймеры для оценки времени выполнения каждого шага и оптимизируйте их при необходимости.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ioanna Polyak Уровень 29
11 сентября 2025
Я 1 поставь лайк