Comparação de framework de teste de JavaScript

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:

  1. Descreva o que você está testando
  2. Configure o que você vai testar
  3. 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 🙂

Veja também