Como executo um único teste usando o Jest?

355

Eu tenho um teste 'funciona com filhos aninhados' no arquivo fix-order-test.js.

A execução abaixo executa todos os testes no arquivo.

jest fix-order-test

Como executo apenas um único teste? O abaixo não funciona, pois procura um arquivo do regex especificado.

jest 'works with nested children'
vijayst
fonte
desde que seu uso brincadeira linha de comando, provavelmente através de NPM, em seguida, basta adicionar o --testNamePattern 'works with nested children' Jest CLI Opções #testNamePattern
steven87vt
@BioGenX: link é agora quebrado
Dan Dascalescu

Respostas:

428

Na linha de comando, use o sinalizador --testNamePatternou-t

jest -t 'fix-order-test'

Isso executará apenas testes que correspondem ao padrão de nome de teste que você fornece. Está nos documentos do Jest .

Outra maneira é executar testes no modo de exibição jest --watche pressione ppara filtrar os testes digitando o nome do arquivo de teste ou tpara executar um único nome de teste.


Se você tem um itinterior de um describebloco, precisa executar

jest -t '<describeString> <itString>'
Andreas Köberle
fonte
Estou recebendo opções não reconhecidas para -t. Sim, a documentação menciona isso. A bandeira foi adicionada em 16.0. Estou na versão mais recente. jest -help parece não mencionar a bandeira. Obrigado.
vijayst
12
Apenas observe que este é o padrão de teste para o nome de teste específico dentro da it()função e não o nome do arquivo. Foi o que eu pensei.
precisa saber é o seguinte
70
Se utilizando o teste NPM, você precisa fazernpm test -- -t "fix order test"
Salsaparrilha
3
Isso funciona para mim, mas também pula todos os outros testes do projeto, que são lentos para projetos grandes. Especificar um arquivo de teste específico em que o teste realmente ajuda:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932
Funciona para mim sem especificar <describeString>, notei que as magnitudes são mais lentas que o grep de mocha (-g 'searchString') - mas eu aceito :-)
schmoopy
125

A documentação do Jest recomenda o seguinte:

Se um teste está falhando, uma das primeiras coisas a verificar deve ser se o teste está falhando quando é o único teste que é executado. No Jest, é simples executar apenas um teste - apenas altere temporariamente esse test comando para umtest.only

test.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

ou

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});
escamoso
fonte
7
Funciona para mim com brincadeira 20.0.4. Embora pule apenas o restante dos testes nesse arquivo. Os testes em outros arquivos continuam em execução, a menos que você já tenha restringido a execução ao arquivo.
Holf 5/09
7
No entanto, isso é uma piada - porque ele executa os testes de forma assíncrona, provavelmente não pode determinar qual teste executar em qual arquivo desde o início. Portanto, ele executará todos os arquivos por padrão e DENTRO dos arquivos test.only. Então, se você só deseja executar um teste dentro de um arquivo que tem muitos casos de teste dentro de um conjunto de casos de teste que consiste de muitos arquivos que você tem de correr, infelizmente, esse arquivo únicojest myTestFile.test.js
escamosa
@johnslay: Ele faz, apenas testei
escamosa
Floco @ Acho que eu quis dizer que não funciona durante a execução npm test. Você precisará executar o arquivo sozinho ou pressionar ppara definir um filtro.
21818 Johnslay
3
@johnslay bem, obrigado por ler os comentários anteriores antes de escrever sua resposta eu acho / s :)
escamosa
55

Conforme mencionado em outras respostas, test.onlyapenas filtra outros testes no mesmo arquivo . Portanto, os testes em outros arquivos ainda seriam executados.

Portanto, para executar um único teste, há duas abordagens:

  • Opção 1: se o nome do seu teste for único, você poderá entrar tenquanto estiver no modo de exibição e o nome do teste que deseja executar.

  • Opção 2:

    1. Pressione penquanto estiver no modo de exibição para inserir uma regex para o nome do arquivo que você deseja executar. (Comandos relevantes como este são exibidos quando você executa o Jest no modo de exibição).
    2. Mude itpara it.onlyno teste que você deseja executar.

Com qualquer uma das abordagens acima, o Jest executará apenas o teste único no arquivo que você especificou.

Cory House
fonte
54

Comando completo para executar um único teste Jest

Comando:

node <path-to-jest> -i <you-test-file> -c <jest-config> -t "<test-block-name>"

  • <path-to-jest>:
    • Janelas: node_modules\jest\bin\jest.js
    • Outras: node_modules/.bin/jest
  • -i <you-test-file>: caminho para o arquivo com testes ( jsou ts)
  • -c <jest-config>: caminho para um arquivo de configuração Jest separado (JSON), se você mantiver sua configuração Jest package.json, não precisará especificar esse parâmetro (o Jest o encontrará sem a sua ajuda)
  • -t <the-name-of-test-block>: Na verdade, é um nome (o primeiro parâmetro) de describe(...), it(...)ou test(...)bloco.

Exemplo:

describe("math tests", () => {

  it("1 + 1 = 2", () => {
    expect(1 + 1).toBe(2);
  });

  it("-1 * -1 !== -1", () => {
    expect(-1 * -1).not.toBe(-1);
  });

});

