JavaRush /Курси /Python SELF UA /Тестування та налагодження скрипта для забезпечення стабі...

Тестування та налагодження скрипта для забезпечення стабільності

Python SELF UA
Рівень 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("очікуваний вхід")
        self.assertEqual(result, "очікуваний вихід")

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()

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

Створи набори тестів для перевірки різних комбінацій елементів і сценаріїв. Наприклад, можна перевіряти сторінки з різними параметрами, такими як різні форми даних у формі вводу.

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

  • Перевіряй стабільність скрипта на великих обсягах даних: Переконайся, що скрипт здатен обробляти великі обсяги даних і працювати протягом тривалого часу.
  • Запускай регулярне тестування: Регулярно запускай тести для моніторингу стабільності скрипта, особливо якщо сайт, з яким ти працюєш, часто оновлюється.
  • Оцінивай продуктивність: Уникай довгих очікувань та повільних елементів. Використовуй таймери для оцінки часу виконання кожного кроку і оптимізуй їх за потреби.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