Bagaimana cara menjalankan tes Jest secara berurutan?

152

Saya menjalankan tes Jest melalui npm test. Jest menjalankan tes secara paralel secara default. Apakah ada cara untuk membuat pengujian berjalan secara berurutan?

Saya memiliki beberapa tes yang memanggil kode pihak ketiga yang bergantung pada perubahan direktori kerja saat ini.

Martin Konicek
sumber

Jawaban:

235

Opsi CLI didokumentasikan dan juga dapat diakses dengan menjalankan perintah jest --help.

Anda akan melihat opsi yang Anda cari: --runInBand.

ncuillery
sumber
7
Terima kasih banyak! Apakah itu npm test --runInBand? Offtopic: Tidak yakin dari mana asal nama "band". --runSequentially mungkin akan lebih masuk akal :)
Martin Konicek
13
@ArtinKonicek npm test -- --runInBandbenar.
Ondrej Slinták
47
Sayangnya, fakta bahwa urutan eksekusi tidak dapat dikontrol membuat Jest tidak berguna untuk pengujian integrasi.
Evan B.
22
@Evan Fakta Anda membutuhkan tes Anda dijalankan dalam urutan tertentu adalah bau.
Nico Van Belle
26
@NicoVanBelle Ini hanyalah harga yang Anda bayarkan untuk pengujian ujung ke ujung yang benar dari sistem stateful yang cukup kompleks. Saya terbuka untuk alternatif, tetapi saya belum melihat solusi yang tidak melibatkan secara naif menukar bagian-bagian kunci dari tumpukan atau reset database yang sangat lambat di antara pengujian. Tidak berarti Jest adalah alat yang buruk, hanya alat yang salah untuk tes jenis ini.
Evan B.
23

Saya masih terbiasa dengan Jest, tetapi tampaknya mendeskripsikan blok berjalan secara sinkron sedangkan blok pengujian berjalan secara asinkron. Saya menjalankan beberapa blok deskripsi dalam deskripsi luar yang terlihat seperti ini:

describe
    describe
        test1
        test2

    describe
        test3

Dalam hal ini, test3tidak berjalan sampai test2selesai karena test3berada dalam blok yang menjelaskan yang mengikuti blok yang berisi test2.

SuperCodeBrah
sumber
2
Mungkin masih akan berjalan secara paralel.
LCB
Ini bagus. Memungkinkan untuk memeriksa perilaku dengan variabel lingkungan yang hilang, kemudian mengatur variabel dan melakukan tes lebih lanjut.
Attaque
IMO ini harus menjadi jawaban yang diterima. Lebih mudah daripada berurusan dengan opsi CLI atau menentukan sequencer.
ZCaceres
15

Ini berfungsi untuk saya memastikan berjalannya sekuensial dari tes modul yang dipisahkan dengan baik:

1) Simpan tes dalam file terpisah, tetapi tanpa spec/testpenamaan.

|__testsToRunSequentially.test.js
|__tests
   |__testSuite1.js
   |__testSuite2.js
   |__index.js

2) File dengan rangkaian pengujian juga akan terlihat seperti ini (testSuite1.js):

export const testSuite1 = () => describe(/*your suite inside*/)

3) Impor testToRunSequentially.test.jsdan jalankan dengan --runInBand:

import { testSuite1, testSuite2 } from './tests'

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
sumber
1
Anda tidak perlu menjalankan dengan --runInBand karena Anda sudah memiliki dua rangkaian pengujian. Suite Uji Anak dijalankan secara berurutan.
RICKY KUMAR
10

Gunakan runner pengujian serial:

npm install jest-serial-runner --save-dev

Siapkan lelucon untuk menggunakannya, misalnya di jest.config.js:

module.exports = {
   ...,
   runner: 'jest-serial-runner'
};

Anda dapat menggunakan fitur proyek untuk menerapkannya hanya pada subset pengujian. Lihat https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
sumber
Anda dapat menggunakan fitur proyek untuk menggunakannya hanya untuk subset pengujian. , Bagaimana?
Nux
1
@Nux Pengaturan konfigurasi 'proyek' di Jest memungkinkan Anda menerapkan pengaturan konfigurasi lain secara selektif ke rangkaian pengujian tertentu. Jawaban diperbarui dengan tautan ke dokumen dan contoh.
Joachim Lous
6

Seperti disalin dari https://github.com/facebook/jest/issues/6194#issuecomment-419837314

test.spec.js

import { signuptests } from './signup'
import { logintests } from './login'

describe('Signup', signuptests)
describe('Login', logintests)

signup.js

export const signuptests = () => {
     it('Should have login elements', () => {});
     it('Should Signup', () => {}});
}

login.js

export const logintests = () => {
    it('Should Login', () => {}});
}
Mor Shemesh
sumber