Diário
Engenharia3 min de leitura

Testar os pixels: controlo de qualidade por capturas de ecrã numa equipa pequena

A nossa bateria de testes estava verde e o menu não se conseguia clicar. Os testes unitários não veem erros de empilhamento, nem tema escuro partido, nem transbordo no telemóvel. Eis a pequena montagem de capturas de ecrã que agora olha por nós para todas as superfícies, e os erros visuais que apanha e que os testes nunca vão apanhar.

AEA equipa de engenharia do Bookatu

Adotámos isto pela via honesta: depois de lançarmos regressões visuais que uma única captura de ecrã teria apanhado. Um painel fosco que saiu pálido sobre fundos escuros. Um menu que se desenhava mas não se conseguia clicar. Um campo de pesquisa que existia à largura de um telemóvel como uma lasca de 65 pixels. Todos eles passaram por uma bateria de testes verde, porque a bateria testava funções e os erros viviam nos pixels.

A montagem é mais pequena do que parece

A nossa é um ambiente local semeado, cheio de dados fictícios convincentes, um início de sessão headless cuja sessão é guardada em disco para nada abrandar, e um ciclo: páginas vezes temas vezes larguras de ecrã. Computador e telemóvel, claro e escuro, todas as superfícies que interessam. A coisa toda é um script curto, e uma varredura completa produz uma pasta de imagens em poucos minutos.

js
import { chromium } from 'playwright'; const browser = await chromium.launch();const ctx = await browser.newContext({  storageState: 'auth.json', // login once, reuse everywhere  viewport: { width: 1440, height: 900 },});const page = await ctx.newPage(); for (const [name, url] of PAGES) {  await page.goto(BASE + url, { waitUntil: 'load' });  for (const theme of ['light', 'dark']) {    await page.evaluate((t) =>      document.documentElement.setAttribute('data-theme', t), theme);    await page.screenshot({ path: `shots/${name}-${theme}.png`, fullPage: true });  }}

Capturas de ecrã, mais a prova

As imagens apanham o que os olhos apanham. Para erros de interação, o que quer é que o navegador testemunhe. Duas linhas fazem quase todo o trabalho: o elementFromPoint no centro de um controlo diz-lhe o que receberia mesmo o clique, e o getBoundingClientRect diz-lhe se o controlo cabe de facto na largura de ecrã que diz suportar. Passámos a verificar as duas coisas para tudo o que já nos queimou.

js
// Is the menu item really clickable, or is something invisible covering it?const hit = await page.evaluate(() => {  const el = document.querySelector('[role="menuitem"]');  const r = el.getBoundingClientRect();  const top = document.elementFromPoint(r.x + r.width / 2, r.y + r.height / 2);  return el === top || el.contains(top);}); // Does the search input actually fit a 390px phone?const fits = await page.evaluate(() => {  const r = document.querySelector('input[name="q"]').getBoundingClientRect();  return r.right <= window.innerWidth && r.width > 200;});

Os dois temas, sempre

Os erros de modo escuro são uma categoria à parte porque se escondem de quem trabalha só num tema. Um preenchimento quase branco escrito à mão parece intencional numa página clara e radioativo numa escura. Trocar o atributo do tema dentro da mesma visita à página custa uma linha e duplica a cobertura. Tratamos qualquer superfície que não tenha sido fotografada nos dois temas como não testada.

Um painel de marcações fotografado em tema claro
A mesma página, fotografada duas vezes por varredura. Claro...
O mesmo painel de marcações fotografado em tema escuro
...e escuro. As cores escritas à mão não têm onde se esconder quando existem os dois enquadramentos.

O que é que apanha

  • Erros de contexto de empilhamento: desenhado, visível e não clicável. Só um teste de clique vê isto.
  • Fugas de tema: superfícies claras a brilhar em páginas escuras, gráficos que desaparecem, ilustrações com o fundo cozido lá dentro.
  • Transbordo no telemóvel: barras fixas a tapar conteúdo, campos cortados em lascas, títulos cortados a meio da frase.
  • Texto no contexto: o corte, a contradição, a frase que um linter nunca vai assinalar.

Nada disto substitui a bateria de testes unitários. A bateria prova as contas do dinheiro; as capturas de ecrã provam que um humano consegue chegar ao botão que as dispara. Uma equipa pequena não tem um departamento de qualidade, mas uma pasta de capturas de ecrã acabadas de tirar e revistas antes de cada lançamento é uma imitação decente disso. O teste é o olhar.

Os testes passam é uma afirmação sobre as suas funções. A captura de ecrã é uma afirmação sobre o seu produto.

testes de regressão visualcapturas de ecrã com playwrighttestes com navegador headlesstestar o modo escuroautomação de qa
Pronto para pôr isto em prática?

O Bookatu dá-lhe um site de marcações com a sua marca, sinais, subscrições, vales-presente e lembretes, com 0% de comissão nas suas marcações.

Começar grátis