diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ad6f35 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Lojinha Mobile Automação + +Esse é um reporsitório que contem a automação do teste de "Validação do valor do produto não permitido" do App Lojinha, criado em acompanhamento com as aulas do Módulo 11 do Programa de Testes e Qualidade de Software (PTQS), curso criado e ministrado por [Julio de Lima](https://github.com/juliointest). +Os sub-tópicos abaixo descrevem algumas decisões tomadas na estruturação do projeto. + +## Tecnologias Utilizadas + +- Java +https://www.oracle.com/br/java/technologies/javase/javase8u211-later-archive-downloads.html + +- Appium +https://mvnrepository.com/artifact/io.appium/java-client/8.1.1 + +- JUnit +https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api/5.9.0-M1 + + +## Testes Automatizados + +Testes para validar o valor do produto invalido no App Lojinha, que estão vinculados diretamente a regra de negócio que diz que o valor do produto deve estar entre R$0,01 e R$7.000,00. + +## Notas Gerais + + - Sempre utilizamos a anotação Before Each para capturar o token que será utilizado posteriormente nos métodos de test +- Nesse projeto fazemos uso do JUnit 5, o que nos dá a possibilidade de usar a anotação DisplayName para dar descrições em portugues para nossos testes \ No newline at end of file diff --git a/src/test/java/modulos/produto/ProdutoTest.java b/src/test/java/modulos/produto/ProdutoTest.java index 695ab1f..b5b894a 100644 --- a/src/test/java/modulos/produto/ProdutoTest.java +++ b/src/test/java/modulos/produto/ProdutoTest.java @@ -1,24 +1,24 @@ package modulos.produto; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.openqa.selenium.By; +import org.junit.jupiter.api.*; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; +import telas.LoginTela; import java.net.MalformedURLException; import java.net.URL; -import java.rmi.Remote; import java.util.concurrent.TimeUnit; + @DisplayName("Testes Mobile do Módulo de Produto") public class ProdutoTest { - @DisplayName("Validação do Valor de Produto Não Permitido") - @Test - public void testValidacaoDoValorDeProdutoNaoPermitido () throws MalformedURLException { - // Abrir o App + + private WebDriver app; + + @BeforeEach + public void beforeEach() throws MalformedURLException { + DesiredCapabilities capacidades = new DesiredCapabilities(); capacidades.setCapability("deviceName", "Xiaomi de Fernando"); capacidades.setCapability("platform", "Android"); @@ -27,35 +27,32 @@ public void testValidacaoDoValorDeProdutoNaoPermitido () throws MalformedURLExce capacidades.setCapability("appActivity", "com.lojinha.ui.MainActivity"); capacidades.setCapability("app", "C:\\Users\\ferna\\Documents\\lojinha-nativa.apk"); - WebDriver app = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capacidades); - app.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); - - - // Fazer Login - app.findElement(By.id("com.lojinha:id/user")).click(); - app.findElement(By.id("com.lojinha:id/user")).findElement(By.id("com.lojinha:id/editText")).sendKeys("admin"); - - app.findElement(By.id("com.lojinha:id/password")).click(); - app.findElement(By.id("com.lojinha:id/password")).findElement(By.id("com.lojinha:id/editText")).sendKeys("admin"); - - app.findElement(By.id("com.lojinha:id/loginButton")).click(); + this.app = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capacidades); + this.app.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); + } - // Abrir o formulário de novo produto - app.findElement(By.id("com.lojinha:id/floatingActionButton")).click(); + @DisplayName("Validação do Valor de Produto Não Permitido") + @Test + public void testValidacaoDoValorDeProdutoNaoPermitido () { - // Cadastrar um produto com valor inválido - app.findElement(By.id("com.lojinha:id/productName")).click(); - app.findElement(By.id("com.lojinha:id/productName")).findElement(By.id("com.lojinha:id/editText")).sendKeys("Notebook"); - app.findElement(By.id("com.lojinha:id/productValue")).click(); - app.findElement(By.id("com.lojinha:id/productValue")).findElement(By.id("com.lojinha:id/editText")).sendKeys("750000"); - app.findElement(By.id("com.lojinha:id/productColors")).click(); - app.findElement(By.id("com.lojinha:id/productColors")).findElement(By.id("com.lojinha:id/editText")).sendKeys("Vermelho"); + String mensagemApresentada = new LoginTela(app) + .preencherUsuario("admin") + .preencherSenha("admin") + .submeterLogin() + .abrirTelaAdicaoProduto() + .preencherNomeProduto("Notebook") + .preencherValorProduto("750000") + .preencherCoresProduto("Vermelho") + .submissaoComErro() + .obterMensagemDeErro(); - app.findElement(By.id("com.lojinha:id/saveButton")).click(); + Assertions.assertEquals("O valor do produto deve estar entre R$ 0,01 e R$ 7.000,00", mensagemApresentada); + } - // Validar que a mensagem de valor invalido foi apresentada - String mensagenApresentada = app.findElement(By.xpath("//android.widget.Toast")).getText(); - Assertions.assertEquals("O valor do produto deve estar entre R$ 0,01 e R$ 7.000,00", mensagenApresentada); + @AfterEach + public void afterEach() { + app.quit(); } + } diff --git a/src/test/java/telas/BaseTela.java b/src/test/java/telas/BaseTela.java new file mode 100644 index 0000000..02e2dcd --- /dev/null +++ b/src/test/java/telas/BaseTela.java @@ -0,0 +1,18 @@ +package telas; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class BaseTela { + protected WebDriver app; + + public BaseTela(WebDriver app) { + + this.app = app; + } + + public String capturarToast() { + return app.findElement(By.xpath("//android.widget.Toast")).getText(); + + } +} diff --git a/src/test/java/telas/FormularioAdicaoDeProdutosTela.java b/src/test/java/telas/FormularioAdicaoDeProdutosTela.java new file mode 100644 index 0000000..136f1e5 --- /dev/null +++ b/src/test/java/telas/FormularioAdicaoDeProdutosTela.java @@ -0,0 +1,39 @@ +package telas; + +import org.junit.jupiter.api.Assertions; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class FormularioAdicaoDeProdutosTela extends BaseTela { + + public FormularioAdicaoDeProdutosTela(WebDriver app) { + super(app); + } + + public FormularioAdicaoDeProdutosTela preencherNomeProduto(String produtoNome) { + app.findElement(By.id("com.lojinha:id/productName")).click(); + app.findElement(By.id("com.lojinha:id/productName")).findElement(By.id("com.lojinha:id/editText")).sendKeys(produtoNome); + return this; + } + + public FormularioAdicaoDeProdutosTela preencherValorProduto(String valorProduto) { + app.findElement(By.id("com.lojinha:id/productValue")).click(); + app.findElement(By.id("com.lojinha:id/productValue")).findElement(By.id("com.lojinha:id/editText")).sendKeys(valorProduto); + return this; + } + + public FormularioAdicaoDeProdutosTela preencherCoresProduto(String cores) { + app.findElement(By.id("com.lojinha:id/productColors")).click(); + app.findElement(By.id("com.lojinha:id/productColors")).findElement(By.id("com.lojinha:id/editText")).sendKeys(cores); + return this; + } + + public FormularioAdicaoDeProdutosTela submissaoComErro(){ + app.findElement(By.id("com.lojinha:id/saveButton")).click(); + return this; + } + + public String obterMensagemDeErro() { + return capturarToast(); + } +} diff --git a/src/test/java/telas/ListaDeProdutosTela.java b/src/test/java/telas/ListaDeProdutosTela.java new file mode 100644 index 0000000..6424c12 --- /dev/null +++ b/src/test/java/telas/ListaDeProdutosTela.java @@ -0,0 +1,15 @@ +package telas; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class ListaDeProdutosTela extends BaseTela { + + public ListaDeProdutosTela (WebDriver app) { + super (app); + } + public FormularioAdicaoDeProdutosTela abrirTelaAdicaoProduto () { + app.findElement(By.id("com.lojinha:id/floatingActionButton")).click(); + return new FormularioAdicaoDeProdutosTela(app); + } +} diff --git a/src/test/java/telas/LoginTela.java b/src/test/java/telas/LoginTela.java new file mode 100644 index 0000000..d6628e3 --- /dev/null +++ b/src/test/java/telas/LoginTela.java @@ -0,0 +1,29 @@ +package telas; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +public class LoginTela extends BaseTela { + + public LoginTela(WebDriver app) { + super (app); + } + + public LoginTela preencherUsuario(String usuario) { + app.findElement(By.id("com.lojinha:id/user")).click(); + app.findElement(By.id("com.lojinha:id/user")).findElement(By.id("com.lojinha:id/editText")).sendKeys(usuario); + return this; + } + + public LoginTela preencherSenha(String senha) { + app.findElement(By.id("com.lojinha:id/password")).click(); + app.findElement(By.id("com.lojinha:id/password")).findElement(By.id("com.lojinha:id/editText")).sendKeys(senha); + return this; + } + + public ListaDeProdutosTela submeterLogin() { + app.findElement(By.id("com.lojinha:id/loginButton")).click(); + return new ListaDeProdutosTela(app); + } + +}