Учебники

Python Web Scraping — Тестирование со скребками

В этой главе объясняется, как выполнить тестирование с использованием веб-скребков в Python.

Вступление

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

Тестирование с использованием Python

Когда мы говорим о тестировании, это означает модульное тестирование. Прежде чем углубляться в тестирование с Python, мы должны знать о модульном тестировании. Ниже приведены некоторые характеристики модульного тестирования:

  • По крайней мере, один аспект функциональности компонента будет тестироваться в каждом модульном тесте.

  • Каждый модульный тест независим и может также выполняться независимо.

  • Модульный тест не мешает успеху или провалу любого другого теста.

  • Модульные тесты могут выполняться в любом порядке и должны содержать хотя бы одно утверждение.

По крайней мере, один аспект функциональности компонента будет тестироваться в каждом модульном тесте.

Каждый модульный тест независим и может также выполняться независимо.

Модульный тест не мешает успеху или провалу любого другого теста.

Модульные тесты могут выполняться в любом порядке и должны содержать хотя бы одно утверждение.

Unittest — модуль Python

Модуль Python с именем Unittest для модульного тестирования поставляется со всей стандартной установкой Python. Нам просто нужно импортировать его, а остальное — задача класса unittest.TestCase, который будет выполнять следующее:

  • Функции SetUp и tearDown предоставляются классом unittest.TestCase. Эти функции могут выполняться до и после каждого модульного теста.

  • Он также предоставляет операторы assert, чтобы тесты могли проходить или не проходить

  • Он запускает все функции, которые начинаются с test_ как модульный тест.

Функции SetUp и tearDown предоставляются классом unittest.TestCase. Эти функции могут выполняться до и после каждого модульного теста.

Он также предоставляет операторы assert, чтобы тесты могли проходить или не проходить

Он запускает все функции, которые начинаются с test_ как модульный тест.

пример

В этом примере мы собираемся объединить очистку веб-страниц с unittest . Мы проверим страницу Википедии для поиска строки «Python». В основном он будет выполнять два теста, первый из которых будет соответствовать заголовку страницы, так же как «Python» или нет, а второй тест проверяет, что страница имеет div содержимого.

Сначала мы импортируем необходимые модули Python. Мы используем BeautifulSoup для просмотра веб-страниц и, конечно, юнит-тест для тестирования.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest

Теперь нам нужно определить класс, который будет расширять unittest.TestCase. Глобальный объект bs будет разделен между всеми тестами. Определенная юнит-тестом функция setUpClass выполнит это. Здесь мы определим две функции: одну для тестирования титульного листа и другую для тестирования содержимого страницы.

class Test(unittest.TestCase):
   bs = None
   def setUpClass():
      url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
      Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
   def test_titleText(self):
      pageTitle = Test.bs.find('h1').get_text()
      self.assertEqual('Python', pageTitle);
   def test_contentExists(self):
      content = Test.bs.find('div',{'id':'mw-content-text'})
      self.assertIsNotNone(content)
if __name__ == '__main__':
   unittest.main()

После запуска вышеуказанного скрипта мы получим следующий вывод —

----------------------------------------------------------------------
Ran 2 tests in 2.773s

OK
An exception has occurred, use %tb to see the full traceback.

SystemExit: False

D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Тестирование с Selenium

Давайте обсудим, как использовать Python Selenium для тестирования. Это также называется тестированием Selenium. И Python unittest, и Selenium не имеют много общего. Мы знаем, что Selenium отправляет стандартные команды Python в разные браузеры, несмотря на различия в дизайне их браузера. Напомним, что мы уже устанавливали и работали с Selenium в предыдущих главах. Здесь мы создадим тестовые сценарии в Selenium и используем его для автоматизации.

пример

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

Сначала для подключения к веб-браузеру мы импортируем веб-драйвер из модуля селена —

from selenium import webdriver

Теперь нам нужно импортировать ключи из модуля селена.

from selenium.webdriver.common.keys import Keys

Далее нам нужно предоставить имя пользователя и пароль для входа в нашу учетную запись Facebook

user = "gauravleekha@gmail.com"
pwd = ""

Далее укажите путь к веб-драйверу для Chrome.

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get(" http://www.facebook.com ")

Теперь мы проверим условия, используя ключевое слово assert.

assert "Facebook" in driver.title

С помощью следующей строки кода мы отправляем значения в раздел электронной почты. Здесь мы ищем его по его идентификатору, но мы можем сделать это, выполнив поиск по имени как driver.find_element_by_name («email») .

element = driver.find_element_by_id("email")
element.send_keys(user)

С помощью следующей строки кода мы отправляем значения в раздел паролей. Здесь мы ищем его по его идентификатору, но мы можем сделать это, выполнив поиск по имени как driver.find_element_by_name («pass») .

element = driver.find_element_by_id("pass")
element.send_keys(pwd)

Следующая строка кода используется для нажатия ввода / входа после ввода значений в поле электронной почты и пароля.

element.send_keys(Keys.RETURN)

Теперь мы закроем браузер.

driver.close()

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

Логин в фейсбук

Сравнение: юнит-тест или селен

Сравнение юниттеста и селена затруднительно, потому что если вы хотите работать с большими тестовыми наборами, требуется синтаксическая жесткость соединений. С другой стороны, если вы собираетесь тестировать гибкость веб-сайта, то Selenium test будет нашим первым выбором. Но что, если мы сможем объединить их обоих? Мы можем импортировать селен в Python unittest и получить лучшее из обоих. Selenium может использоваться для получения информации о веб-сайте, а unittest может оценить, соответствует ли эта информация критериям для прохождения теста или нет.

Например, мы переписываем вышеприведенный скрипт Python для автоматизации входа в Facebook, объединяя их обоих следующим образом: