Bagaimana cara menjalankan tes tunggal menggunakan Jest?

356

Saya memiliki tes 'berfungsi dengan anak-anak bersarang' di dalam file fix-order-test.js.

Menjalankan di bawah ini menjalankan semua tes dalam file.

jest fix-order-test

Bagaimana cara menjalankan hanya satu tes? Di bawah ini tidak berfungsi karena mencari file regex yang ditentukan.

jest 'works with nested children'
vijayst
sumber
karena Anda menggunakan jest command line, mungkin melalui npm maka cukup tambahkan --testNamePattern 'works with nested children' Opsi Jest CLI #testNamePattern
steven87vt
@BioGenX: tautan sekarang rusak
Dan Dascalescu

Jawaban:

429

Dari baris perintah, gunakan bendera --testNamePatternatau-t

jest -t 'fix-order-test'

Ini hanya akan menjalankan tes yang cocok dengan pola nama tes yang Anda berikan. Ada di dokumen Jest .

Cara lain adalah dengan menjalankan tes dalam mode menonton jest --watchdan kemudian tekan puntuk memfilter tes dengan mengetikkan nama file tes atau tuntuk menjalankan satu nama tes.


Jika Anda memiliki bagian itdalam describeblok, Anda harus menjalankan

jest -t '<describeString> <itString>'
Andreas Köberle
sumber
Saya mendapatkan opsi yang tidak dikenal untuk -t. Ya, dokumentasi menyebutkannya. Bendera telah ditambahkan dalam 16.0. Saya di versi terbaru. jest -help tampaknya tidak menyebutkan bendera. Terima kasih.
vijayst
12
Hanya perhatikan bahwa ini adalah pola pengujian untuk fungsi tes nama spesifik di dalam it()dan bukan nama file. Itulah yang saya pikirkan.
HussienK
70
Jika menggunakan tes npm, yang perlu Anda lakukannpm test -- -t "fix order test"
Sarsaparilla
3
Ini bekerja untuk saya tetapi juga melewatkan setiap tes lain dalam proyek yang lambat untuk proyek besar. Menentukan file tes khusus yang benar-benar membantu dalam pengujian:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932
Bekerja untuk saya tanpa menentukan <describeString>, saya perhatikan ini lebih lambat dari grep moka (-g 'searchString') - tapi saya akan menerimanya :-)
schmoopy
125

Dokumentasi Jest merekomendasikan hal berikut:

Jika tes gagal, salah satu hal pertama yang harus diperiksa adalah apakah tes gagal ketika tes satu-satunya yang berjalan. Dalam Jest itu mudah untuk menjalankan hanya satu tes - hanya sementara mengubah test perintah itu menjaditest.only

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

atau

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});
terkelupas
sumber
7
Bekerja untuk saya dengan lelucon 20.0.4. Meskipun hanya melewatkan sisa tes dalam file itu. Tes di file lain terus berjalan, kecuali Anda sudah membatasi menjalankan ke satu file.
Holf
7
Itu adalah hal yang lucu - karena ia menjalankan tes secara serempak, ia mungkin tidak dapat menentukan tes mana yang akan dijalankan di file mana dari awal. Jadi itu akan menjalankan semua file per default dan DALAM DALAM file memeriksa test.only. Jadi, jika Anda hanya ingin menjalankan satu tes di dalam file yang memiliki banyak kasus uji dalam serangkaian testcases yang terdiri dari banyak file, sayangnya Anda harus menjalankan file tunggal itujest myTestFile.test.js
flaky
@ johnslay: Ya, baru mengujinya
flaky
@ terkelupas kurasa aku bermaksud mengatakan itu tidak bekerja saat berjalan npm test. Anda harus menjalankan file itu sendiri atau menekan puntuk mengatur filter.
johnslay
3
@johnslay dengan baik, terima kasih telah membaca komentar sebelumnya sebelum menulis tanggapan Anda, kurasa / s :)
flaky
55

Seperti disebutkan dalam jawaban lain, test.onlyhanya memfilter tes lain dalam file yang sama . Jadi tes di file lain masih akan berjalan.

Jadi untuk menjalankan tes tunggal, ada dua pendekatan:

  • Opsi 1: Jika nama pengujian Anda unik, Anda dapat memasukkan tsaat dalam mode tonton dan memasukkan nama tes yang ingin Anda jalankan.

  • Pilihan 2:

    1. Tekan psaat dalam mode tonton untuk memasukkan regex untuk nama file yang ingin Anda jalankan. (Perintah yang relevan seperti ini ditampilkan ketika Anda menjalankan Jest dalam mode menonton).
    2. Ubah itke it.onlypada tes yang ingin Anda jalankan.

Dengan salah satu dari pendekatan di atas, Jest hanya akan menjalankan tes tunggal dalam file yang Anda tentukan.

Rumah Cory
sumber
54

Perintah penuh untuk menjalankan uji Jest tunggal

Perintah:

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

  • <path-to-jest>:
    • Windows: node_modules\jest\bin\jest.js
    • Lainnya: node_modules/.bin/jest
  • -i <you-test-file>: path ke file dengan tes ( jsatau ts)
  • -c <jest-config>: path ke file konfigurasi Jest yang terpisah (JSON), jika Anda menyimpan konfigurasi Jest di dalam, package.jsonAnda tidak harus menentukan parameter ini (Jest akan menemukannya tanpa bantuan Anda)
  • -t <the-name-of-test-block>: Sebenarnya itu nama (parameter pertama) dari describe(...), it(...)atau test(...)blok.

Contoh:

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

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

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

});

Jadi, perintahnya

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

akan menguji it("1 + 1 = 2", ...), tetapi jika Anda mengubah -tparameter untuk "math tests"kemudian akan menjalankan kedua tes dari describe("math tests",...)blok.

Catatan:

  1. Untuk Windows ganti node_modules/.bin/jestdengan node_modules\jest\bin\jest.js.
  2. Pendekatan ini memungkinkan Anda untuk men-debug skrip yang sedang berjalan. Untuk mengaktifkan debug, tambahkan '--inspect-brk'parameter ke perintah.

Menjalankan tes Jest tunggal melalui skrip NPM di 'package.json'

Setelah menginstal Jest, Anda dapat menyederhanakan sintaks dari perintah ini (di atas) dengan menggunakan skrip NPM . Di "package.json"tambahkan skrip baru ke "scripts"bagian:

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

Dalam hal ini, kami menggunakan alias 'jest'alih-alih menulis path lengkap ke sana. Selain itu, kami tidak menentukan path file config karena kami juga dapat menempatkannya "package.json"dan Jest akan memeriksanya secara default. Sekarang Anda dapat menjalankan perintah:

npm run test:math

dan "math tests"blok dengan dua tes akan dieksekusi. Atau, tentu saja, Anda dapat menentukan satu tes khusus dengan namanya.

Opsi lain adalah dengan menarik <the-name-of-test-block>parameter di luar "test:math"skrip dan meneruskannya dari perintah NPM:

package.json:

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

Perintah:

npm run test:math "math tests"

Sekarang Anda dapat mengelola nama uji coba dengan perintah yang jauh lebih pendek.

Catatan:

  1. The 'jest'perintah akan bekerja dengan NPM script karena

    npm membuat "./node_modules/.bin"entri pertama dalam PATHvariabel lingkungan ketika menjalankan skrip siklus hidup, jadi ini akan berfungsi dengan baik, bahkan jika program Anda tidak diinstal secara global ( NPM blog )

  2. Pendekatan ini tampaknya tidak memungkinkan debugging karena Jest dijalankan melalui binary / CLI-nya , bukan melalui node.

Menjalankan uji Jest yang dipilih dalam Visual Studio Code

