🔺 Pirâmides de Teste
As pirâmides de teste definem estratégias para distribuir diferentes tipos de testes. Entender esses conceitos é fundamental para aplicar qualidade de software de forma eficiente, otimizando custo, velocidade e confiabilidade.
🔺 Pirâmide Tradicional
Base larga de testes unitários, menos integração e poucos End-to-End. Abordagem clássica e equilibrada.
- Rápida execução e feedback
- Baixo custo de manutenção
- Fácil paralelização
- Ideal para projetos bem estruturados
🔺 Pirâmide Moderna
Foco maior em unitários (70%), integração robusta por APIs (20%) e mínimo de E2E (10%). Recomendada pelo ISTQB.
- Prioriza rapidez e confiabilidade
- Perfeita para CI/CD
- Releases frequentes
- Cobertura otimizada
🔺 Pirâmide Front-end
Componentes como base, integração para juntar peças, E2E para fluxos críticos de usuário.
- Testa isolamento de componentes
- Mocks para integrações externas
- Evita excesso de testes UI
- Feedback rápido no desenvolvimento
🔺 Pirâmide Back-end / APIs
Unit tests para lógica de negócio, contratos para integração e E2E para verificação completa.
- Contract Testing fundamental
- Testa regras de negócio isoladas
- Integração entre microsserviços
- Validação de contratos de API
💎 Diamante
Maior foco em integração (centro robusto) com suporte de unit tests acima e abaixo.
- Usado quando integração é crítica
- Sistemas altamente acoplados
- Microsserviços com muitas dependências
- Valida comunicação entre serviços
⚠️ Pirâmide Invertida (Anti-padrão)
EVITAR! Inverte a recomendação — muito frágil, lento e custoso de manter.
- Execução muito lenta (horas)
- Testes frágeis e instáveis (flaky)
- Difícil identificar causa raiz
- Alto custo de manutenção
⚠️ Relógio de Areia
ATENÇÃO! Cobertura de integração fraca — problemas entre serviços passam despercebidos.
- Falhas em produção por integração
- Gargalo na camada de integração
- Defeitos não detectados entre módulos
- Dificulta refatoração
⚠️ Cone de Sorvete
PROBLEMA! Excesso de testes manuais e E2E no topo, base fraca de automação.
- Dependência excessiva de testes manuais
- Lançamentos lentos
- Feedback tardio sobre defeitos
- Custo alto de recursos humanos
✔ Fazer
- ✔ 70% de testes unitários rápidos
- ✔ 20% de testes de integração/API
- ✔ 10% de testes E2E críticos
- ✔ Execução em menos de 10 minutos
- ✔ Testes confiáveis e determinísticos
- ✔ Feedback rápido no CI/CD
✗ Evitar
- ✗ Excesso de testes E2E lentos
- ✗ Testes frágeis (flaky tests)
- ✗ Dependência de testes manuais
- ✗ Pouca cobertura de integração
- ✗ Execução que leva horas
- ✗ Testes não-determinísticos
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst)
📦 Page Object Model (POM)
LEGENDA DE CORES
Cenários e assertions
Elementos e ações
Aplicação real
- Describe/It blocks
- Assertions (expect)
- Setup e teardown
- Locators encapsulados
- Métodos de ação
- Reutilização de código
- Auto Avaliar
- Ambientes (DEV/HML/PROD)
- Interface real
📁 autoavaliar-pom/ │ ├── 📁 src/ │ │ │ ├── 📁 pages/ ← Page Objects │ │ │ │ │ ├── 📁 common/ ← Páginas compartilhadas │ │ │ ├── BasePage │ │ │ ├── LoginPage │ │ │ └── HeaderComponent │ │ │ │ │ ├── 📁 adm-new/ │ │ │ └── DashboardPage │ │ │ │ │ ├── 📁 adm-legado/ │ │ │ └── DashboardPage │ │ │ │ │ ├── 📁 b2b/ │ │ │ └── DashboardPage │ │ │ │ │ ├── 📁 car-invest/ │ │ │ └── DashboardPage │ │ │ │ │ └── 📁 auto-sync/ │ │ └── DashboardPage │ │ │ ├── 📁 specs/ ← Arquivos de teste │ │ ├── 📁 adm-new/ │ │ │ ├── login.spec │ │ │ └── dashboard.spec │ │ │ │ │ ├── 📁 adm-legado/ │ │ │ ├── login.spec │ │ │ └── dashboard.spec │ │ │ │ │ ├── 📁 b2b/ │ │ │ ├── login.spec │ │ │ └── dashboard.spec │ │ │ │ │ ├── 📁 car-invest/ │ │ │ ├── login.spec │ │ │ └── dashboard.spec │ │ │ │ │ └── 📁 auto-sync/ │ │ ├── login.spec │ │ └── dashboard.spec │ │ │ ├── 📁 support/ ← Helpers e utilitários │ │ ├── api-client │ │ ├── db-utils │ │ └── test-helpers │ │ │ └── 📁 utils/ ← Funções auxiliares │ ├── date-helper │ ├── string-helper │ └── validation-helper │ ├── 📁 config/ ← Configurações por ambiente │ ├── dev.config │ ├── hml.config │ └── prod.config │ ├── 📁 fixtures/ ← Dados de teste (massa) │ ├── usuarios.json │ └── produtos.json │ └── README.md
describe('Login - B2B', () => {
let loginPage: LoginPage;
let dashboardPage: DashboardPage;
beforeEach(() => {
loginPage = new LoginPage(page);
dashboardPage = new DashboardPage(page); });
it('deve realizar login com sucesso', async () => {
// Arrange
await loginPage.navegar();
// Act
await loginPage.realizarLogin('usuario@email.com', 'senha123');
// Assert
const mensagem = await dashboardPage.obterMsgBoasVindas();
expect(mensagem).toContain('Bem-vindo');
}); });
✔ Princípios
- ✔ Uma classe por página/componente
- ✔ Encapsular locators como privados
- ✔ Métodos públicos representam ações do usuário
- ✔ Herança para comportamentos comuns
- ✔ Composição para componentes reutilizáveis
- ✔ Nomes descritivos e significativos
✗ Anti-padrões
- ✗ Assertions dentro das Page Objects
- ✗ Locators expostos publicamente
- ✗ Classes muito grandes (God Object)
- ✗ Duplicação de código entre páginas
- ✗ Lógica de teste na Page Object
- ✗ Dependências circulares entre páginas
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst)
🥒 BDD - Behavior Driven Development
LEGENDA DE CORES
PO/QA escrevem
QA implementa
Abstração UI
Auto Avaliar
- Dado/Quando/Então
- Legível pelo negócio
- Documentação viva
- Given/When/Then
- Conecta Gherkin ao código
- Reutilizável entre features
- Mesma estrutura do POM
- Encapsula elementos
- Métodos de ação
- Auto Avaliar
- ADM, B2B, Car Invest...
- Ambiente real
@tagExemplo
Funcionalidade: Login no Sistema
Como um usuário do sistema
Eu quero realizar login
Para acessar o dashboard
Cenário: Login com credenciais válidas
Dado que estou na página de login
Quando eu informo o email "usuario@email.com"
E eu informo a senha "Senha@123"
E eu clico no botão "Entrar"
Então devo ser redirecionado para o dashboard
Funcionalidade: Dashboard do Sistema
Como um usuário autenticado
Eu quero visualizar o dashboard
Para acompanhar as informações do sistema
Contexto:
Dado que estou logado no sistema
E estou na página do dashboard
Cenário: Visualizar cards de resumo
Então devo ver os cards de resumo
E devo ver o menu lateral
Cenário: Navegar pelo menu
Quando eu clico no menu "Relatórios"
Então devo ser redirecionado para a página de relatórios
@tagExemplo
Funcionalidade: Login com múltiplos usuários
Esquema do Cenário: Login em múltiplos ambientes
Dado que estou no ambiente "<ambiente>"
Quando eu faço login com "<email>" e "<senha>"
Então devo acessar o dashboard
E devo ver a mensagem "<mensagem>"
Exemplos:
DEV | dev@autoavaliar.com | Dev@123 | Bem-vindo, Dev
HML | hml@autoavaliar.com | Hml@123 | Bem-vindo, HML
PROD | prod@autoavaliar.com | Prod@123 | Bem-vindo, Prod
Funcionalidade: Validação de Dashboard
Cenário: Verificar informações do dashboard
Dado que estou logado como administrador
Quando eu acesso o dashboard
Então devo ver os seguintes cards:
Total de Usuários | Maior que 0
Vendas do Mês | Maior que 0
Tickets Abertos | Qualquer
Avaliações | Maior que 0
Funcionalidade: Integração com API
Cenário: Enviar dados para API
Dado que estou autenticado na API
Quando eu envio uma requisição POST com o payload:
"""
{
"usuario": "teste@autoavaliar.com",
"acao": "criar_avaliacao",
"dados": {
"veiculo_id": 12345,
"valor": 50000
  }
}
"""
Então devo receber status code "201"
E a resposta deve conter "sucesso"
📁 autoavaliar-bdd/ │ ├── 📁 features/ ← Arquivos feature │ │ │ └── 📁 brasil/ ← PILOTO - Brasil primeiro │ │ │ ├── 📁 adm-new/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 adm-legado/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 b2b/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 car-invest/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ └── 📁 auto-sync/ │ ├── login.feature │ └── dashboard.feature │ ├── 📁 steps/ ← Definições de Passos │ │ │ ├── 📁 common/ ← Steps reutilizáveis │ │ ├── login.steps │ │ └── navegacao.steps │ │ │ ├── 📁 adm-new/ │ │ └── dashboard.steps │ │ │ ├── 📁 adm-legado/ │ │ └── dashboard.steps │ │ │ ├── 📁 b2b/ │ │ └── dashboard.steps │ │ │ ├── 📁 car-invest/ │ │ └── dashboard.steps │ │ │ └── 📁 auto-sync/ │ └── dashboard.steps │ ├── 📁 pages/ ← Page Objects (padrão POM) │ ├── 📁 common/ │ │ ├── BasePage │ │ ├── LoginPage │ │ └── HeaderComponent │ │ │ ├── 📁 adm-new/ │ │ └── DashboardPage │ │ │ ├── 📁 adm-legado/ │ │ └── DashboardPage │ │ │ ├── 📁 b2b/ │ │ └── DashboardPage │ │ │ ├── 📁 car-invest/ │ │ └── DashboardPage │ │ │ └── 📁 auto-sync/ │ └── DashboardPage │ ├── 📁 support/ ← Configuração e Hooks │ ├── world ← Contexto global │ ├── hooks ← Before/After hooks │ └── reporter ← Configuração de relatórios │ ├── 📁 fixtures/ ← Dados de teste │ ├── usuarios.json │ └── produtos.json │ ├── 📁 config/ ← Configurações por ambiente │ ├── dev.config │ ├── hml.config │ └── prod.config │ └── README.md
// Step Definition - login.steps import { Given, When, Then } from '@cucumber/cucumber'; import { LoginPage } from '../pages/common/LoginPage'; import { DashboardPage } from '../pages/common/DashboardPage'; let loginPage: LoginPage; let dashboardPage: DashboardPage; Given('que estou na página de login', async function() { loginPage = new LoginPage(this.page); await loginPage.navegar(); }); When('eu informo o email {string}', async function(email: string) { await loginPage.preencherEmail(email); }); When('eu informo a senha {string}', async function(senha: string) { await loginPage.preencherSenha(senha); }); When('eu clico no botão {string}', async function(botao: string) { await loginPage.clicarBotao(botao); }); Then('devo ser redirecionado para o dashboard', async function() { dashboardPage = new DashboardPage(this.page); await dashboardPage.aguardarCarregamento(); expect(await dashboardPage.estaVisivel()).toBe(true); });
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst)
⚡ Framework Híbrido: BDD + POM
LEGENDA DE CORES
Linguagem de Negócio
Implementação
Elementos e Ações
Auto Avaliar
- Linguagem natural
- PO/QA/DEV colaboram
- Documentação viva
- Given/When/Then
- Reutilização entre features
- Orquestração de ações
- Locators encapsulados
- Métodos de ação
- Reutilização máxima
- Auto Avaliar
- DEV / HML / PROD
- Todos os projetos
📁 autoavaliar-automation/ │ ├── 📁 features/ ← Cenários em BDD │ │ │ └── 📁 brasil/ ← PILOTO │ │ │ ├── 📁 adm-new/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 adm-legado/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 b2b/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ ├── 📁 car-invest/ │ │ ├── login.feature │ │ └── dashboard.feature │ │ │ └── 📁 auto-sync/ │ ├── login.feature │ └── dashboard.feature │ ├── 📁 steps/ ← Definições de Passos │ │ │ ├── 📁 common/ ← Steps reutilizáveis │ │ ├── login.steps │ │ └── navegacao.steps │ │ │ ├── 📁 adm-new/ │ │ └── dashboard.steps │ │ │ ├── 📁 adm-legado/ │ │ └── dashboard.steps │ │ │ ├── 📁 b2b/ │ │ └── dashboard.steps │ │ │ ├── 📁 car-invest/ │ │ └── dashboard.steps │ │ │ └── 📁 auto-sync/ │ └── dashboard.steps │ ├── 📁 pages/ ← Page Objects │ │ │ ├── 📁 common/ │ │ ├── BasePage ← Classe abstrata base │ │ ├── LoginPage │ │ └── HeaderComponent │ │ │ ├── 📁 adm-new/ │ │ └── DashboardPage │ │ │ ├── 📁 adm-legado/ │ │ └── DashboardPage │ │ │ ├── 📁 b2b/ │ │ └── DashboardPage │ │ │ ├── 📁 car-invest/ │ │ └── DashboardPage │ │ │ └── 📁 auto-sync/ │ └── DashboardPage │ ├── 📁 support/ ← Configurações e Hooks │ ├── world ← Contexto global │ ├── hooks ← Before/After │ └── reporter ← Relatórios │ ├── 📁 fixtures/ ← Dados de teste (massa) │ ├── usuarios.json │ └── produtos.json │ ├── 📁 config/ ← Configurações por ambiente │ ├── dev.config │ ├── hml.config │ └── prod.config │ └── README.md
Fluxo completo: Feature → Step → Page Object → Sistema 1. FEATURE (login.feature) Cenário: Login com sucesso Dado que estou na página de login Quando eu informo credenciais válidas Então devo acessar o dashboard 2. STEP DEFINITION (login.steps) Given('que estou na página de login', async function() { await loginPage.navegar(); }); When('eu informo credenciais válidas', async function() { await loginPage.realizarLogin(usuario, senha); }); Then('devo acessar o dashboard', async function() { expect(await dashboardPage.estaVisivel()).toBe(true); }); 3. PAGE OBJECT (LoginPage) class LoginPage extends BasePage { async realizarLogin(email, senha) { await this.preencher(this.inputEmail, email); await this.preencher(this.inputSenha, senha); await this.clicar(this.btnEntrar); } }
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst)
⚖️ Comparativo das Arquiteturas
LEGENDA DE CORES
Page Object Model
- ✔ Código limpo e organizado
- ✔ Ideal para times técnicos
- ✔ Menor overhead de arquivos
- ✔ Debug mais direto
- ✔ Curva de aprendizado menor
- ✗ PO não consegue ler testes
- ✗ Documentação separada
BDD
- ✔ Documentação viva em BDD
- ✔ PO/QA/DEV colaboram
- ✔ Testes legíveis por não-técnicos
- ✔ Ótimo para testes de aceitação
- ✗ Mais arquivos para manter
- ✗ Steps podem virar "spaghetti"
Híbrido (BDD + POM)
- ✔ Melhor dos dois mundos
- ✔ Documentação + Organização
- ✔ Escalável para grandes projetos
- ✔ Reutilização máxima de código
- ✔ Colaboração entre áreas
- ✗ Complexidade inicial maior
- ✗ Requer mais treinamento
POM
- Time 100% técnico
- Projetos menores
- Prototipagem rápida
- Foco em velocidade
- Sem documentação de negócio
BDD
- Colaboração com PO/negócio
- Documentação é prioridade
- Testes de aceitação
- Cenários data-driven
- Auditorias e compliance
Híbrido
- Projetos corporativos
- Times mistos
- Escalabilidade necessária
- Múltiplos produtos/países
- Auto Avaliar ✓
POM
BDD
Híbrido (Recomendado)
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst)
🍊 Orange Testing - Arquitetura Proposta
LEGENDA DE CORES
CATEGORIZAÇÃO DE TESTES (ISTQB)
🔥 Smoke Tests
- Quando: Após cada deploy em produção
- Cobertura: 5-10% dos casos (críticos)
- Tempo: < 10 minutos
- Escopo: Fluxos críticos do negócio
🔄 Regression
- Quando: Diariamente (execução automática)
- Cobertura: 60-70% dos casos
- Tempo: 4-8 horas
- Escopo: Todos os fluxos principais
🔗 Integration
- Quando: Por demanda ou pré-deploy
- Cobertura: 20-30% dos casos
- Tempo: 2-4 horas
- Escopo: Comunicação entre sistemas
Cenário BDD
Ações encapsuladas
Aplicação real
- [Tipo] - [Módulo] - [Cenário] (ID)
- Smoke/Regression/Integration
- Passo-a-passo sequencial
- [Módulo] - [Página] - [Ação]
- Biblioteca de componentes
- Ações encapsuladas
- Auto Avaliar (todos os módulos)
- Ambientes (DEV/HML/PROD)
- Execução via bot
✔ Casos de Teste
- ✔ Sempre incluir: [ID] - [Tipo] - [Módulo] - [Descrição]
- ✔ ID único por módulo: [ADM-001], [USBI-001], [B2B-001]
- ✔ [ADM-001] - [Smoke] - [B2B] - [Login com credenciais válidas] (ADM-001)
- ✔ [USBI-001] - [Regression] - [USBI] - [Visualizar dashboard principal]
- ✔ [ADM-001] - [Integration] - [ADM] - [Sincronizar dados com API X - Y]
✔ Predefinições (Page Objects)
- ✔ Sempre incluir: [Módulo] - [Página] - [Ação]
- ✔ Common para componentes compartilhados
- ✔ [ADM] - [Login] - [Preencher Credenciais]
- ✔ [USBI] - [Dashboard] - [Validar Cards]
- ✔ [Common] - [Header] - [Realizar Logout]
EXEMPLO PRÁTICO - PADRÃO AAA (ARRANGE / ACT / ASSERT)
📋 Informações do Caso de Teste
📚 Predefinições (Page Objects)
Preparar o ambiente e os dados necessários para o teste
1.1 - Predefinição: ADM - Login - Navegar
→ Abre o navegador
→ Acessa: https://exemplo@exemplo.com/
→ Aguarda página carregar completamente
1.2 - Massa de Dados:
→ Email: "user@user.com.br"
→ Senha: "user@123"
→ Ambiente: Homologação (Brasil)
Executar a ação que está sendo testada
2.1 - Predefinição: B2B - Login - Preencher Credenciais
→ Localiza campo "Email"
→ Preenche: "user@user.com.br"
→ Localiza campo "Senha"
→ Preenche: "user@123"
→ Localiza botão "Entrar"
→ Clica no "Botão"
→ Aguarda redirecionamento
Verifica o resultado esperado
3.1 - Validações: B2B - Dashboard - Validar Acesso
→ Verifica se URL contém: "/dashboard"
→ Verifica se elemento "Menu Lateral" está visível
→ Verifica se texto contém: "Bom dia User,"
3.2 - Validações Adicionais:
→ Status HTTP = 200 OK
→ Token de autenticação foi gerado
→ Menu lateral carregou 5 itens
Login realizado com sucesso, usuário redirecionado para dashboard e todas as validações passaram.
✔ FAZER
- ✔ Criar UMA predefinição por página/componente
- ✔ Reutilizar predefinições entre casos de teste
- ✔ Usar nomenclatura BDD nos passos (Dado/Quando/Então)
- ✔ Manter predefinições Common para componentes compartilhados
- ✔ Incluir ID único em cada caso de teste
- ✔ Documentar massa de dados necessária
- ✔ Organizar por: Produto → País → Módulo → Casos
✗ NÃO FAZER
- ✗ Duplicar predefinições com nomes diferentes
- ✗ Criar casos de teste sem padrão de qualidade
- ✗ Misturar lógica de negócio nas predefinições
- ✗ Usar nomes genéricos (Teste1, Teste2)
- ✗ Criar testes sem reutilizar predefinições
- ✗ Ignorar a hierarquia Produto/País/Módulo
- ✗ Colocar validações fixas nas predefinições
📁 Orange Testing - Auto Avaliar/ │ ├── 📁 Brasil/ │ │ │ ├── 📁 B2B/ │ │ ├── 📁 ADM-New/ │ │ │ ├── 🔐 ADM - Login - Navegar │ │ │ ├── 🔐 ADM - Login - Preencher Credenciais │ │ │ ├── 🏠 ADM - Dashboard - Validar Menu │ │ │ ├── 👤 ADM - Usuários - Criar Usuário │ │ │ └── 👤 ADM - Usuários - Validar Cadastro │ │ │ │ │ └── 📁 ADM-Legado/ │ │ ├── 🔐 ADM-Legado - Login - Preencher │ │ └── 🏠 ADM-Legado - Home - Validar │ │ │ └── 📁 USBI/ │ ├── 🔐 USBI - Login - Autenticar │ ├── 🏠 USBI - Home - Navegar │ └── 📊 USBI - Avaliações - Filtrar │ ├── 📁 Argentina/ │ └── 📁 B2B/ │ └── ← Mesma estrutura do Brasil │ └── 📁 Common/ (Compartilhado) ├── 🔧 Common - Header - Abrir Menu ├── 🔧 Common - Header - Logout ├── 🔧 Common - Modal - Confirmar ├── 🔧 Common - Modal - Cancelar ├── 🔧 Common - Toast - Validar Sucesso └── 🔧 Common - Toast - Validar Erro
PLANO DE IMPLEMENTAÇÃO
🎯 Fase 1: Criação da Base
- 1.1 Limpeza de base mantendo apenas o que está sendo executado atualmente
- 1.2 Criar hierarquia: Produto → Países → Módulos no Orange Testing
- 1.3 Criar predefinições de Login para cada módulo (B2B, USBI, ADM)
- 1.4 Criar predefinições Common (Header, Modal, Toast, Navegação)
- 1.5 Criar weebhooks para jira e teams para reports e criação de cards com criticidade (Definir)
- 1.6 Configurar padrões de qualidade (Smoke, Regression, Integration)
🔥 Fase 2: Smoke Tests
- 2.1 Criar 5-10 casos Smoke críticos por módulo
- 2.2 Validar execução em produção (< 10 min)
- 2.3 Configurar alertas para falhas em Smoke
- 2.4 Treinar time sobre estrutura Smoke
🔄 Fase 3: Regression
- 3.1 Criar casos Regression por módulo (Entender e difinir cenários)
- 3.2 Expandir biblioteca de predefinições conforme necessário
- 3.3 Configurar execução diária automática
- 3.4 Eliminar duplicidades e padronizar nomenclatura
🔗 Fase 4: Integration
- 4.1 Identificar integrações críticas (APIs, Webhooks)
- 4.2 Criar casos Integration para sincronizações
- 4.3 Validar comunicação entre módulos
- 4.4 Configurar execução sob demanda
✅ Fase 5: Governança
- 5.1 Revisar casos de teste mensalmente
- 5.2 Atualizar predefinições conforme mudanças no sistema
- 5.3 Monitorar métricas (cobertura, tempo de execução, falhas)
- 5.4 Evoluir arquitetura conforme necessidade do negócio
ISTQB Foundation Level • ISTQB CTAL-TA (Test Automation Engineer) • ISTQB CTAL-TTA (Technical Test Analyst) • Orange Testing Platform