Basic Script Implementation
In this section, a basic test script will be implemented. Probato adopts a modular structure that includes scripts, procedures, page objects, and test suites. To illustrate the automation of a real feature, we will proceed with the automation of the Probato Manager application. Probato Manager has the login page as its main screen, so we will start from this functionality to develop automated tests: Perform Login
Basic Application Structure
We will assume that the project has the following structure:
Estruturaprobato-manager-automation/
├── src/
│ └── test/
│ ├── java/
│ | └── org.probato.manager.automation
│ | ├── model
│ | ├── page
│ | └── usecase
| └── resources/
│ ├── dataset/
│ ├── sql/
| └── configuration.yml
└── pom.xml
Implementing the Suite Class
- No pacote
org.probato.manager.usecase
vamos criar o novo pacote UC01
.
- No pacote
org.probato.manager.usecase.UC01
vamos criar a classe UC01_PerformLogin.java
.
- Na classe
UC01_PerformLogin.java
vamos implementar o código abaixo.
UC01_PerformLogin.java |
---|
| package org.probato.manager.automation.usecase.UC01;
import org.probato.manager.automation.usecase.UC01.script.UC01TC01_PerformLoginSuccessfully;
import org.probato.api.SQL;
import org.probato.api.Suite;
import org.probato.api.TestCase;
import org.probato.api.TestSuite;
@SQL(
datasource = "probato",
scriptPath = { "sql/init/init.sql" })
@Suite(
code = "UC01",
name = "Perform login",
description = "This feature aims to allow the user to login to this application")
class UC01_PerformLogin implements TestSuite {
@TestCase
private UC01TC01_PerformLoginSuccessfully uc01tc01;
// Add additional test cases to suite
}
|
Implementing the Script Class
- No pacote
org.probato.manager.usecase.UC01
vamos criar o novo pacote script
.
- No pacote
org.probato.manager.usecase.UC01.script
vamos criar a classe UC01TC01_PerformLoginSuccessfully.java
.
- Na classe
UC01TC01_PerformLoginSuccessfully.java
vamos implementar o código abaixo.
UC01TC01_PerformLoginSuccessfully.java |
---|
| package org.probato.manager.automation.usecase.UC01.script;
import org.probato.manager.automation.model.LoginModel;
import org.probato.manager.automation.page.DashboardPage;
import org.probato.manager.automation.page.LoginPage;
import org.probato.api.Dataset;
import org.probato.api.Page;
import org.probato.api.Procedure;
import org.probato.api.SQL;
import org.probato.api.Script;
@Dataset("dataset/UC01/UC01TC01.csv")
@SQL(
datasource = "probato",
scriptPath = { "sql/user/insert-user.sql" })
@Script(
code = "UC01TC01",
name = "Perform login successfully",
description = "This script aims to validate the user's login in the application successfully")
public class UC01TC01_PerformLoginSuccessfully {
@Page
private LoginPage loginPage;
@Page
private DashboardPage dashboardPage;
@Procedure
private void procedure(LoginModel model) {
loginPage.selectEnglishTranslate();
loginPage.checkPage();
loginPage.fillEmail(model.getEmail());
loginPage.fillPassword(model.getPassword());
loginPage.pressAccessButton();
dashboardPage.checkPage();
}
}
|
Implementing the Page Object
- No pacote
org.probato.manager.page
vamos criar a classe LoginPage.java
.
LoginPage.java |
---|
| package org.probato.manager.automation.page;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.probato.api.Action;
import org.probato.api.Param;
import org.probato.page.WebPage;
public class LoginPage extends WebPage {
@FindBy(xpath = "//*[@id=\"public-container\"]/app-login/form/div/div[1]/h1")
private WebElement titlePage;
@FindBy(xpath = "//*[@id=\"email\"]")
private WebElement emailInput;
@FindBy(xpath = "//*[@id=\"password\"]")
private WebElement passwordInput;
@FindBy(xpath = "//*[@id=\"login-btn\"]")
private WebElement accessButton;
@Action("Check `Login` page")
public void checkPage() {
assertEquals("Login", titlePage.getText());
assertTrue(emailInput.isDisplayed());
assertTrue(passwordInput.isDisplayed());
assertTrue(accessButton.isDisplayed());
}
@Action("Fill in the 'Email' field with '{{email}}' value")
public void fillEmail(@Param("email") String email) {
emailInput.sendKeys(email);
}
@Action("Fill in the 'Password' field with {{password}} value")
public void fillPassword(@Param("password") String password) {
passwordInput.sendKeys(password);
}
@Action("Press the 'Access' button")
public void pressAccessButton() {
accessButton.click();
}
}
|
- No pacote
org.probato.manager.page
vamos criar a classe DashboardPage.java
.
DashboardPage.java |
---|
| package org.probato.manager.automation.page;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.probato.api.Action;
import org.probato.api.Param;
import org.probato.page.WebPage;
public class DashboardPage extends WebPage {
@FindBy(xpath = "//*[@id=\"private-container\"]/app-view-dashboard/div/div[1]/div/h1")
private WebElement titlePage;
@Action("Check `Dashboard` page")
public void checkPage() {
assertEquals("Dashboard", titlePage.getText());
}
}
|
Creating Dataset File
- Na pasta
src/test/resources/dataset
vamos criar a nova pasta UC01
.
- Na pasta
src/test/resources/dataset/UC01
vamos criar o arquivo chamado UC01TC01.csv
.
- No arquivo
UC01TC01.csv
vamos adicionar o conteúdo abaixo.
UC01TC01.csv |
---|
| EMAIL, PASSWORD
user01@probato.org, p@ssword
user02@probato.org, p@ssword123
user02@probato.org, p@ssword321
|
- No pacote
org.probato.manager.automation.model
vamos criar a classe LoginPage.java
.
LoginModel.java |
---|
| package org.probato.manager.automation.model;
import org.probato.model.Datamodel;
public class LoginModel extends Datamodel {
private String email;
private String password;
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
}
|
Creating SQL Files
- Na pasta
src/test/resources/sql
vamos criar a nova pasta init
.
- Na pasta
src/test/resources/sql
vamos criar a nova pasta user
.
- Na pasta
src/test/resources/sql/init
vamos criar o arquivo chamado init.sql
.
- Na pasta
src/test/resources/sql/user
vamos criar o arquivo chamado insert-user.sql
.
- No arquivo
init.sql
vamos adicionar o conteúdo abaixo.
init.sql |
---|
| DELETE FROM testano_app.users;
|
- No arquivo
insert-user.sql
vamos adicionar o conteúdo abaixo.
insert-user.sql |
---|
| INSERT INTO testano_app.users
(id, "name", email, "password", gender, active)
VALUES('a02b03e6-c462-4980-9997-c1203a094c9d'::uuid, 'User 01', 'user01@probato.org', '$2a$10$Kml4nk3ADhnWrJg0GkStVeTJoslDBir/Fgyw2gkLR0FukujfIxZQ2', 'MALE', true);
INSERT INTO testano_app.users
(id, "name", email, "password", gender, active)
VALUES('bd84a2c8-d315-40ea-80aa-1841254b20c9'::uuid, 'User 02', 'user02@probato.org', '$2a$10$oHZ7er1/2/xKjgOq0znXnOPcvoOXpX.in6XO/4mf2xf5ZV7OMyvq6', 'MALE', true);
INSERT INTO testano_app.users
(id, "name", email, "password", gender, active)
VALUES('b86a08ac-2ee8-42c7-a46f-c589b1d26503'::uuid, 'User 03', 'user03@probato.org', '$2a$10$81pSkjzZTqgn3/nU5DzxVemmr0rjJ7NHtK/UiGhzomEwTyHZgFliC', 'MALE', true);
|
Final Considerations
We successfully implemented a basic script using Probato. Ao longo desta seção, foi possível demonstrar como o framework proporciona uma estrutura organizada e modular para a automação de testes, abrangendo desde a criação de Suites, Scripts, e Page Objects até a utilização de massas de dados e pré-condições com scripts SQL.
Este exemplo abordou a automação de um cenário fundamental: o login de um usuário na aplicação Probato Manager. A aplicação de práticas como a utilização do padrão Page Object, que facilita a manutenção e promove a reutilização de código, destacou-se como uma abordagem essencial para a construção de testes robustos e escaláveis.
Lessons and Benefits Observed
- Modularidade e organização: A separação em pacotes e a utilização de annotations simplificam a organização do projeto e aumentam a clareza do fluxo de execução dos testes.
- Facilidade na configuração inicial: Com a estrutura bem definida, a criação de novos testes e o gerenciamento de massas de dados tornam-se intuitivos.
- Integração com dados e banco de dados: O uso de datasets e scripts SQL facilita a preparação do estado inicial da aplicação, garantindo a consistência dos testes.
- Padronização: A adoção de convenções no design de Suites, Scripts, e Pages promove a padronização e reduz a curva de aprendizado para novos integrantes na equipe.
Final Checklist
Before finalizing the implementation of a basic script in Probato, make sure the following points are correctly configured and functional:
- ✅ Suite and Script classes implemented with the appropriate annotations.
- ✅ Page Object classes created, with elements mapped and methods working as expected.
- ✅ Dataset files created, containing the necessary data for the tests.
- ✅ SQL pre-condition scripts correctly configured, ensuring the application's initial state.
🎉 Your project is ready to continue test automation with Probato!
Ready to Continue?
Proceed to the next chapter: Execution and Result Analysis.