Testes automatizados com a Headless Chrome

Se você quer executar testes automatizados com o Headless Chrome, não precisa procurar mais. Neste artigo, vamos mostrar como usar o Karma como executor e o Mocha+Chai para criar testes.

O que são?

Carma, Mocha, Chai, Headless Chrome, minha nossa!

Karma é um arcabouço de testes que funciona com qualquer um dos frameworks de teste mais conhecidos (Jasmine, Mocha, QUnit).

O Chai é uma biblioteca de declarações que funciona com o Node e no navegador. Precisamos do último.

A versão headless do Chrome é uma maneira de executar o navegador Chrome em um ambiente headless sem a interface completa do navegador. Um dos benefícios de usar o Headless Chrome (em vez de testar diretamente no Node) é que os testes de JavaScript são executados no mesmo ambiente que os usuários do site. O Headless Chrome oferece um contexto de navegador real sem a sobrecarga de memória da execução de uma versão completa do Chrome.

Configuração

Instalação

Instale o Karma, os plug-ins relevantes e os executores de teste usando yarn:

yarn add --dev karma karma-chrome-launcher karma-mocha karma-chai
yarn add --dev mocha chai

ou use npm:

npm i --save-dev karma karma-chrome-launcher karma-mocha karma-chai
npm i --save-dev mocha chai

Estou usando Mocha e Chai nesta postagem, mas, se você não é fã, escolha sua biblioteca de declarações favoritas que funcione no navegador.

Configurar o Karma

Crie um arquivo karma.conf.js que use a tela de início ChromeHeadless.

karma.conf.js

module.exports = function(config) {
  config.set({
    frameworks: ['mocha', 'chai'],
    files: ['test/**/*.js'],
    reporters: ['progress'],
    port: 9876,  // karma web server port
    colors: true,
    logLevel: config.LOG_INFO,
    browsers: ['ChromeHeadless'],
    autoWatch: false,
    // singleRun: false, // Karma captures browsers, runs the tests and exits
    concurrency: Infinity
  })
}

Criar um teste

Crie um teste em /test/test.js.

/test/test.js

describe('Array', () => {
  describe('#indexOf()', () => {
    it('should return -1 when the value is not present', () => {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

Executar seus testes

Adicione um script test em package.json que executa o Karma com nossas configurações.

package.json

"scripts": {
  "test": "karma start --single-run --browsers ChromeHeadless karma.conf.js"
}

Quando você executa seus testes (yarn test), o Headless Chrome é acionado e envia os resultados ao terminal:

Saída do Karma.

Como criar sua tela de início headless do Chrome

A tela de início do ChromeHeadless é ótima porque funciona imediatamente para testes no Headless Chrome. Ele inclui as sinalizações apropriadas do Chrome para você e inicia uma versão de depuração remota do Chrome na porta 9222.

No entanto, às vezes, pode ser necessário transmitir sinalizações personalizadas para o Chrome ou mudar a porta de depuração remota usada pela tela de início. Para fazer isso, crie um campo customLaunchers que estenda a tela de início de base ChromeHeadless:

karma.conf.js

module.exports = function(config) {
  ...

  config.set({
    browsers: ['Chrome', 'ChromeHeadless', 'MyHeadlessChrome'],

    customLaunchers: {
      MyHeadlessChrome: {
        base: 'ChromeHeadless',
        flags: ['--disable-translate', '--disable-extensions', '--remote-debugging-port=9223']
      }
    },
  }
};

Como executar tudo no Travis CI

Configurar o Karma para executar testes no Headless Chrome é a parte difícil. A integração contínua no Travis está a apenas algumas linhas de distância.

Para executar seus testes no Travis, use dist: trusty e instale o complemento estável do Chrome:

.travis.yml

language: node_js
node_js:
  - "7"
dist: trusty # needs Ubuntu Trusty
# Note: if you switch to sudo: false, you'll need to launch Chrome with --no-sandbox.
# See https://github.com/travis-ci/travis-ci/issues/8836
sudo: required
addons:
  chrome: stable # have Travis install Chrome stable.
cache:
  yarn: true
  directories:
    - node_modules
install:
  - yarn
script:
  - yarn test