В днешния бързо развиващ се технологичен пейзаж доставянето на безупречно потребителско изживяване е от първостепенно значение. Ръчното тестване може да ни отведе само дотам, но за да останем в крак със светкавичната скорост на разработка и да гарантираме най-високо качество, автоматизираното UI тестване е нашият верен приятел. Така че, затегнете коланите, защото ще ви отведем на вълнуващо пътешествие, за да усъвършенствате уменията си за тестване!
Какво представлява автоматизираното UI тестване?
Автоматизираното UI тестване включва писането на код, който симулира взаимодействията на потребителите с приложение, за да се провери дали то се държи според очакванията. Вместо да щракаме ръчно и да пишем в нашия UI отново и отново, можем да използваме умни инструменти като Selenium, за да автоматизираме процеса, спестявайки ценно време и усилия.
Но защо да си правим труда да автоматизираме нашите UI тестове? Ето няколко убедителни причини:
- Скорост: Автоматизираните тестове могат да се изпълняват много по-бързо от ръчните, позволявайки ни да получим обратна връзка за качеството в рекордно време.
- Точност: Компютрите са чудесни в следването на инструкции с висока прецизност, елиминирайки риска от човешка грешка.
- Повторяемост: Автоматизираните тестове могат да се изпълняват многократно без допълнителни усилия, гарантирайки последователни резултати.
- Обхват: Можем да покрием по-голяма част от нашето приложение с автоматизирани тестове, включително редки сценарии, които могат да бъдат трудни за ръчно тестване.
Сега, когато знаем защо автоматизираното UI тестване е толкова страхотно, нека да се запознаем с нашите инструменти!
Запознайте се със Selenium
Selenium е широко използвана рамка с отворен код за автоматизиране на уеб браузъри. Той ни позволява да пишем тестове на различни езици за програмиране, включително нашия любим Python, и поддържа всички основни браузъри. С Selenium можем да автоматизираме взаимодействия като кликване на бутони, попълване на формуляри и проверка на резултатите – всичко, което нашите потребители биха направили.
Ключовият компонент на Selenium е WebDriver API, който действа като посредник между нашия тестов код и браузъра. Той превежда нашите команди в действия в браузъра и ни дава информация за състоянието на приложението.
Настройка на средата
Преди да започнете да пишете автоматизирани тестове, трябва да настроите средата:
- Инсталирайте Python: Selenium има връзки за много езици, но ние ще се придържаме към Python за тази статия. Уверете се, че имате инсталиран Python (за предпочитане Python 3.x).
- Инсталирайте Selenium: Използвайте pip, инструмента за управление на пакети на Python, за да инсталирате пакета selenium:
pip install selenium
- Изтеглете уеб драйверите: Selenium изисква специален драйвер за всеки браузър, който искате да автоматизирате. Най-популярните са:
- ChromeDriver за Google Chrome
- GeckoDriver за Mozilla Firefox
- EdgeDriver за Microsoft Edge
- SafariDriver за Apple Safari
Изтеглете подходящите драйвери за вашата операционна система и ги добавете към PATH, за да може Selenium да ги открие.
- Създайте нов проект: Направете нова папка за вашия проект и създайте Python файл за вашия тест:
mkdir selenium_tests
cd selenium_tests
touch test_login.py
Сега сте готови да започнете да пишете автоматизирани тестове! Нека да преминем през някои основи на Selenium.
Основи на Selenium WebDriver
Selenium WebDriver е вашият най-добър приятел, когато става въпрос за автоматизиране на уеб браузъри. Ето няколко ключови операции, които ще използвате постоянно:
-
- Стартиране на браузъра:
from selenium import webdriver
driver = webdriver.Chrome() # За Chrome
# или
driver = webdriver.Firefox() # За Firefox
# или
driver = webdriver.Edge() # За Edge
# или
driver = webdriver.Safari() # За Safari
-
- Навигация до URL:
driver.get("https://www.example.com")
-
- Намиране на елементи:
# Намиране на елемент по ID
element = driver.find_element_by_id("element-id")
# Намиране на елемент по име на клас
element = driver.find_element_by_class_name("class-name")
# Намиране на елемент по име на маркер
element = driver.find_element_by_tag_name("tag-name")
# Намиране на елемент от CSS селектор
element = driver.find_element_by_css_selector("css-selector")
# Намиране на елемент по XPath
element = driver.find_element_by_xpath("xpath-expression")
-
- Взаимодействие с елементи:
# Щракнете върху елемент
element.click()
# Въведете текст в елемент
element.send_keys("Някакъв текст")
# Изчистете текст от елемент
element.clear()
-
- Потвърждение на очаквания:
# Проверете дали елементът е видим
assert element.is_displayed()
# Проверете дали елементът има определен текст
assert element.text == "Очакван текст"
-
- Затваряне на браузъра:
driver.quit()
С тези основни строителни блокове можете да започнете да изграждате смислени автоматизирани тестове за вашето приложение. Но как да направим нашите тестове надеждни и поддържани? Нека да разгледаме някои стратегии!
Писане на надеждни и поддържани UI тестове
Ключът към създаването на автоматизирани UI тестове, които са надеждни и лесни за поддръжка във времето, е да бъдем преднамерени и стратегически в нашия подход. Ето няколко съвета:
- Изчакване на асинхронни операции: Модерните уеб приложения често зареждат данни асинхронно, което означава, че елементите може да не са веднага налични. Използвайте изчакващи условия, за да гарантирате, че елементите присъстват, преди да взаимодействате с тях:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element-id"))
)
-
- Справяне с динамично съдържание: Идентификаторите или класовете на елементите могат да се променят с времето. Вместо да разчитате на крехки селектори, използвайте по-устойчиви техники като атрибути или комбинации от селектори:
# Вместо това
driver.find_element_by_class_name('динамичен_клас_име')
# Направете това
driver.find_element_by_css_selector('[data-testid="уникален-идентификатор"]')
-
- Използвайте Page Object Model (POM): POM е шаблон за дизайн, който ви помага да структурирате тестовия си код по начин, който огледално отразява структурата на вашето приложение. Създайте класове на Python, които представляват страници или компоненти, и енкапсулирайте свързаната с тях функционалност. Това подобрява четимостта и улеснява поддръжката:
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = driver.find_element_by_id("потребителско_име")
self.password_field = driver.find_element_by_id("парола")
self.login_button = driver.find_element_by_css_selector("button[type='submit']")
def login(self, username, password):
self.username_field.send_keys(username)
self.password_field.send_keys(password)
self.login_button.click()
-
- Следвайте принципа DRY (Don’t Repeat Yourself): Ако установите, че повтаряте едни и същи стъпки в много тестови случаи, помислете за изваждането им в помощни функции или базови класове. Това намалява дублирането и прави кода ви по-лесен за поддръжка.
Изпълнение и отчитане на UI тестове
Автоматизираното тестване достига своя пълен потенциал, когато е интегрирано в нашия процес на разработка. Ето как да изпълнявате и отчитате вашите тестове ефективно:
- Интеграция с CI/CD: Включете вашите автоматизирани UI тестове във вашия CI/CD поток наред с вашите единични и интеграционни тестове. Това ще гарантира, че регресиите се улавят рано и често.
- Паралелно изпълнение: Ако имате голям набор от тестове, изпълнението им последователно може да отнеме много време. Помислете за използването на инструменти като pytest-xdist или Selenium Grid за паралелно изпълнение на тестове и намаляване на общото време.
- Генериране на отчети: Използвайте инструмент за отчитане на тестове като Allure или ExtentReports, за да генерирате богати HTML отчети с екранни снимки, журнали и анализ на грешките. Това ще ви помогне бързо да идентифицирате и отстраните проблемите.
Съвети и най-добри практики
Ето няколко финални съвета, които да ви помогнат да извлечете максимума от автоматизираното UI тестване:
- Давайте приоритет на тестването на най-важните пътища на потребителя, а не да покривате всеки възможен сценарий.
- Дръжте тестовете си възможно най-прости – сложните тестове са по-чупливи и трудни за поддръжка.
- Редовно преглеждайте и поддържайте вашите тестове успоредно с развитието на приложението.
- Не се разколебайте да инвестирате време в изграждане на помощна инфраструктура – ще се изплати многократно с течение на времето.
- Потърсете начини за допълнително подобряване на скоростта и надеждността на вашите тестове, като например използване на фалшиви сървъри или инструменти за мокинг.
Примери и демонстрации на реални приложения
Нека сега приложим наученото в практиката! Ето подробна демонстрация стъпка по стъпка как да напишем автоматизиран UI тест за процес на влизане с Python и Selenium.
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = (By.ID, "username")
self.password_field = (By.ID, "password")
self.submit_button = (By.CSS_SELECTOR, "button[type='submit']")
self.error_message = (By.CLASS_NAME, "error-msg")
def enter_username(self, username):
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(self.username_field)
).send_keys(username)
def enter_password(self, password):
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(self.password_field)
).send_keys(password)
def click_submit(self):
WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable(self.submit_button)
).click()
def get_error_message(self):
return WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(self.error_message)
).text
class TestLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.example.com/login")
self.login_page = LoginPage(self.driver)
def test_valid_login(self):
self.login_page.enter_username("valid_user")
self.login_page.enter_password("valid_password")
self.login_page.click_submit()
# Потвърдете, че потребителят е пренасочен към началната страница
WebDriverWait(self.driver, 10).until(
EC.url_to_be("https://www.example.com/home")
)
def test_invalid_login(self):
self.login_page.enter_username("invalid_user")
self.login_page.enter_password("invalid_password")
self.login_page.click_submit()
# Потвърдете, че се показва съобщение за грешка
error_message = self.login_page.get_error_message()
self.assertEqual(error_message, "Невалидно потребителско име или парола")
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
В този пример дефинираме клас LoginPage
, който енкапсулира логиката за взаимодействие с елементите на страницата за вход. Използваме шаблона Page Object Model, за да отделим логиката на теста от подробностите по имплементацията на страницата.
След това дефинираме два тестови метода – test_valid_login
и test_invalid_login
– които покриват успешния и неуспешния сценарий за вход. Използваме методите на класа LoginPage
, за да взаимодействаме със страницата, и потвърждаваме очакваните резултати, като използваме условия на изчакване и твърдения.
Методите setUp
и tearDown
се изпълняват преди и след всеки тестов метод и се използват съответно за инициализиране и почистване на ресурсите.
Това е само прост пример, но илюстрира общия поток на писане на автоматизирани UI тестове с Python и Selenium. Можете да разширите този модел, за да покриете по-сложни сценарии и да използвате по-усъвършенствани техники за подобряване на поддръжката и надеждността.
Заключение
В тази статия се потопихме в увлекателния свят на автоматизираното UI тестване с Python и Selenium. Научихме защо автоматизацията на UI тестовете е от съществено значение в съвременната софтуерна разработка и как Selenium ни дава мощни инструменти за ефективно и ефикасно тестване на нашите приложения.
Преминахме през процеса на настройка на нашата среда за тестване, изследвахме основите на Selenium WebDriver API и обсъдихме стратегии за писане на надеждни и поддържани тестове. Видяхме и практически пример за това как да структурираме и изпълним автоматизиран UI тест от край до край.
Но това е само началото! Автоматизираното UI тестване е обширна и постоянно развиваща се област, с множество инструменти, техники и най-добри практики, които да овладеете. Насърчаваме ви да продължите да изследвате и експериментирате – колкото повече практикувате, толкова по-уверен и опитен ще ставате.
Помнете, че автоматизацията не е панацея – тя е мощно допълнение към вашето общо усилие за осигуряване на качество, но не замества нуждата от внимателно ръчно тестване и човешка преценка. Правилният баланс между автоматични и ръчни тестове ще ви помогне да постигнете оптимално покритие, ефективност и увереност в качеството на вашето приложение.
Допълнителни ресурси:
- Официална документация на Selenium: https://www.selenium.dev/documentation/
- „Тестово-управлявана разработка с Python“ – книга от Хари Пърсивал : https://www.obeythetestinggoat.com/
- Блог „Запознаване с автоматизацията“: https://www.lambdatest.com/blog/category/selenium-python/