DevOps ‐ Integration Testing - iNineBD/Track-5Sem2025Main GitHub Wiki

Testes de Integração

Este documento descreve as diretrizes para a implementação de testes de integração na aplicação.

1. Diretrizes Gerais

  • 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.

2. Exemplo de caso de teste - Login

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

3. Teste de Integração Deve Testar um ou mais Métodos

  • 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.

4. Tecnologia Específica para Teste de Integração

  • 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.

5. Responsabilidade de Aplicação do Teste

  • 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.

6. Momento de Criação do Teste

  • 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.

7. Momento de Execução do Teste

  • 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.

8. Como Fazer um Teste de Integração com Selenium (Go)

Pré-requisitos

  1. Google Chrome instalado.
  2. ChromeDriver rodando localmente:
chromedriver --port=9515
  1. Instale o pacote Selenium para Go:
go get github.com/tebeka/selenium

Como implemtar:

  • 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)
	}
}

Como executar

chromedriver --port=9515
  • Rode o teste:
go run tests/integration/*.go

9. Referências


⚠️ **GitHub.com Fallback** ⚠️