Framework robusto de automação mobile para Android, aplicando pirâmide de testes, Page Object Model e melhores práticas de QA Engineering.
- Sobre o Projeto
- Arquitetura
- Tecnologias
- Pré-requisitos
- Instalação
- Execução dos Testes
- Estrutura do Projeto
- Relatórios
- Cobertura de Código
- CI/CD
- Roadmap
- Casos de Teste
- Autor
- Contribuindo
- Licença
- Agradecimentos
- Status do Projeto
Este projeto implementa um framework de automação mobile completo para testar o aplicativo Wikipedia (Android), seguindo as melhores práticas de mercado:
- Pirâmide de Testes: 70% unitários, 30% E2E
- Page Object Model (POM): Separação de responsabilidades
- Cobertura de Código: ≥80% via JaCoCo
- Gestão de Flakiness: Waits explícitos, retry mechanism
- Relatórios Visuais: Allure Report com screenshots
- CI/CD: GitHub Actions automatizado
Desenvolvimento de competências técnicas em QA Engineering e Test Automation, servindo como portfólio profissional.
/\
/ \
/E2E \ 7 testes críticos (Appium + TestNG)
/------\
/ \ (Conceitual - futuro)
/----------\
/ Unitários \ 10-15 testes (JUnit 5 + Mockito)
/--------------\
| Camada | Quantidade | Ferramenta | Foco |
|---|---|---|---|
| Unitários | 10-15 | JUnit 5 + Mockito | Commons/Actions, Helpers |
| Integração | 0 (futuro) | REST Assured | API Wikipedia (conceitual) |
| E2E | 7 | Appium + TestNG | Fluxos críticos de negócio |
- Java 17+ - Linguagem base
- Maven 3.9+ - Gerenciamento de dependências
- Appium 2.x - Automação mobile
- Appium Java Client 10.x - Bindings Java
- TestNG - Runner para testes E2E
- JUnit 5 - Testes unitários
- Mockito 5.x - Mocking para unitários
- JaCoCo 0.8.11 - Cobertura de código
- Allure 2.24+ - Relatórios visuais
- SLF4J + Logback - Logging estruturado
- GitHub Actions - Pipeline automatizado
- Android Emulator - Execução de testes
- SO: Windows 10+, macOS 11+, ou Linux (Ubuntu 20.04+)
- RAM: 8GB mínimo (16GB recomendado)
- Disco: 10GB livres
# Verificar instalação
java -version
javac -version
# Deve retornar: Java 17 ou superiorDownload: Oracle JDK ou OpenJDK
# Verificar instalação
mvn -version
# Deve retornar: Maven 3.9+Download: Apache Maven
# Verificar instalação
node -v
npm -v
# Deve retornar: Node 16+ e NPM 8+Download: Node.js
# Instalar globalmente
npm install -g appium
# Verificar instalação
appium -v
# Instalar driver UiAutomator2
appium driver install uiautomator2- Download: Android Studio
- Componentes necessários:
- Android SDK Platform 34 (API Level 34)
- Android SDK Build-Tools
- Android Emulator
- Android SDK Platform-Tools
Windows (PowerShell):
# JAVA_HOME
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-17", "Machine")
# ANDROID_HOME
[System.Environment]::SetEnvironmentVariable("ANDROID_HOME", "%LOCALAPPDATA%\Android\Sdk", "Machine")
# PATH (adicionar)
$env:Path += ";%JAVA_HOME%\bin;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools"macOS/Linux (Bash/Zsh):
# Adicionar ao ~/.bashrc ou ~/.zshrc
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/toolsgit clone https://github.com/spencerarq/appium-java-wikipedia-framework.git
cd appium-java-wikipedia-frameworkmvn clean install -DskipTests# Listar AVDs disponíveis
avdmanager list avd
# Criar novo AVD (Pixel 6a API 34)
avdmanager create avd \
-n Pixel_6a_API_34 \
-k "system-images;android-34;google_apis;x86_64" \
-d "pixel_6a"# Listar emuladores
emulator -list-avds
# Iniciar emulador
emulator -avd Pixel_6a_API_34 -no-snapshot-loadAguardar até o emulador inicializar completamente (~2-3 minutos).
# Download do APK (versão Alpha)
# Link: https://github.com/wikimedia/apps-android-wikipedia/releases
# Instalar no emulador
adb install wikipedia-alpha.apk
# Verificar instalação
adb shell pm list packages | grep wikipedia# Terminal separado
appium
# Deve exibir: [Appium] Welcome to Appium v2.x.xFluxo completo: Pesquisar "Appium" → Fechar banner → Selecionar resultado → Validar título
# Executar todos os testes unitários
mvn test -Dtest="**/*UnitTest"
# Executar teste específico
mvn test -Dtest="CommonActionsUnitTest"
# Com cobertura JaCoCo
mvn clean test jacoco:reportRelatório: target/site/jacoco/index.html
# Executar todos os testes E2E
mvn test -Pe2e-tests
# Executar suite smoke (rápido)
mvn test -Psmoke-tests
# Com relatório Allure
mvn clean test -Pe2e-tests allure:serveRelatório: Abre automaticamente no navegador
# Unitários + E2E + Relatórios
mvn clean test allure:serveappium-java-wikipedia-framework/
│
├── src/
│ ├── main/java/com/wikipedia/
│ │ ├── pages/ # Page Object Model
│ │ │ ├── SearchPage.java
│ │ │ ├── ArticlePage.java
│ │ │ ├── OnboardingPage.java
│ │ │ ├── SavedPage.java
│ │ │ └── SettingsPage.java
│ │ │
│ │ ├── commons/ # Ações reutilizáveis
│ │ │ ├── CommonActions.java
│ │ │ └── DriverFactory.java
│ │ │
│ │ └── utils/ # Utilitários
│ │ ├── ConfigReader.java
│ │ ├── TestHelper.java
│ │ └── LoggerHelper.java
│ │
│ └── test/java/com/wikipedia/
│ │ ├── unit/ # Testes Unitários (JUnit 5)
│ │ │ ├── CommonActionsUnitTest.java
│ │ │ ├── DriverFactoryUnitTest.java
│ │ │ ├── TestHelperUnitTest.java
│ │ │ ├── ConfigReaderUnitTest.java
│ │ │ └── LoggerHelperUnitTest.java
│ │ │
│ │ ├── e2e/ # Testes E2E (TestNG)
│ │ │ ├── TC01_SearchArticleE2ETest.java
│ │ │ ├── TC02_NoResultsE2ETest.java
│ │ │ ├── TC03a_SaveArticleE2ETest.java
│ │ │ ├── TC03b_RemoveArticleE2ETest.java
│ │ │ ├── TC04_ChangeLanguageE2ETest.java
│ │ │ ├── TC05_BackgroundE2ETest.java
│ │ │ ├── TC06_RotationE2ETest.java
│ │ │ └── TC07_ScrollE2ETest.java
│ │ │
│ │ ├── integration/ # Testes Integração
│ │ │ └── driver/
│ │ │ └── DriverFactoryIntegrationTest.java
│ │ │
│ │ └── listeners/ # Listeners TestNG
│ │ └── VideoRecordingListener.java
│ │
│ └── resources/
│ ├── config.properties # Configurações do projeto
│ ├── testng.xml # Suite completa
│ ├── testng-smoke.xml # Suite smoke
│ └── allure.properties # Configurações Allure
│
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions pipeline
│
├── pom.xml # Dependências Maven
├── .gitignore
├── README.md # Este arquivo
└── LICENSE
Visualização completa dos testes E2E:
- Status de execução (Passed/Failed/Skipped)
- Screenshots em falhas
- Logs detalhados
- Tempo de execução
- Histórico de execuções
Gerar e visualizar:
mvn clean test -Pe2e-tests allure:serveCobertura de código do framework:
- Cobertura de instrução (≥80%)
- Cobertura de branches
- Análise por pacote/classe
Gerar relatório:
mvn clean test jacoco:reportAbrir: target/site/jacoco/index.html
| Camada | Meta | Medição |
|---|---|---|
| Commons/Actions | ≥80% | JaCoCo |
| Utils (ConfigReader, TestHelper) | ≥80% | JaCoCo |
| Page Objects | N/A | Coberto por testes E2E |
# Executar testes unitários com cobertura
mvn clean test jacoco:report
# Verificar se atingiu a meta (falha se <80%)
mvn jacoco:checkPipeline automatizado em cada push/PR:
- Build do projeto (Maven)
- Testes unitários (JUnit 5)
- Verificação de cobertura (JaCoCo)
- Testes E2E (Appium + Emulador)
- Geração de relatórios (Allure)
- Deploy de relatórios (GitHub Pages)
Status do Build:
Configuração: .github/workflows/ci.yml
- Setup do projeto Maven
- Implementação do POM
- Commons/Actions
- Testes unitários (10-15)
- TC01 - Pesquisa de Artigo (E2E) ✅ Implementado
- TC02 - Pesquisa sem Resultados (E2E) ✅ Implementado
- TC03a - Salvar Artigo (E2E)
- TC03b - Remover Artigo (E2E)
- TC04 - Alterar Idioma (E2E)
- TC05 - Background/Foreground (E2E)
- TC06 - Rotação de Tela (E2E)
- TC07 - Scroll (E2E)
- JaCoCo + Allure
- GitHub Actions
- Testes de integração (API Wikipedia)
- Paralelização de testes
- Suporte a múltiplos devices (BrowserStack)
- Testes de acessibilidade
- Visual regression testing
- Integração com Jira/TestRail
- Docker para ambiente isolado
- AI-powered test generation
- Performance testing (K6/JMeter)
| ID | Cenário | Tipo | Prioridade | Status |
|---|---|---|---|---|
| TC01 | Pesquisar e visualizar artigo "Appium" | Positivo | P0 | ✅ Implementado |
| TC02 | Pesquisa sem resultados (UUID dinâmico) | Negativo | P1 | ✅ Implementado |
| TC03a | Salvar artigo "Java" | Positivo | P0 | ⏳ Pendente |
| TC03b | Remover artigo "Java" | Positivo | P0 | ⏳ Pendente |
| TC04 | Alterar idioma para Espanhol | Positivo | P1 | ⏳ Pendente |
| TC05 | App retorna do background | Positivo | P1 | ⏳ Pendente |
| TC06 | Rotação de tela durante pesquisa | Positivo | P2 | ⏳ Pendente |
| TC07 | Scroll em artigo longo | Positivo | P2 | ⏳ Pendente |
| ID | Classe | Método | Status |
|---|---|---|---|
| UT01 | CommonActions | waitForElementVisible | ✅ |
| UT02 | CommonActions | clickElement | ✅ |
| UT03 | CommonActions | inputText | ✅ |
| UT04 | CommonActions | getTextFromElement | ✅ |
| UT05 | CommonActions | swipe | ✅ |
| UT06 | DriverFactory | initializeAndroidDriver | ✅ |
| UT07 | DriverFactory | quitDriver | ✅ |
| UT08 | TestHelper | takeScreenshot | ✅ |
| UT09 | ConfigReader | getProperty | ✅ |
| UT10 | LoggerHelper | logInfo | ✅ |
Encontrou um bug? Abra uma issue com:
- Título: Descrição curta do problema
- Descrição: Passos para reproduzir
- Esperado vs Atual: O que deveria acontecer vs o que aconteceu
- Ambiente: SO, versão do Java, Appium, etc.
- Screenshots: Se aplicável
- Plano de Testes Completo
- Guia de Contribuição - em construção
- Arquitetura Detalhada - em construção
- FAQ - em construção
[RENATO SPENCER]
- 💼 LinkedIn: https://www.linkedin.com/in/renatospencer/
- 🎯 GitHub: github.com/spencerarq
Contribuições são bem-vindas! Veja CONTRIBUTING.md para detalhes.
Passos básicos:
- Fork o projeto
- Crie uma branch (
git checkout -b feature/NovaFuncionalidade) - Commit suas mudanças (
git commit -m 'Adiciona nova funcionalidade') - Push para a branch (
git push origin feature/NovaFuncionalidade) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja LICENSE para mais detalhes.
- Appium - Framework de automação mobile
- TestNG - Test runner
- Allure - Relatórios visuais
- JaCoCo - Cobertura de código
- Wikipedia - App de testes
Se este projeto te ajudou, considere dar uma ⭐!
Made with lots of coffee by Renato Spencer