Então, o comando

node node_modules/jest/bin/jest.js -i test/math-tests.js -c test/tests-config.json -t "1 + 1 = 2"

testará it("1 + 1 = 2", ...), mas se você alterar o -tparâmetro para "math tests", ele executará os dois testes no describe("math tests",...)bloco.

Observações:

  1. Para Windows, substitua node_modules/.bin/jestpor node_modules\jest\bin\jest.js.
  2. Essa abordagem permite depurar o script em execução. Para habilitar a depuração, adicione '--inspect-brk'parâmetro ao comando

Executando um teste Jest único por meio de scripts NPM em 'package.json'

Tendo o Jest instalado, você pode simplificar a sintaxe deste comando (acima) usando scripts do NPM . Em "package.json"adicionar um novo script para a "scripts"seção:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t \"math tests\"",
}

Nesse caso, usamos um alias em 'jest'vez de escrever o caminho completo para ele. Além disso, não especificamos o caminho do arquivo de configuração, pois também podemos inseri-lo "package.json"e o Jest analisará por padrão. Agora você pode executar o comando:

npm run test:math

e o "math tests"bloco com dois testes será executado. Ou, é claro, você pode especificar um teste específico por seu nome.

Outra opção seria extrair o <the-name-of-test-block>parâmetro do "test:math"script e passá-lo do comando NPM:

package.json:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t",
}

Comando:

npm run test:math "math tests"

Agora você pode gerenciar o nome do (s) teste (s) de execução com um comando muito mais curto.

Observações:

  1. O 'jest'comando funcionará com scripts do NPM porque

    NPM faz "./node_modules/.bin"a primeira entrada na PATHvariável de ambiente ao executar todos os scripts de ciclo de vida, então isso vai funcionar bem, mesmo se o seu programa não está instalado globalmente ( blogue NPM )

  2. Essa abordagem parece não permitir a depuração porque o Jest é executado via seu binário / CLI , não via node.

Executando o teste Jest selecionado no Visual Studio Code

Se você estiver usando o Visual Studio Code, poderá tirar proveito dele e executar o teste atualmente selecionado (no editor de código) pressionando o F5botão Para fazer isso, precisaremos criar um novo bloco de configuração de inicialização no ".vscode/launch.json"arquivo. Nessa configuração, usaremos variáveis ​​predefinidas que são substituídas pelos valores apropriados (infelizmente nem sempre ) ao executar. De todos os disponíveis, estamos interessados ​​apenas nestes:

  • ${relativeFile} - o arquivo aberto atual relativo a ${workspaceFolder}
  • ${selectedText} - o texto selecionado atual no arquivo ativo

Mas antes de escrever a configuração de lançamento, devemos adicionar o 'test'script em nosso 'package.json'(se ainda não o tivermos).

package.json:

"scripts": {
  "test": "jest"
}

então podemos usá-lo em nossa configuração de lançamento.

Iniciar configuração:

{
  "type": "node",
  "request": "launch",
  "name": "Run selected Jest test",
  "runtimeExecutable": "npm",
  "runtimeArgs": [
    "run-script",
    "test"
  ],
  "args": [
    "--",
    "-i",
    "${relativeFile}",
    "-t",
    "${selectedText}"
  ],
  "console": "integratedTerminal",
}

na verdade, faz o mesmo que os comandos descritos anteriormente nesta resposta. Agora que tudo está pronto, podemos executar qualquer teste que desejarmos sem precisar reescrever os parâmetros de comando manualmente.

Aqui está tudo o que você precisa fazer:

  1. Selecione a configuração de inicialização criada atualmente no painel de depuração:

selecione ativar a configuração no painel de depuração do VSCode

  1. Abra o arquivo com testes no editor de código e selecione o nome do teste que você deseja testar (sem as aspas):

selecione o nome do teste

  1. Pressione o 'F5'botão

E pronto!

Agora, para executar qualquer teste que você deseja, basta abri-lo no editor, selecione seu nome e pressione F5.

Infelizmente, não será "voila" nas máquinas Windows porque elas substituem (quem sabe o porquê) a ${relativeFile}variável pelo caminho com barras invertidas e o Jest não entenderia esse caminho.

Observações:

  1. Para executar no depurador, não se esqueça de adicionar o '--inspect-brk'parâmetro
  2. Neste exemplo de configuração, não temos o parâmetro de configuração do Jest assumindo que ele está incluído 'package.json'.
Sergey
fonte
11
Excelente! Essa deve ser a resposta aceita. Especialmente se adicionar uma menção npxpara simplificar bastante a chamada ao Jest, independentemente do sistema operacional.
Dan Dascalescu 22/03/19
19

Você também pode usar fou xpara focar ou excluir um teste. Por exemplo

fit('only this test will run', () => {
   expect(true).toBe(false);
});

it('this test will not run', () => {
   expect(true).toBe(false);
});

