Автоматизоване тестування - це просто! Як я тестував Пєчкіна

Не так давно став поглядати в бік Selenium WebDriver, який у зв'язці з PageObject стає прекрасним інструментом для автоматизованого тестування. Ті, хто не знайомий з Selenuim, можуть ознайомитися в цієї статті, тут можна прочитати конкретно про Selenium WebDriver.

При написанні цієї статті були використані:
  1. Maven
  2. TestNG
  3. Selenium WebDriver
  4. PageObject
  5. Піддослідний кролик: pechkin-mail.ru

Налаштування оточення

1. Необхідно встановити JDK. Його можна взяти з офіційного сайту — http://www.oracle.com
2. Встановити інструмент збірки, мені більше по душі Maven.
Інструкція по установці MavenЗавантажуємо останню версію Maven оф. сайту
Розпаковуємо в будь-яку директорію, наприклад у C:\Program Files\maven\
Додаємо змінну оточення: M2_HOME=C:\Program Files\maven\ і в PATH додаємо %M2_HOME%\bin
Перевіримо, що все зроблено вірно:
mvn-version

Має показати версію Maven'a
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T00:58:10+04:00)
Maven home: C:\Program Files\maven
Java версія: 1.8.0_20, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_20\jre
Default locale: ru_RU, platform encoding: Cp1251
OS name: "windows 7", version: "6.1", arch: "amd64", family: "dos"


3. В якості архітектурного рішення ми будемо використовувати архитип Олексія Баранцева (barancev). Заберемо архитип з github'a
git clone git://github.com/barancev/webdriver-java-quickstart-archetype.git

Перейдемо в папку з архитипом і встановимо його
cd webdriver-java-quickstart-archetype
mvn install

Наступним кроком буде створення проекту, це ми зробимо командою:
mvn archetype:generate-DarchetypeGroupId=ru.stqa.selenium-DarchetypeArtifactId=webdriver-java-quickstart-archetype-DarchetypeVersion=0.7-DgroupId=ru.mail.pechkin-DartifactId=PechkinFuncTest

де ru.mail.pechkin — id створюваного проекту, PechkinFuncTest — артефакт id створюваного проекту

Вперед до практики!

Для наочності ми будемо тестувати сторінку реєстрації Пєчкіна, складається з 4-х текстових полів, 2-х чекбоксов і кнопки реєстрації. З них ми і почнемо, але спочатку нам необхідно трохи налаштувати наш проект.

Відредагуємо pom.xml:
Будемо використовувати останню версію Selenium WebDriver
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.42.2</version>
</dependency>

Залишається в application.properties вказати URL сайту і браузер, в якому буде відбуватися тестування.
site.url=http://pechkin-mail.ru/
browser.name=firefox

Ліричний відступ
Перш ніж почнемо писати код, необхідно познайомитися з PageObject. Грубо кажучи, PageObject — це шаблон проектування, який розділяє високорівневу логіку від низькорівневої логіки пошуку і використання елементів інтерфейсу, при цьому підвищується читаність і підтримка коду.

