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.
À 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).
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?
Então decidimos ir mais fundo ainda. E verificamos quais ações/eventos são chamados em cada teste.
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.
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/