Cakupan kode dengan Mocha

288

Saya menggunakan Mocha untuk menguji aplikasi NodeJS saya. Saya tidak dapat menemukan cara menggunakan fitur jangkauan kode-nya. Saya mencoba googling tetapi tidak menemukan tutorial yang tepat. Tolong bantu.

tusharmath
sumber

Jawaban:

410

Anda memerlukan perpustakaan tambahan untuk cakupan kode, dan Anda akan terpesona oleh seberapa kuat dan mudah istanbul itu. Coba yang berikut ini, setelah Anda lulus tes moka:

npm install nyc

Sekarang, cukup tempatkan perintah nyc di depan perintah tes yang ada, misalnya:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
sumber
30
Dan jika Anda menjalankan versi moka yang dipasang secara lokal, coba istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
Atau, instal istanbul dan mocha secara lokal, dan tambahkan berikut ini ke bagian skrip package.json Anda dan kemudian jalankan cakupan npm: "coverage": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn
6
Saya kesulitan menjalankan perintah ini di windows, tetapi dengan menentukan path lengkap ke mocha bin, saya bisa membuatnya bekerja. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett
4
$(npm bin)adalah jalan pintas kanonik ke ./node_modules/.bin/, dan istanbul/lib/cli.jsalias ke istanbuldalam folder bin. Jadi, inilah perintah yang lebih pendek:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth
19
@ Pengguna Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
150

Sekarang ( 2020 ) cara yang lebih disukai untuk menggunakan istanbul adalah melalui antarmuka "state of the art command line" nyc .

Mempersiapkan

Pertama, instal di proyek Anda dengan

npm i nyc --save-dev

Kemudian, jika Anda memiliki proyek berbasis npm, cukup ubah skrip pengujian di dalam scriptsobjek file package.json Anda untuk mengeksekusi cakupan kode pengujian mocha Anda :

{
  "scripts": {
    "test": "nyc --reporter=text mocha"
  }
}

Lari

Sekarang jalankan tes Anda

npm test

dan Anda akan melihat tabel seperti ini di konsol Anda, tepat setelah hasil tes Anda:

Cakupan kode Istanbul Nyc Mocha

Kustomisasi

Laporan html

Gunakan saja

nyc --reporter=html

bukannya text. Sekarang akan menghasilkan laporan di dalamnya ./coverage/index.html.

Format laporan

Istanbul mendukung beragam format laporan. Lihat saja perpustakaan laporannya untuk menemukan yang paling berguna bagi Anda. Cukup tambahkan --reporter=REPORTER_NAMEopsi untuk setiap format yang Anda inginkan. Misalnya dengan

nyc --reporter=html --reporter=text

Anda akan memiliki konsol dan laporan html.

Jangan jalankan cakupan dengan uji npm

Cukup tambahkan skrip lain di dalam Anda package.jsondan tinggalkan testskrip dengan hanya pelari ujian Anda (mis. Mocha):

{
  "scripts": {
    "test": "mocha",
    "test-with-coverage": "nyc --reporter=text mocha"
  }
}

Sekarang jalankan skrip khusus ini

npm run test-with-coverage

untuk menjalankan tes dengan cakupan kode.

Tes paksa gagal jika cakupan kode rendah

Gagal jika cakupan kode total di bawah 90%:

nyc --check-coverage --lines 90 

Gagal jika cakupan kode dari setidaknya satu file di bawah 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
sumber
2
Ini berfungsi dengan baik untuk melati juga: "nyc --reporter = html jasmine"
Sandip Subedi
12
terima kasih telah menambahkan "sekarang (2017)" - sangat membantu dalam dunia javascript yang bergerak cepat ini
kamahl
2
Dalam kasus orang lain bingung - istanbul repositori npm tampaknya telah digantikan oleh nyc . Sesuai dengan dependensinya yang tercantum, istanbul dipecah menjadi beberapa paket yang semuanya disimpan dalam istanbuljs monorepo
aaaaaa
1
Saya memiliki yang --reporter=htmldiaktifkan tetapi file html selalu kosong, tidak ada yang ditampilkan tentang blok yang tidak ditemukan atau% tertutup dll. Hanya header tabel
TGW
1
Jadi ... kerangka kerja yang disebut Istanbul yang perintah CLI-nya NYC? err ... saya tidak percaya itu!
Tivie
19

Blanket.js juga berfungsi dengan sempurna.

npm install --save-dev blanket

di depan tes / tests.js Anda

require('blanket')({
    pattern: function (filename) {
        return !/node_modules/.test(filename);
    }
});

Lari mocha -R html-cov > coverage.html

jsan
sumber
membutuhkan ('blanket') ({pattern: function (filename) {return! /node_modules/.test (filename);}});
jsan
4
Pada 2015, blanket.js tidak dipertahankan lagi dan tidak mendukung ES6. Istanbul sangat dianjurkan.
teroi