1

Pitch: Optics: testes end-to-end open source para Android, iOS, web e TV, escritos em CSV

Trabalho no Optics, então leve isso em conta. Mesmo assim, quero mostrar como ele funciona na prática, com um teste rodado de verdade, e ouvir a opinião de vocês.

O problema

Um designer troca "Entrar" por "Fazer login", ou alguém renomeia o id de um botão num refactor. A bateria noturna quebra, mesmo com o app funcionando, e alguém passa a manhã seguinte atualizando seletores.

Times mobile também costumam escrever o mesmo fluxo três vezes: para Android, iOS e web. E muitas ferramentas novas de teste com IA colocam um modelo para decidir cada passo de cada execução. Cada execução custa dinheiro e pode seguir um caminho diferente.

O que é o Optics

O Optics é um framework de automação de testes open source (Apache 2.0). Não tem versão paga, não pede conta e não envia telemetria. Roda na sua máquina ou no seu CI.

  • O teste é um arquivo CSV ou YAML. Cada linha é uma ação que uma pessoa faz no app.
  • Quem controla o dispositivo é o driver que você já usa: Appium, Playwright ou Selenium.
  • Cada elemento pode ter vários localizadores. O Optics tenta um por um: XPath, texto na árvore de UI, OCR na captura de tela e, por fim, comparação de imagem.
  • O mesmo formato roda em Android, iOS, web, Android TV, Samsung Tizen e LG webOS.

Rodando em 4 comandos

Testei com o Optics 1.11.0, no macOS, com Python 3.12. O exemplo web não precisa de celular nem emulador.

curl -fsSL https://optics-framework.org/install | sh
optics setup --install playwright
optics init my-optics-project --template playwright
optics execute my-optics-project

No Windows, a instalação é irm https://optics-framework.org/install.ps1 | iex. Em qualquer sistema, pip install optics-framework também funciona.

O navegador abre o example.com, confere um texto e fecha:

Test Suite
├── Playwright Suite Setup                               |      0.88s |    PASS
│   └── Open Example Page                                |      0.88s |    PASS
│       └── Launch App (https://example.com)             |      0.88s |    PASS
├── TC1 Verify Landing                                   |      0.11s |    PASS
│   └── Verify Example Page                              |      0.11s |    PASS
│       └── Validate Element (text=This domain is for... |      0.11s |    PASS
└── Playwright Suite Teardown                            |      0.04s |    PASS
    └── Close Browser                                    |      0.04s |    PASS
        └── Close And Terminate App                      |      0.04s |    PASS
│ Total Test Cases: 3 | Passed: 3 | Failed: 0                                  │

Como é um teste

Os passos ficam em modules/modules.csv:

module_name,module_step,param_1,param_2
Open Example Page,Launch App,https://example.com
Verify Example Page,Validate Element,${Heading}
Close Browser,Close And Terminate App

${Heading} é um nome definido em test_data/elements.csv. Os testes se referem aos elementos pelo nome, então, quando a tela muda, você edita uma linha. Como é CSV, dá para abrir numa planilha, e a revisão passa por pull request como qualquer código.

O fallback de localizadores

Coloquei de propósito um XPath que não existe na primeira linha e o texto certo na segunda:

Element_Name,Element_ID
Heading,//h1[@id="old-hero-title"]
Heading,text=This domain is for use in documentation examples

O teste passou do mesmo jeito: o XPath falhou e o Optics achou o elemento pelo texto. Mas o passo foi de 0,11 s para 9,60 s, porque ele espera o primeiro localizador dar timeout antes de tentar o próximo. Um teste que vive passando no fallback está avisando que o localizador ficou velho.

Se o texto não estiver na árvore de UI, o Optics pode lê-lo da captura de tela com OCR, com o motor de OCR ativado. Isso ajuda com texto desenhado em banner, canvas ou player de vídeo.

E a IA?

A IA entra só na hora de criar o teste. Você pode descrever o fluxo em linguagem natural no optics live, ou ligar o optics mcp no Claude Code ou no Cursor para um agente explorar o app e escrever os arquivos. Depois, o optics execute repete as linhas sem chamar modelo nenhum: mesmo caminho a cada execução e sem custo de API. O self-heal com IA existe, mas é opcional e vem desligado.

Quando não usar

O Optics testa o que uma pessoa faz pela interface. Para teste unitário, teste de carga, teste só de API ou comparação de pixels, use outra ferramenta. Se você quer um binário único com espera automática e sem servidor Appium, o Maestro pode ser mais simples. Montamos uma comparação honesta dos dois.

Bugs e dúvidas: issues no GitHub ou aqui nos comentários.

Carregando publicação patrocinada...