O Transferidor e o Karma podem ser usados ​​juntos?

104

Se o Protractor estiver substituindo o Angular Scenario Runner para o teste E2E, isso significa que ainda poderei usá-lo com o Karma como minha estrutura de teste E2E?

princípio holográfico
fonte
IMO, você deve ser capaz. Karma é apenas o corredor de teste. Depois de escrever / construir seus casos de teste no Protractor ... o karma deve ser capaz de executá-lo quando solicitado. Da mesma forma, você pode pedir ao Karma para executar os testes E2E atuais.
manutenção de
1
O @skeep Webdriver é gerado e se conecta aos navegadores via protocolo WebDriver - algo que Karma não suporta (ele usa WebSockets e uma página da web). Eles executam tarefas semelhantes de maneiras muito diferentes. Os testes Karma E2E, agora obsoletos, não usam WebDriver e sofrem por isso - eles devem manter o estado dentro do navegador (o estado do WebDriver está inteiramente fora do processo do navegador).
Andy

Respostas:

102

Não recomendado pelo atual mantenedor do Transferidor:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

Transferidor e Karma não devem ser usados ​​juntos; em vez disso, fornecem sistemas separados para a execução de testes. Transferidor e Karma cobrem diferentes aspectos do teste - Karma se destina principalmente a testes de unidade, enquanto o Transferidor deve ser usado para testes de ponta a ponta.

O Protractor é construído sobre o WebDriverJS, que usa um servidor Selenium / WebDriver para provisionar navegadores e conduzir a execução de testes. Exemplos de WebDriverJS puro podem ser encontrados aqui: http://code.google.com/p/selenium/wiki/WebDriverJs

E

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Georgios - eu acho que faz sentido manter o Protractor e o Karma separados - para testes de ponta a ponta, você quer a direção de evento nativa e a flexibilidade do webdriver, enquanto para testes de unidade você quer uma execução rápida e autowatching de arquivos.

macaco
fonte
Ainda é verdade que não devemos expulsar o Transferidor do Karma?
ErikAGriffin,
@theLateWizard Absolutamente verdade, não só você não deve, você não pode :)
Dmitri Zaitsev
74

ATUALIZAR. Aqui está um pacote simples que criei para adicionar a configuração mínima do Karma a qualquer projeto com um único comando npm install min-karma.


Eu gostaria de esclarecer alguns possíveis conceitos errôneos sobre Karma e Transferidor . Karma FAQ na verdade se refere ao Adaptador para o Scenario Runner do Angular , que, no entanto, parece ter sido abandonado, com o Protractor sendo recomendado em seu lugar.


Carma

Karma é um executor de teste que executará os arquivos JavaScript especificados em seu arquivo de configuração explicitamente ou usando node-globs . (Para modelos externos não JavaScript , o Guia de teste de unidade do Angular recomenda o uso do pré - processador Karma html para compilá-los primeiro em JavaScript.)

Eles podem ser todos os seus arquivos de origem, alguns deles, alguns deles mais alguns arquivos adicionais ou arquivos irrelevantes para o seu projeto, fornecendo apenas algumas configurações extras - você escolhe! Você pode ter vários arquivos de configuração do karma para diferentes propósitos, que podem ser executados em paralelo ou um por um. Cada processo do karma inicia seu próprio conjunto de navegadores (atualmente disponíveis) .

Este recurso do Karma para executar apenas um conjunto de arquivos é o que o torna perfeito para testes rápidos executados em segundo plano a cada edição do arquivo de origem e obter feedback imediato, o que é brilhante! O único aspecto negativo é o relatório de erro "barulhento" que, com sorte, irá melhorar!


Karma não é apenas para testes de unidade

O teste de unidade é para uma única unidade de seu código-fonte. No caso do Angular, uma unidade típica é o Componente Angular ( Service, Factory, Provider, Controller, Filter, Directiveetc). Lembre-se de manter seu Controllersmagro, então muitos testes de unidade para os últimos é um sinal de alerta .

Em um teste de unidade , todas as outras unidades de código das quais essa unidade depende (as chamadas dependências da unidade) não devem ser testadas ao mesmo tempo. Em vez disso, eles devem ser "ridicularizados", por exemplo, substituídos por algo simples como instâncias fictícias. O Angular oferece excelente suporte a ambientes simulados . O ideal é que você queira ver todos esses mocks diretamente dentro de seus testes, para que nunca precise se perguntar de onde vêm todas essas dependências.

