Tutorial: Construindo uma Suíte de Testes Passo a Passo
Este tutorial mostra como construir uma suíte de testes Serenity Playwright para a aplicação TodoMVC. Em vez de mostrar o código final de uma vez, vamos construí-lo iterativamente—começando com um único teste e adicionando apenas o que precisamos conforme avançamos.
Isso reflete como você realmente desenvolveria testes na prática: escreva um teste, construa a infraestrutura mínima para suportá-lo, depois expanda.
O Que Estamos Testando
TodoMVC é uma aplicação simples de lista de tarefas onde usuários podem adicionar, completar, editar e excluir itens. Começaremos com a funcionalidade mais básica e evoluiremos a partir daí.
Configuração do Projeto
Primeiro, crie um projeto Maven com estas dependências no pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>serenity-playwright-todomvc</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<serenity.version>5.1.0</serenity.version>
<playwright.version>1.57.0</playwright.version>
</properties>
<dependencies>
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-playwright</artifactId>
<version>${serenity.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-junit5</artifactId>
<version>${serenity.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.playwright</groupId>
<artifactId>playwright</artifactId>
<version>${playwright.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>6.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.27.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.serenity-bdd.maven.plugins</groupId>
<artifactId>serenity-maven-plugin</artifactId>
<version>${serenity.version}</version>
<executions>
<execution>
<id>serenity-reports</id>
<phase>post-integration-test</phase>
<goals>
<goal>aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Iteração 1: Nosso Primeiro Teste
Vamos começar com o teste mais simples possível: adicionar um único item de tarefa.
Escreva o Teste Primeiro
Crie src/test/java/todomvc/tests/WhenAddingTodosTest.java:
package todomvc.tests;
import com.microsoft.playwright.*;
import net.serenitybdd.annotations.Steps;
import net.serenitybdd.junit5.SerenityJUnit5Extension;
import net.serenitybdd.playwright.PlaywrightSerenity;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import todomvc.steps.TodoSteps;
import static org.assertj.core.api.Assertions.assertThat;
@ExtendWith(SerenityJUnit5Extension.class)
@DisplayName("When adding todos")
class WhenAddingTodosTest {
private Playwright playwright;
private Browser browser;
private Page page;
@Steps
TodoSteps todo;
@BeforeEach
void setUp() {
playwright = Playwright.create();
browser = playwright.chromium().launch(
new BrowserType.LaunchOptions().setHeadless(true)
);
page = browser.newPage();
PlaywrightSerenity.registerPage(page);
todo.setPage(page);
}
@AfterEach
void tearDown() {
PlaywrightSerenity.unregisterPage(page);
if (page != null) page.close();
if (browser != null) browser.close();
if (playwright != null) playwright.close();
}
@Test
@DisplayName("should add a single todo item")
void shouldAddSingleTodoItem() {
todo.openApplication();
todo.addTodo("Buy milk");
assertThat(todo.visibleTodoCount()).isEqualTo(1);
}
}
Este teste ainda não vai compilar—precisamos criar a step library e o page object. Mas observe que definimos exatamente o que precisamos:
openApplication()- navegar até a aplicaçãoaddTodo(String)- adicionar um itemvisibleTodoCount()- retornar quantos itens estão visíveis
Crie a Step Library
Crie src/test/java/todomvc/steps/TodoSteps.java com apenas os métodos que precisamos:
package todomvc.steps;
import com.microsoft.playwright.Page;
import net.serenitybdd.annotations.Step;
import todomvc.pages.TodoMvcPage;
public class TodoSteps {
private TodoMvcPage todoMvcPage;
public void setPage(Page page) {
this.todoMvcPage = new TodoMvcPage(page);
}
@Step("Open the TodoMVC application")
public void openApplication() {
todoMvcPage.open();
}
@Step("Add a todo: '{0}'")
public void addTodo(String todoText) {
todoMvcPage.addTodo(todoText);
}
@Step("Get the number of visible todos")
public int visibleTodoCount() {
return todoMvcPage.getVisibleTodoCount();
}
}
Observe que visibleTodoCount() retorna um int. O teste faz a asserção, não a step library. Isso mantém os passos reutilizáveis—o mesmo passo pode ser usado em diferentes testes com diferentes valores esperados.
Crie o Page Object
Crie src/test/java/todomvc/pages/TodoMvcPage.java com apenas o que precisamos:
package todomvc.pages;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
public class TodoMvcPage {
private final Page page;
private static final String URL = "https://todomvc.com/examples/react/dist/";
public TodoMvcPage(Page page) {
this.page = page;
}
// Locators - mantenha privados
private Locator newTodoInput() {
return page.getByPlaceholder("What needs to be done?");
}
private Locator todoItems() {
return page.locator(".todo-list li");
}
// Ações
public void open() {
page.navigate(URL);
page.waitForLoadState();
}
public void addTodo(String todoText) {
newTodoInput().fill(todoText);
newTodoInput().press("Enter");
}
// Consultas
public int getVisibleTodoCount() {
return todoItems().count();
}
}
Execute
mvn clean verify
O teste deve passar. Agora temos uma suíte de testes funcional mínima.
Iteração 2: Adicionando Mais Asserções
Vamos melhorar nosso teste para verificar se o texto da tarefa aparece corretamente.
Atualize o Teste
@Test
@DisplayName("should add a single todo item")
void shouldAddSingleTodoItem() {
todo.openApplication();
todo.addTodo("Buy milk");
assertThat(todo.visibleTodoCount()).isEqualTo(1);
assertThat(todo.todoExists("Buy milk")).isTrue(); // Nova asserção
}
Adicione à Step Library
@Step("Check if todo '{0}' exists")
public boolean todoExists(String todoText) {
return todoMvcPage.hasTodo(todoText);
}
Adicione ao Page Object
private Locator todoItemByText(String text) {
return page.locator(".todo-list li").filter(
new Locator.FilterOptions().setHasText(text)
);
}
public boolean hasTodo(String todoText) {
return todoItemByText(todoText).count() > 0;
}
Adicionamos um novo método de locator todoItemByText() porque precisávamos encontrar um item específico. Este locator será reutilizado para outras operações depois.
Iteração 3: Testando Múltiplas Tarefas
Adicione um Novo Teste
@Test
@DisplayName("should add multiple todo items")
void shouldAddMultipleTodoItems() {
todo.openApplication();
todo.addTodos("Buy milk", "Walk the dog", "Do laundry");
assertThat(todo.visibleTodoCount()).isEqualTo(3);
assertThat(todo.visibleTodos())
.containsExactly("Buy milk", "Walk the dog", "Do laundry");
}