Você pode requerer o Cypress como um módulo do seu aplicativo em teste e executar o Cypress via Node.js. Isso pode ser útil quando você deseja acessar os resultados do teste diretamente após a execução. Com este fluxo de trabalho, você pode, por exemplo:
- Enviar uma notificação sobre testes com falha com imagens de captura de tela incluídas
- Executar novamente um único arquivo de especificação com falha
- Dar início a outras compilações ou scripts
Executa testes do Cypress via Node.js e resolve com todos os resultados de teste. Veja a receita do Cypress Módulo API.
// e2e-run-tests.js
const cypress = require("cypress");
cypress.run({
reporter: "junit",
browser: "chrome",
config: {
baseUrl: "http://localhost:8080",
video: true,
},
env: {
login_url: "/login",
products_url: "/products",
},
});
Você pode então rodar o Cypress executando o seguinte em seu terminal ou em um script npm:
node e2e-run-tests.js
Assim como as opções de linha de comando para o cypress run, você pode passar opções que modificam como o Cypress é executado.
Opção | Tipo | Descrição |
---|---|---|
browser | string | Especifica um navegador diferente para executar os testes, seja por nome ou por caminho do sistema de arquivos |
ciBuildId | string | Especifica um identificador exclusivo para uma execução para permitir agrupamento ou paralelização |
config | object | Especifica a configuração |
configFile | string / boolean | Caminho para o arquivo de configuração a ser usado. Se false for passado, nenhum arquivo de configuração será usado. |
env | object | Especifica as variáveis de ambiente |
group | string | Testes registrados do grupo juntos em uma única execução |
headed | boolean | Executa no navegador em vez do modo headless |
headless | boolean | Oculte o navegador em vez de executar em modo headed (padrão durante a execução do Cypress) |
key | string | Especifica sua chave de registro secreto |
exit | boolean | Se deve fechar o Cypress após a execução de todos os testes |
parallel | boolean | Execute especificações gravadas em paralelo em várias máquinas |
port | number | Substituir porta padrão |
project | string | Caminho para um projeto específico |
quiet | boolean | Se aprovado, a saída do Cypress não será impressa no stdout. Apenas a saída do relatório Mocha configurado será impressa. |
record | boolean | Se deve registrar a execução do teste |
reporter | string | Especifica um relatório Mocha |
reporterOptions | object | Especifica as opções do relatório Mocha |
spec | string | Especifica os arquivos de teste a serem executados, consulte os exemplos abaixo |
tag | string | Identifique uma execução com uma etiqueta ou etiquetas |
testingType | string | Especifica os tipos de testes a serem executados, ou e2e ou componente. Padrões para e2e |
Aqui está um exemplo de execução programada de um arquivo de especificação. Observe que o caminho do arquivo é relativo ao diretório de trabalho atual.
// e2e-run-tests.js
const cypress = require("cypress");
cypress
.run({
// o caminho é relativo ao diretório de trabalho atual
spec: "./cypress/integration/examples/actions.spec.js",
})
.then((results) => {
console.log(results);
})
.catch((err) => {
console.error(err);
});
Você pode então rodar o Cypress executando o seguinte em seu terminal ou um script npm:
node e2e-run-tests.js
Você pode passar um padrão curinga para executar todos os arquivos de especificações correspondentes
const cypress = require("cypress");
cypress.run({
// o caminho curinga é relativo ao diretório de trabalho atual
spec: "./cypress/integration/**/api*.js",
});
Se a sua versão do Node permitir, você pode usar a sintaxe moderna async / await para aguardar a promessa retornada pelo método cypress.run.
const cypress = require("cypress")(async () => {
const results = await cypress.run();
// use o objeto results
})();
cypress.run() retorna uma promessa que resolve com um objeto que contém os resultados dos testes. Uma execução típica pode retornar algo assim:
{
"cypressVersion": "3.0.2",
"endedTestsAt": "2018-07-11T17:53:35.675Z",
"browserName": "electron",
"browserPath": "path/to/browser",
"browserVersion": "59.0.3071.115",
"config": {...},
"osName": "darwin",
"osVersion": "14.5.0",
"runs": [{
"error": null,
"hooks": [{
"hookName": "before each",
"title": [ "before each hook" ],
"body": "function () {\n expect(true).to.be["true"]\n}"
}],
"reporter": "spec",
"reporterStats": {...},
"shouldUploadVideo": true,
"spec": {...},
"stats": {
"suites": 1,
"tests": 1,
"passes": 0,
"pending": 0,
"skipped": 0,
"failures": 1,
"startedAt": "2020-08-05T08:38:37.589Z",
"endedAt": "2018-07-11T17:53:35.675Z",
"duration": 1171
},
"tests": [{
"title": [ "test" ],
"state": "failed",
"body": "function () {\n expect(true).to.be["false"]\n}",
"displayError": "AssertionError: expected true to be false\n' +
' at Context.eval (...cypress/integration/spec.js:5:21",
"attempts": [{
"state": "failed",
"error": {
"message": "expected true to be false",
"name": "AssertionError",
"stack": "AssertionError: expected true to be false\n' +
' at Context.eval (...cypress/integration/spec.js:5:21"
},
"screenshots": [{
"name": null,
"takenAt": "2020-08-05T08:52:20.432Z",
"path": "User/janelane/my-app/cypress/screenshots/spec.js/test (failed).png",
"height": 720,
"width": 1280
}],
"startedAt": "2020-08-05T08:38:37.589Z",
"duration": 1171,
"videoTimestamp": 4486
}]
}],
"video": "User/janelane/my-app/cypress/videos/abc123.mp4"
}],
"runUrl": "https://dashboard.cypress.io/projects/def456/runs/12",
"startedTestsAt": "2018-07-11T17:53:35.463Z",
"totalDuration": 212,
"totalFailed": 1,
"totalPassed": 0,
"totalPending": 0,
"totalSkipped": 0,
"totalSuites": 1,
"totalTests": 1,
}
Você pode encontrar a definição do TypeScript para o objeto de resultados na pasta cypress/cli/types.
Mesmo quando os testes falham, a promessa resolve com os resultados do teste. A promessa só é rejeitada se o Cypress não puder ser executado por algum motivo (por exemplo, se um binário não foi instalado ou ele não consegue encontrar uma dependência de módulo). Nesse caso, a promessa será rejeitada com um erro detalhado.
Há uma terceira opção - o Cypress pode ser executado, mas os testes não podem ser iniciados por algum motivo. Nesse caso, o valor resolvido é um objeto com dois campos
{
"failures": 1, // número diferente de zero
"message": "..." // mensagem de erro
}
Para lidar com esses possíveis erros, você pode adicionar uma captura para cypress.run():
// e2e-run-tests.js
const cypress = require('cypress')
cypress.run({...})
.then(result => {
if (result.failures) {
console.error('Could not execute tests')
console.error(result.message)
process.exit(result.failures)
}
// imprimir resultados de teste e sair
// com o número de testes com falha como código de saída
process.exit(result.totalFailed)
})
.catch(err => {
console.error(err.message)
process.exit(1)
})
Abra os testes do Cypress via Node.js.
// e2e-open-tests.js
const cypress = require("cypress");
cypress.open({
config: {
baseUrl: "http://localhost:8080",
},
env: {
login_url: "/login",
products_url: "/products",
},
});
Em seguida, você pode abrir o Cypress executando o seguinte em seu terminal ou um script npm:
node e2e-open-tests.js
Assim como as opções de linha de comando, você pode passar opções que modificam como o Cypress é executado.
Opção | Tipo | Descrição |
---|---|---|
browser | string | Especifique um caminho do sistema de arquivos para um navegador personalizado |
config | object | Especifique a configuração |
configFile | string / boolean | Caminho para o arquivo de configuração a ser usado. Se false for passado, nenhum arquivo de configuração será usado. |
detached | boolean | Abra o Cypress em modo separado |
env | object | Especifique as variáveis de ambiente |
global | boolean | Executar em modo global |
port | number | Substituir porta padrão |
project | string | Caminho para um projeto específico |
testingType | string | Especifique os tipos de testes a serem executados, ou e2e ou componente. Padrões para e2e |
// e2e-open-tests.js
const cypress = require("cypress");
cypress.open({});
Em seguida, você pode abrir o Cypress executando o seguinte em seu terminal ou um script npm:
node e2e-open-tests.js
Se você estiver escrevendo uma ferramenta que envolve o comando cypress.run(), você pode querer analisar argumentos de linha de comando fornecidos pelo usuário usando a mesma lógica que o cypress run utiliza. Nesse caso, você pode usar a função parseRunArguments incluída.
// wrapper.js
const cypress = require("cypress");
const runOptions = await cypress.cli.parseRunArguments(process.argv.slice(2));
const results = await cypress.run(runOptions);
// processar os resultados "cypress.run()"
Um exemplo de uso executado em seu terminal poderia ser:
node ./wrapper cypress run --browser chrome --config ...
Observação: os argumentos passados para parseRunArguments devem começar com cypress run.
Usamos a análise CLI e a chamada de cypress.run para repetir testes para encontrar testes instáveis e para repetir os testes para encontrar testes instáveis e para validar os números de teste após uma execução de teste. leia Wrap Cypress usando npm Module API para mais exemplos.
Versão | Mudanças |
---|---|
7.3.0 | Adicionada opção de configuração testingType. |
5.0.0 | Os resultados do teste retornados de cypress.run () foram alterados. |
4.11.0 | Adicionado cypress.cli com a função parseRunArguments. |
4.9.0 | Adicionada opção silenciosa a cypress.run () |