xit('this test will be ignored', () => {
   expect(true).toBe(false);
});
Nima Soroush
fonte
11
Não sei por que essa resposta foi rebaixada, parece responder à pergunta e funciona.
21418 mbbardard
11
xitfuncionou para mim, mas fitnão. Estou usando [email protected].
Hinrich
fittrabalha em [email protected] para mim.
jcubic
Eu acho que a principal desvantagem dessa abordagem é que - se você está apenas tentando detalhar um teste para corrigir um bug - isso implica alterações desnecessárias nos arquivos de teste subjacentes. Se, por qualquer motivo, você quiser manter o código de teste (entre confirmações, digamos), isso pode fazer sentido.
Web20 dez18
ffunciona apenas dentro de um arquivo.
Sergey
14

Como dito acima, você pode executar o comando

jest -t 'fix-order-test'

Se você tem um itinterior de um describebloco, precisa executar

jest -t '<describeString> <itString>'
Wladimir Gramacho
fonte
13

Se você estiver jestexecutando como um comando de script, algo como npm test, será necessário usar o seguinte comando para fazê-lo funcionar:

npm test -- -t "fix order test"
Mugur 'Bud' Chirica
fonte
8

com a versão mais recente do gracejo , você pode usar um dos seguintes para executar apenas um teste, o mesmo para o conjunto de testes.

it.only('test 1', () => {})

test.only('test 1', () => {})

fit('test 1', () => {})

jest 'test 1' também pode funcionar se o nome do teste for único.

código de schrodinger
fonte
4

No VS Code, isso permite executar / depurar apenas um teste Jest, com pontos de interrupção: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Meu launch.jsontem isso dentro:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest All",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["--runInBand"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest Current File",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["${relativeFile}"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    }
  ]
}

e isso em package.json:

  "scripts": {
    "test": "jest"
  }
  • Para executar um teste, nesse teste, altere test(ou it) para test.only(ou it.only). Para executar um conjunto de testes (vários testes), mude describepara describe.only.
  • Defina pontos de interrupção, se desejar.
  • No código VS, vá para o modo de exibição de depuração (Shift + Cmd + D).
  • No menu suspenso na parte superior, escolha Jest Current File.
  • Clique na seta verde para executar esse teste.
Raymond Gan
fonte
No meu caso, sua configuração executa apenas um teste (com it.only (...)), mas não para nos pontos de interrupção :(
Tudor Leustean
Conseguir que o JavaScript atinja pontos de interrupção em um depurador pode ser complicado, devido à sua natureza assíncrona. No VS Code, brinque com onde você coloca seus pontos de interrupção, além dos comandos no menu Debug, até que eles atinjam eles. Se ele continuar pulando pontos de interrupção, coloque-os MAIS ANTES no seu código. Se um arquivo chamar uma função em outro arquivo, coloque o ponto de interrupção nessa chamada de função e, em seguida, "Entre" na chamada para pular arquivos. Brinque com estes comandos de depuração: "Suba, entre, saia e continue"
Raymond Gan
Na verdade, você não precisa "scripts": { "test": "jest" }em package.jsoncausa tiver especificado o caminho completo no "program"parâmetro launch.json.
Sergey
3

Aqui está a minha opinião:

./node_modules/.bin/jest --config test/jest-unit-config.json --runInBand src/components/OpenForm/OpenForm.spec.js -t 'show expanded'

Notas:

  • ./node_modules/.bin/...é uma maneira maravilhosa de acessar o binário jest (ou mocha ou ...) instalado localmente que acompanha o pacote instalado localmente. (sim, em seus scripts npm você pode jestsem nada antes, mas isso é útil na linha de comando ... (isso também é um bom começo para sua configuração de depuração, qualquer que seja o IDE que você esteja usando ...)
  • seu projeto pode não ter um conjunto de opções de configuração. Mas se isso ocorrer (espie os scripts em package.json), é isso que você precisa.
  • --runInBand - como dito, não conheço sua configuração, mas se você se concentra no desenvolvimento / correção de um único teste, prefere não lidar com os trabalhadores da Web ...
  • sim, você pode fornecer todo o caminho explícito para o seu arquivo
  • opcionalmente , você pode usar -tpara não executar todos os testes nesse arquivo, mas apenas um (aqui: aquele que tem algo com ' show expanded' em seu nome). O mesmo efeito pode ser alcançado colando .only()-se nesse arquivo.
Frank Nocke
fonte
3

apenas um pequeno complemento, porque parece que houve uma briga se usar ./node_modules/.bin/jest -i ...ou apenas jest -i ...ounpm test -- -i ...

  1. apenas chamar jestfunciona se você o tiver instalado globalmente (como no npm install -g jest), uma maneira não tão limpa de lidar com dependências
  2. se você tiver o jest instalado apenas localmente no pacote e quiser chamar o script jest sem o desvio do script npm, poderá usar npx jest -i ...=> é exatamente para isso que serve o npx. evita que você escreva./node_modules/.bin/...
Armin Groll
fonte
0

Agora existe um bom plugin de brincadeira para esse chamado, jest-watch-typeaheadque torna esse processo muito mais simples.

rivanov
fonte
0
npm run test -- test-name

Isso funcionará apenas se o nome da sua especificação de teste for único. O código acima faria referência

um arquivo com este nome: test-name.component.spec.ts

tony2tones
fonte