У результаті виходить окремий клас, що описує, в нашому випадку, конкретну сторінку (WebElement'и), а так само способи взаємодії з ними.

Приступимо
В ru.mail.pechkin.pages створюємо RegistrationPage.java. Це і буде наш шаблон сторінки реєстрації. Почнемо описувати поля. Як було сказано вище, ми маємо:
1. Чотири текстових поля:
private WebElement emailField;
private WebElement usernameField;
private WebElement passwordField;
private WebElement inviteField;

2. Два чекбокса:
private WebElement dogovorCheckbox;
private WebElement persCheckbox;

3. Кнопку реєстрації:
private WebElement submitButton;

Озброївшись інспектором коду, визначаємо локатори цих елементів. Наш об'єкт буде виглядати наступним чином:
@FindBy(id = "email")
private WebElement emailField;
@FindBy(id = "username")
private WebElement usernameField;
@FindBy(id = "password")
private WebElement passwordField;
@FindBy(id = "invite")
private WebElement inviteField;
@FindBy(id = "dogovor")
private WebElement dogovorCheckbox;
@FindBy(id = "pers")
private WebElement persCheckbox;
@FindBy(id = "reg_submit")
private WebElement submitButton;

Наступним кроком буде створення методів, через які ми працюватимемо зі сторінкою
public RegistrationPage setEmail(String email){
emailField.sendKeys(email);
return this;
}
public RegistrationPage setUsername(String username){
usernameField.sendKeys(username);
return this;
}
public RegistrationPage setPassword(String password){
passwordField.sendKeys(password);
return this;
}
public RegistrationPage setInvite(String invite){
inviteField.sendKeys(invite);
return this;
}
public RegistrationPage setDogovor() {
if(!dogovorCheckbox.isSelected()) {
dogovorCheckbox.click();
}
return this;
}
public RegistrationPage setPersonal() {
if(!persCheckbox.isSelected()) {
persCheckbox.click();
}
return this;
}
public void clickSubmitButton() {
submitButton.click();
}

Ще нам знадобиться відстежувати повідомлення помилки при введенні не коректного email.
@FindBy(id = "error_block")
private WebElement errorText;

public boolean isError() {
if(errorText.isDisplayed()) {
return true;
} else {
return false;
}
}

RegistrationPage.java
package ru.mail.pechkin.pages;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.Findby;

public class RegistrationPage extends AnyPage{

@FindBy(id = "reg_submit")
private WebElement submitButton;

@FindBy(id = "email")
private WebElement emailField;

@FindBy(id = "username")
private WebElement usernameField;

@FindBy(id = "password")
private WebElement passwordField;

@FindBy(id = "invite")
private WebElement inviteField;

@FindBy(id = "dogovor")
private WebElement dogovorCheckbox;

@FindBy(id = "pers")
private WebElement persCheckbox;

@FindBy(id = "error_block")
private WebElement errorText;

public RegistrationPage(PageManager pages) {
super(pages);
}

public RegistrationPage setEmail(String email){
emailField.sendKeys(email);
return this;
}

public RegistrationPage setUsername(String username){
usernameField.sendKeys(username);
return this;
}

public RegistrationPage setPassword(String password){
passwordField.sendKeys(password);
return this;
}

public RegistrationPage setInvite(String invite){
inviteField.sendKeys(invite);
return this;
}

public RegistrationPage setDogovor() {
if(!dogovorCheckbox.isSelected()) {
dogovorCheckbox.click();
}
return this;
}

public RegistrationPage setPersonal() {
if(!persCheckbox.isSelected()) {
persCheckbox.click();
}
return this;
}

public void clickSubmitButton() {
submitButton.click();
}

public boolean isError() {
if(errorText.isDisplayed()) {
return true;
} else {
return false;
}
}
}


Тепер нам потрібен той, хто буде керувати нашою сторінкою. Додамо ru.mail.pechkin.logic RegistrationHelper.java. В ньому буде всього 3 методи:
Заповнення всіх полів коректними значеннями, крім email.
public void setEmailWithValidAllFields(String email) {
pages.registrationPage.setEmail(email).setUsername(username).setPassword(password);
pages.registrationPage.setDogovor().setPersonal();
}

Натискання кнопки реєстрації
public void clickRegistration() {
pages.registrationPage.clickSubmitbutton();
}

Перевірка відображення повідомлення про помилку
public boolean isError() {
return pages.registrationPage.isError();
}

RegistrationHelper.java
package ru.mail.pechkin.logic;

public class RegistrationHelper extends DriverBasedHelper implements IRegistrationHelper {

private final String username = "username";
private final String password = "passw";

private ApplicationManager manager;

public RegistrationHelper(ApplicationManager applicationManager) {
super(applicationManager.getWebDriver());
this.manager = applicationManager;
}

@Override
public String getTitle() {
return driver.getTitle();
}

public void setEmailWithValidAllFields(String email) {
pages.registrationPage.setEmail(email).setUsername(username).setPassword(password);
pages.registrationPage.setDogovor().setPersonal();
}

public void clickRegistration() {
pages.registrationPage.clickSubmitbutton();
}

public boolean isError() {
return pages.registrationPage.isError();
}
}


Пишемо тести

В директорії test ru.mail.pechkin створюємо RegistrationPageTest.java. Я покажу, як тестувати email полі, тому відкриваємо специфікацію на email поля і по ній складаємо тести. Наведу кілька прикладів.
Позитивні тести
@Test
public void validEmailWithLowerAndUpperLetters() {
app.getNavigationHelper().openRegistrationPage();
app.getRegistrationHelper().setEmailWithValidAllFields("testEmail@mailinator.com");
app.getRegistrationHelper().clickRegistration();
Assert.assertTrue(!app.getRegistrationHelper().isError());
}
@Test
public void validEmailWithNumberInLocalPart() {
app.getNavigationHelper().openRegistrationPage();
app.getRegistrationHelper().setEmailWithValidAllFields("1testEmail1@mailinator.com");
app.getRegistrationHelper().clickRegistration();
Assert.assertTrue(!app.getRegistrationHelper().isError());
}

Негативні тести
@Test
public void notValidEmailEmptyField() {
app.getNavigationHelper().openRegistrationPage();
app.getRegistrationHelper().setEmailWithValidAllFields("");
app.getRegistrationHelper().clickRegistration();
Assert.assertTrue(app.getRegistrationHelper().isError());
}
@Test
public void notValidEmailWithLackOfLocalPart(){
app.getNavigationHelper().openRegistrationPage();
app.getRegistrationHelper().setEmailWithValidAllFields("@mailinator.com");
app.getRegistrationHelper().clickRegistration();
Assert.assertTrue(app.getRegistrationHelper().isError());
}

Висновок

На цьому і закінчимо. У мене вийшло 37 тестів на перевірку email. Негативний тест на перевірку двох послідовних точок в локальній частині email несподівано зафейлился, рівно як і перевищення кількості символів в локальній частині.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.