Jika Anda menggunakan Visual Studio Code Anda dapat memanfaatkannya dan menjalankan tes yang saat ini dipilih (dalam editor kode) dengan menekan F5tombol. Untuk melakukan ini, kita perlu membuat blok konfigurasi peluncuran baru di ".vscode/launch.json"file. Dalam konfigurasi itu, kita akan menggunakan variabel yang sudah ditentukan sebelumnya yang diganti dengan nilai yang sesuai (sayangnya tidak selalu ) ketika berjalan. Dari semua yang tersedia, kami hanya tertarik pada ini:

  • ${relativeFile} - file yang dibuka saat ini relatif terhadap ${workspaceFolder}
  • ${selectedText} - teks yang dipilih saat ini dalam file aktif

Tetapi sebelum menulis konfigurasi peluncuran, kita harus menambahkan 'test'skrip ke dalam 'package.json'(jika kita belum memilikinya).

package.json:

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

maka kita dapat menggunakannya dalam konfigurasi peluncuran kita.

Luncurkan konfigurasi:

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

sebenarnya melakukan hal yang sama dengan perintah yang dijelaskan sebelumnya dalam jawaban ini. Sekarang semuanya sudah siap, kita dapat menjalankan tes apa pun yang kita inginkan tanpa harus menulis ulang parameter perintah secara manual.

Inilah yang perlu Anda lakukan:

  1. Pilih konfigurasi peluncuran yang saat ini dibuat di panel debug:

pilih konfigurasi peluncuran di panel debug VSCode

  1. Buka file dengan tes di editor kode dan pilih nama tes yang ingin Anda uji (tanpa tanda kutip):

pilih nama tes

  1. Tekan 'F5'tombol.

Dan voila!

Sekarang untuk menjalankan tes yang Anda inginkan, cukup buka di editor, pilih namanya dan tekan F5.

Sayangnya, itu tidak akan menjadi "voila" pada mesin Windows karena mereka mengganti (siapa yang tahu mengapa) ${relativeFile}variabel dengan path yang telah membalikkan garis miring dan Jest tidak akan mengerti jalan seperti itu.

Catatan:

  1. Untuk berjalan di bawah debugger jangan lupa untuk menambahkan '--inspect-brk'parameter.
  2. Dalam contoh konfigurasi ini, kami tidak memiliki parameter konfigurasi Jest dengan asumsi bahwa itu termasuk dalam 'package.json'.
Sergey
sumber
1
Luar biasa! Ini harus menjadi jawaban yang diterima. Terutama jika itu menambahkan menyebutkan npxuntuk sangat menyederhanakan memanggil Jest, terlepas dari OS.
Dan Dascalescu
19

Anda juga dapat menggunakan fatau xuntuk memfokuskan atau mengecualikan tes. Sebagai contoh

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
sumber
1
Tidak yakin mengapa jawaban ini dibatalkan, sepertinya menjawab pertanyaan dan berhasil.
mbillard
1
xitmemang bekerja untuk saya, tetapi fittidak. saya menggunakan [email protected].
Hinrich
fitbekerja di [email protected] untuk saya.
jcubic
Saya pikir bahwa kelemahan utama dari pendekatan ini adalah bahwa - jika Anda hanya mencoba menelusuri satu tes untuk memperbaiki bug - itu memerlukan perubahan yang tidak perlu pada file pengujian yang mendasarinya. Jika, untuk alasan apa pun, Anda ingin mempertahankan kode uji (lintas komit, katakanlah) maka ini mungkin masuk akal.
webelo
fini hanya berfungsi dalam satu file.
Sergey
14

Seperti dikatakan di atas, Anda dapat menjalankan perintah

jest -t 'fix-order-test'

Jika Anda memiliki bagian itdalam describeblok, Anda harus menjalankan

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

Jika Anda telah jestmenjalankan sebagai perintah skrip, sesuatu seperti npm test, Anda perlu menggunakan perintah berikut untuk membuatnya berfungsi:

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

dengan versi lelucon terbaru , Anda dapat menggunakan salah satu dari yang berikut untuk hanya menjalankan satu tes, sama untuk test suite.

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

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

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

jest 'test 1' dapat bekerja juga jika nama tes unik.

kode schrodinger
sumber
4

Dalam VS Code, ini saya jalankan / debug hanya 1 uji Jest, dengan breakpoints: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Saya launch.jsonmemiliki ini di dalam:

{
  "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",
      }
    }
  ]
}

