DevOps ‐ Integration Testing - iNineBD/Track-5Sem2025Main GitHub Wiki
Este documento descreve as diretrizes para a implementação de testes de integração na aplicação.
- O teste de integração deve validar a interação entre múltiplos métodos, camadas ou serviços (ex: página + store + plugin + chamada à API).
- O teste de integração deve ser criado antes ou no início da sprint, junto à definição da funcionalidade ou user story.
- Deve ser executado durante a sprint para identificar problemas na aplicação.
- Deve ser implementado pelo QA.
| Critério | Exemplo |
|---|---|
| Objetivo | Verificar se o método login está funcionando corretamente |
| Entrada esperada | Usuário criado no banco com email e senha válidos |
| Resultado esperado | Login bem sucedido |
| Responsável pelo teste | O responsável pelo teste será sempre um QA definido ao identificar a necessidade de um teste de integração |
- O foco do teste de integração é validar métodos reais do sistema, verificando se eles funcionam corretamente em conjunto.
- Isso inclui métodos que executam ações completas, como autenticar, buscar dados, criar registros, navegar entre páginas.
- Para garantir eficácia e automação, deve-se usar ferramentas específicas de testes de integração.
- No seu caso, conforme solicitado, a ferramenta escolhida é o Selenium, que simula interações reais do usuário no navegador.
- Os testes de integração devem ser aplicados preferencialmente por um profissional de QA ou um desenvolvedor designado com conhecimento em testes.
- Isso assegura que os testes sejam completos, claros e mantenham a qualidade do sistema.
- O teste de integração deve ser criado antes da Sprint ou no início dela, durante o planejamento da user story ou da funcionalidade.
- Isso permite que os testes guiem o desenvolvimento e validem o que está sendo construído.
- O teste deve ser executado durante toda a Sprint.
- Executar o teste apenas no final da Sprint é arriscado, pois erros ou problemas podem ser descobertos tardiamente, atrasando entregas.
- O teste de integração serve para identificar problemas cedo e garantir qualidade contínua.
- Google Chrome instalado.
- ChromeDriver rodando localmente:
chromedriver --port=9515- Instale o pacote Selenium para Go:
go get github.com/tebeka/selenium- Base
package main
import (
"fmt"
"log"
"time"
"github.com/tebeka/selenium"
)
const port = 9515 // Porta padrão do ChromeDriver- Função principal: main()
func main() {
// Define o navegador (Chrome) para o Selenium usar
caps := selenium.Capabilities{"browserName": "chrome"}
// Conecta ao ChromeDriver rodando localmente
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d", port))
if err != nil {
log.Fatalf("Erro ao conectar no WebDriver: %v", err)
}
defer wd.Quit() // Fecha o navegador ao final do teste- Função utilitária: waitElementReady
// Espera até que o elemento esteja visível e clicável
func waitElementReady(wd selenium.WebDriver, selector string, timeout time.Duration) (selenium.WebElement, error) {
var elem selenium.WebElement
var err error
tries := int(timeout.Milliseconds() / 200) // divide o timeout em vários pequenos intervalos
for i := 0; i < tries; i++ {
// Tenta encontrar o elemento na página usando um seletor CSS
elem, err = wd.FindElement(selenium.ByCSSSelector, selector)
if err == nil {
displayed, _ := elem.IsDisplayed()
enabled, _ := elem.IsEnabled()
if displayed && enabled {
return elem, nil // Sucesso: elemento visível e interativo
}
}
time.Sleep(200 * time.Millisecond) // Espera um pouco antes de tentar de novo
}
return nil, fmt.Errorf("elemento %s não ficou disponível após %.0f segundos", selector, timeout.Seconds())
}- Acessa uma página
err = wd.Get("http://localhost:3000/login") // Abre a página de login
if err != nil {
log.Fatalf("Erro ao acessar a página de login: %v", err)
}- Preenche o formulário
// Preenche o campo de e-mail
emailInput, err := waitElementReady(wd, "[data-testid='email']", 5*time.Second)
if err != nil {
log.Fatalf("Erro ao encontrar input de email: %v", err)
}
emailInput.SendKeys("[email protected]")
// Preenche o campo de senha
passwordInput, err := waitElementReady(wd, "[data-testid='password']", 5*time.Second)
if err != nil {
log.Fatalf("Erro ao encontrar input de senha: %v", err)
}
passwordInput.SendKeys("123456")- Clica no botão e valida o resultado
// Clica no botão de login
loginBtn, err := waitElementReady(wd, "button[type='submit']", 5*time.Second)
if err != nil {
log.Fatalf("Erro ao encontrar botão de login: %v", err)
}
loginBtn.Click()
// Espera o redirecionamento acontecer
time.Sleep(2 * time.Second)
// Verifica se a URL atual é a página inicial (home)
url, _ := wd.CurrentURL()
if url == "http://localhost:3000/" {
fmt.Println("✅ Login bem-sucedido.")
} else {
log.Fatalf("❌ Login falhou. URL atual: %s", url)
}
}- Rode a aplicação seguindo a documentação Product Documentation
- Inicie o ChromeDriver:
chromedriver --port=9515- Rode o teste:
go run tests/integration/*.go- Selenium: https://www.selenium.dev/
- ChromeDriver: https://chromedriver.chromium.org/downloads