Desenvolvimento

16 ago, 2018

EarlGrey vs KIF – Testing framework

Publicidade

Este artigo fala principalmente sobre o EarlGrey, mas com uma breve comparação com o KIF.

Algumas semanas atrás eu conheci o EarlGrey (sim, talvez eu esteja atrasado). EarlGrey é uma estrutura de teste de automação de interface do usuário desenvolvida pela Google. Sua versão atual é 1.14.0 e está muito ativa no GitHub no momento.

Earlgrey vs KIF popularity (26/06/2018)

À primeira vista pensei que poderia ser um bom substituto para o KIF, pelos seguintes motivos:

  • Sincronização: o Earlgrey sincroniza solicitação de rede, interface do usuário e threads. Não precisamos ‘esperar’ ou ‘esperar mais’! Odeio esperar;
  • Verificações de visibilidade: verifica se o elemento está visível antes de executar qualquer ação;
  • Interação com o usuário: Swipes e taps são executados usando eventos de app-level.

As interações de interface do usuário do EarlGrey simulam como um usuário real interage com a interface do usuário do seu aplicativo e ajudam você a encontrar e corrigir os mesmos bugs que os usuários vão encontrar no seu aplicativo.

A instalação do EarlGrey é simples e pode ser feita facilmente por meio de cocoapods. Usamos a versão 1.12.1 porque tivemos alguns problemas com o 1.14.0.

Testando

Com isso em mente, decidimos comparar o KIF ao EarlGrey em um projeto real. Para fazer isso, reescrevemos alguns testes com o novo framework, usando Xcode 9.3, Quick, Nimble e Nimble-Snapshots.

Para selecionar um elemento com EarlGrey, podemos chamar:

EarlGrey.select(elementWithMatcher: MATCHER).perform(ACTION)

Onde MATCHER pode ser GREYMatcher como accessibilityID, accessibilityLabel, buttonTitle e ACTION qualquer GREYAction, por exemplo taps, swipes, scrolls. Para mais informações, dê uma olhada nessas dicas.

//KIF
viewTester().usingIdentifier("password_field").clearAndEnterText("12345")
expect(window).toEventually(haveValidSnapshot(named: "disabled"))

//EarlGrey
EarlGrey.select(elementWithMatcher: grey_accessibilityID("password_field")).perform(grey_clearText())
EarlGrey.select(elementWithMatcher: grey_accessibilityID("password_field")).perform(grey_typeText("12345"))
expect(window).toEventually(haveValidSnapshot(named: "disabled"))

Vantagens

Escrever testes usando EarlGrey é fácil porque é simples; não precisa esperar por quase nada.

KIF (wait) VS EarlGrey (not wait)

//KIF
tester().waitForView(withAccessibilityLabel: "add card")
tester().tapView(withAccessibilityLabel: "add card")

//EarlGrey
EarlGrey.select(elementWithMatcher: grey_accessibilityID("add card")).perform(grey_tap())

Devido a isso, pode ser mais fácil para os desenvolvedores juniores começarem a escrever testes com o EarlGrey, e colocar ‘wait’ em algum lugar no seu código pode ser perigoso.

EarlGrey pode ser um pouco mais detalhado do que o KIF, mas nada que um Wrapper não possa lidar.

Problemas

O primeiro problema que tivemos foi quando estávamos usando accessibilityLabel, pois algumas chamadas no EarlGrey não encontraram o nosso elemento; o que foi facilmente resolvido adicionando um ID de acessibilidade a ele.

//KIF 
tester().tapView(withAccessibilityLabel: "try again")
expect(delegate.retryWasCalled).to(beTrue())

//EarlGrey
//EarlGrey.select(elementWithMatcher: grey_accessibilityLabel("try again")).perform(grey_tap())  //Can't find element.
EarlGrey.select(elementWithMatcher: grey_accessibilityID("try_again")).perform(grey_tap())                    
expect(delegate.retryWasCalled).to(beTrue())

Outro problema é que, às vezes, o EarlGrey encontrou vários elementos, embora saibamos que há apenas um elemento. Isso foi um pouco mais complicado, mas resolvemos forçá-lo a selecionar o primeiro elemento. Sabemos que provavelmente não foi a melhor solução, mas funciona no momento.

//KIF
tester().tapView(withAccessibilityLabel: "close")

//EarlGrey
EarlGrey.select(elementWithMatcher: grey_accessibilityLabel("close")).atIndex(0).perform(grey_tap())

Running tests

Depois que todos os testes foram criados usando KIF e EarlGrey, decidimos rodar algumas vezes e checar o tempo de execução (em segundos).

Tempo de execução do conjunto de testes

A tabela acima mostra o tempo em segundos que o EarlGrey e o KIF levam para executar todo o processo de teste. Podemos notar que o EarlGrey é 150% mais lento, então decidimos ir mais fundo e verificar o porquê.

Nós anotamos o tempo de execução de cada classe de teste. À esquerda temos o número de testes para cada classe. Às vezes o EarlGrey é muito lento, mas às vezes foi mais rápido que o KIF, então nos confundimos. O que está acontecendo? O que está fazendo os testes muito mais lentos?

Comparação por classe de teste

Então decidimos ir mais fundo ainda. E verificamos quais ações/eventos são chamados em cada teste.

Clear and text events
Swipe, tap and search events

Podemos notar que texto claro e texto de entrada são mais rápidos no EarlGrey do que no KIF, mas swipes, toques e pesquisas levam muito tempo e nos perguntamos por quê?

A resposta que recebemos foi tirada da página de recursos do EarlGrey:

Taps e swipes são executados usando eventos de toque em nível de aplicativo, em vez de usar manipuladores de eventos em nível de elemento. Antes de cada interação com a interface, EarlGrey afirma que os elementos que estão sendo interagidos estão realmente visíveis (veja Verificações de Visibilidade) e não apenas presentes na hierarquia da visão. As interações de interface do usuário do EarlGrey simulam como um usuário real interage com a interface do usuário do seu aplicativo e ajudam você a encontrar e corrigir os mesmos bugs que os usuários vão encontrar no seu aplicativo.

Enquanto o KIF:

KIF tenta imitar a entrada real do usuário. A automação é feita usando eventos de tap sempre que possível.

EarlGrey adiciona outra camada de eventos que acionam manipuladores e muito mais, então faz sentido levar mais tempo.

Nós tentamos fazê-lo funcionar mais rápido, permitindo animações rápidas.

GREYTestHelper.enableFastAnimation()

O que realmente faz com que seja mais rápido, mas não mais rápido que o KIF.

EarlGrey x KIF x EarlGrey (Fast Animation)

Nos perguntamos se o EarlGrey ainda simula um usuário real, mesmo permitindo animações rápidas.

Conclusão

O EarlGrey é pior que o KIF? A resposta é não! Você não pode jogar fora EarlGrey só porque é mais lento; a finalidade de EarlGrey não é ser a estrutura de teste mais rápida disponível.

Então qual devo usar? Isso depende: você quer um teste rápido? Ou aproveitar a sincronização, as verificações de visibilidade e a interação do usuário?

Se você quer um traje mais rápido, use KIF, e se quiser um mais simples, talvez o EarlGrey seja a melhor opção.

Se você gostou deste artigo, compartilhe-o no Twitter, recomende-o no meio, ou ambos. Isso realmente me ajuda a alcançar mais pessoas.

Muito obrigado!

***

Este artigo foi publicado originalmente em: https://www.concrete.com.br/2018/08/15/earlgrey-vs-kif-testing-framework/