dan ini di package.json:

  "scripts": {
    "test": "jest"
  }
  • Untuk menjalankan 1 tes, dalam tes itu, ubah test(atau it) menjadi test.only(atau it.only). Untuk menjalankan 1 test suite (beberapa tes), ubah describeke describe.only.
  • Atur breakpoint jika Anda mau.
  • Dalam VS Code, buka Debug View (Shift + Cmd + D).
  • Dari menu tarik-turun di atas, pilih Jest Current File.
  • Klik panah hijau untuk menjalankan tes itu.
Raymond Gan
sumber
Dalam kasus saya, konfigurasi Anda hanya menjalankan satu tes (with it.only (...)), tetapi konfigurasi tidak berhenti di breakpoints :(
Tudor Leustean
Mendapatkan JavaScript untuk mencapai breakpoints dalam debugger bisa rumit, karena sifatnya yang tidak sinkron. Dalam VS Code, bermain-main dengan tempat Anda meletakkan breakpoints Anda, ditambah perintah di menu Debug, hingga menyentuh mereka. Jika terus melewati breakpoint, letakkan lebih awal di kode Anda. Jika 1 file memanggil fungsi di file lain, letakkan breakpoint di panggilan fungsi itu, lalu "Langkah Ke" panggilan untuk melompati file. Mainkan dengan perintah-perintah Debug ini: "Step Over, Step Into, Step Out, Continue"
Raymond Gan
Sebenarnya, Anda tidak perlu "scripts": { "test": "jest" }masuk package.jsonkarena Anda telah menentukan path lengkap pada "program"parameter di launch.json.
Sergey
4

hanya sedikit add-on, karena sepertinya ada semacam perkelahian jika menggunakan ./node_modules/.bin/jest -i ...atau sekadar jest -i ...ataunpm test -- -i ...

  1. hanya menelepon jestberfungsi jika Anda menginstalnya secara global (seperti halnya npm install -g jest), cara penanganan dependensi yang tidak begitu bersih
  2. jika Anda memiliki lelucon yang hanya diinstal secara lokal dalam paket dan ingin memanggil skrip lelucon tanpa jalan memutar skrip npm, Anda dapat menggunakan npx jest -i ...=> inilah tujuan dari npx. menyelamatkan Anda dari menulis./node_modules/.bin/...
Armin Groll
sumber
3

Ini saya ambil:

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

Catatan:

  • ./node_modules/.bin/...adalah cara yang luar biasa, untuk mengakses binary yang diinstal secara lokal (atau moka atau ...) yang disertakan dengan paket yang diinstal secara lokal. (ya, dalam skrip npm Anda, Anda tidak dapat jestapa-apa sebelumnya, tetapi ini berguna pada baris perintah ... (itu juga awal yang baik untuk konfigurasi debug Anda, IDE mana pun yang Anda gunakan ...)
  • proyek Anda mungkin tidak memiliki satu set opsi konfigurasi. Tetapi jika ya (intip di skrip package.json), inilah yang Anda butuhkan.
  • --runInBand - seperti yang dikatakan, tidak tahu tentang konfigurasi Anda, tetapi jika Anda berkonsentrasi pada pengembangan / perbaikan satu tes, Anda lebih suka tidak ingin berurusan dengan pekerja web ...
  • ya, Anda bisa memberikan keseluruhan, jalur eksplisit ke file Anda
  • opsional , Anda dapat menggunakan -tuntuk tidak menjalankan semua tes dalam file itu tetapi hanya satu (di sini: yang memiliki sesuatu dengan ' show expanded' dalam namanya). Efek yang sama dapat dicapai dengan menempel .only()ke file itu.
Frank Nocke
sumber
0

Sekarang ada plugin lelucon yang bagus untuk ini disebut jest-watch-typeaheaditu membuat proses ini jauh lebih sederhana.

rivanov
sumber
0
npm run test -- test-name

Ini hanya akan berfungsi jika nama spec pengujian Anda unik. Kode di atas akan referensi

file dengan nama ini: test-name.component.spec.ts

nada2 tony2
sumber