Karma é igualmente útil para testes de integração , onde um grupo de unidades de código-fonte é testado em conjunto, com apenas algumas de suas dependências sendo simuladas. É importante lembrar que qualquer dependência é fornecida por padrão a partir de seus módulos de código-fonte (contanto que esses módulos sejam injetados diretamente em seus testes ou sejam dependências de outros módulos injetados (neste caso, você não precisa injetá-los , mas não há problema em fazê-lo). As dependências simuladas substituirão as fornecidas.

Correr rápido e frequente é a principal característica do Karma . Isso significa que você deseja evitar quaisquer solicitações do servidor, consultas ao banco de dados, qualquer coisa que possa levar mais do que frações de segundos. ( Caso contrário, NÃO será rápido! ) Esses processos longos são aqueles dos quais você deseja zombar . Isso também explica por que é uma má prática colocar serviços de baixo nível brutos, como $httpdiretamente dentro de seus controladores ou qualquer unidade lógica de negócios complicada. Ao agrupar esses serviços de comunicação externa de baixo nível em serviços dedicados menores, você torna muito mais fácil "zombar deles".

O que o Karma não faz é administrar o seu site como ele está, que é o teste End-to-End (E2E). Em princípio, você pode usar os métodos internos do Angular para recriar o site ou suas partes. O que, para peças pequenas, pode ser útil e uma maneira rápida, por exemplo, para testar diretivas.

No entanto, não é uma maneira recomendada de lançar códigos complicados em seus testes. Quanto mais você faz isso, maior a chance de cometer erros no código em vez do que está realmente testando.

É por isso que eu pessoalmente não gosto da maneira complicada mencionada freqüentemente de métodos de teste usando métodos de baixo nível como $http. Ele funciona de forma mais limpa para isolar qualquer referência a métodos de baixo nível em métodos dedicados de sua autoria, cuja única responsabilidade é fazer solicitações http. Esses métodos dedicados devem ser capazes de funcionar com back-end real , não falso! Que você pode testar facilmente - manualmente ou mesmo perfeitamente bem com Karma rodando com outra configuração especial , contanto que você não misture essa configuração com aquela normalmente usada para rodar Karmaregular e rápido. Agora, tendo seus pequenos serviços dedicados testados, você pode simular com segurança e facilidade para testar sua outra lógica e colocar esses testes em sua configuração normal do Karma .


Para resumir. Use Karma para executar qualquer conjunto de arquivos JavaScript. É (deveria ser) rápido. Você não vê seu aplicativo completo, então não pode testar o resultado final de forma eficaz e confiável. Eu iria executá-lo com o Transferidor ? Por que eu deveria? Executar o Transferidor tornaria meus testes mais lentos, anulando o propósito do Karma . É fácil executar o Transferidor separadamente.


Transferidor

Transferidor é:

uma estrutura de teste ponta a ponta para aplicativos AngularJS. O Protractor executa testes em seu aplicativo em execução em um navegador real, interagindo com ele como um usuário faria.

Portanto, o Protractor faz exatamente o que o Karma não faz - executa seu aplicativo final real. Isso revela seu poder e limitações:

A execução do aplicativo completo é o único teste final confiável em que seu aplicativo funciona conforme o esperado. Você pode escrever cenários completos de histórias de usuário e colocá-los em seus testes!

Mas é mais difícil rastrear erros sem isolar unidades individuais de seu código-fonte. É por isso que você ainda precisa do Karma para testar seu código JavaScript primeiro.


Agora, eu gostaria de executar o Transferidor com Karma ? Certamente posso executá-los em janelas de terminal separadas, em paralelo. Eu poderia, em princípio, fazer com que eles compartilhassem arquivos de teste se eu precisar, mas normalmente prefiro não. Por quê? Porque eu quero manter meus testes pequenos com um único propósito dedicado.

A única exceção seria um arquivo que define macros de teste úteis para ambos os corredores. Este, entretanto, não seria um arquivo de teste, mas um arquivo de definição de macro .

Fora isso, gosto de uma separação clara entre meus testes. Aqueles para serem executados com frequência e rapidez, e aqueles para o aplicativo completo. Isso faz uma separação clara entre quando usar Karma e quando transferidor .

Dmitri Zaitsev
fonte
Se eu quiser o teste de unidade, bem como o teste e2e, devo configurar o ambiente do karma para o teste de unidade e o transferidor para o teste de interface do usuário ou o teste e2e?
Sunil Garg
@SunilGarg Sim, se quiser usar os dois, mas como escrevi, Karma não é apenas para teste de unidade.
Dmitri Zaitsev
1

Karma é um executor de testes fornecido pela equipe Angular, Karma executará seus testes em vários navegadores, o que garantirá que nosso aplicativo seja compatível em todos os navegadores. O teste de unidade para js angular pode ser usado karma + jasmim

Jasmine é uma estrutura de teste de unidade javascript e nos fornecerá utilitários para testar nosso aplicativo. Isso funciona melhor na estrutura Angular e, portanto, nossa escolha de “ferramenta de teste de unidade automatizada”. https://github.com/shahing/testingangularjs

E o Protractor é uma estrutura de teste ponta a ponta para aplicativos Angular e AngularJS. O Protractor executa testes em seu aplicativo rodando em um navegador real, navegadores sem interface, testes de navegador cruzado e pode ser hospedado em saucelabs.

https://github.com/shahing/Protractor-Web-Automation

Shahin
fonte
1

Sim, você pode usar carma e transferidor juntos. Karma é usado para testar a unidade do componente que você criou usando o comando angular, você pode testar esses componentes usando karma. Transferidor é usado para teste de ponta a ponta. É usado principalmente para testes de IU.

Rahul Solanki
fonte
Para conseguir isso, você precisa adicionar a configuração do carma e do transferidor
Rahul Solanki