Um amigo estava decidindo recentemente sobre uma estrutura de teste para JavaScript do lado do cliente e pediu conselhos sobre qual usar. Existem muitos para escolher e é difícil decidir, pois todos eles fazem basicamente a mesma coisa:
- Descreva o que você está testando
- Configure o que você vai testar
- Afirme se a coisa fez o que você esperava
Os fatores de diferenciação estão realmente nos detalhes. Usei algumas das estruturas de teste JS mais populares (Jasmine, Mocha e QUnit) em diferentes projetos, embora existam muitos mais . Aqui está como eles se comparam.
Diferenças
Inclui a versão mais recente, no momento da escrita.
Jasmine (v2.0.1)
Jasmine parece ser o mais popular dos três (com base em discussões com outros programadores e em várias estrelas no repositório ). Ele também tem executores em Python e Ruby , o que é incrivelmente útil se você deseja executar seus testes do lado do cliente junto com os do lado do servidor.
Eu ia escrever uma reclamação sobre a sintaxe de teste assíncrona do Jasmine, mas parece que ela foi alterada no 2.0 e agora está muito próxima da sintaxe do QUnit e do Mocha. Hooray!
Mocha (v1.20.1)
O Mocha não tem uma biblioteca de asserções embutida , portanto, requer a adição de uma biblioteca de terceiros adicional. Embora eu aprecie a flexibilidade, isso adiciona algum atrito desnecessário para usuários iniciantes, que precisam escolher um sem muito contexto sobre por que um seria uma escolha melhor do que o outro. (A resposta é que ” não faz diferença nenhuma – é apenas uma questão de escolher a sintaxe que você gosta”.) Uma coisa incrível (mais avançada) sobre o Mocha é que ele tem suporte integrado para Promises .
QUnit (v1.14.0)
QUnit é o mais fácil dos três de configurar – requer apenas um arquivo JS, um arquivo CSS e um único elemento DOM:
<div id="qunit"></div>
Meu primeiro problema com o QUnit é que, em um esforço para reduzir o número de funções globais criadas, QUnit é mais prolixo do que os outros, usando métodos como em vez de simplesmente . Uma outra reclamação é como ele lida com o agrupamento de testes . QUnit fornece um método:QUnit.test()
it()
module()
QUnit.module('parent thing - child1');
// test child1
QUnit.module('parent thing - child2');
// test child 2
enquanto Jasmine e Mocha têm (a mesma) sintaxe para aninhar blocos de teste:
describe('parent thing', function(){
describe('child1', function(){
// test child1
});
describe('child2', function(){
// test child2
});
});
Embora às vezes mais prolixo, gosto que as funções aninhadas tornam o agrupamento mais claro.describe()
Atualização: @yozlet apontou que o qunit-bdd adiciona o comportamento aninhado ao QUnit.describe()
Semelhanças
- Todos podem ser executados em uma página do navegador
- Nota: Depurar JS em um navegador é muito mais fácil do que depurar em uma linha de comando, então ter essa opção é muito bom
- Todos podem ser executados a partir da linha de comando, via Node.js / PhantomJS
- Maioria das coisas
Em conclusão, não se estresse muito sobre a escolha – a estrutura de teste das pessoas de escolha é geralmente arbitrária. Apenas se concentre no problema muito mais difícil de escrever bons testes 🙂