Mã bảo hiểm với Mocha


288

Tôi đang sử dụng Mocha để thử nghiệm ứng dụng NodeJS của mình. Tôi không thể tìm ra cách sử dụng tính năng bao phủ mã của nó. Tôi đã thử googling nó nhưng không tìm thấy bất kỳ hướng dẫn thích hợp. Xin vui lòng giúp đỡ.

Câu trả lời:


410

Bạn cần một thư viện bổ sung cho phạm vi bảo hiểm mã, và bạn sẽ bị thổi bay bởi istanbul mạnh mẽ và dễ dàng như thế nào . Hãy thử làm như sau, sau khi bạn vượt qua bài kiểm tra mocha của mình:

npm install nyc

Bây giờ, chỉ cần đặt lệnh nyc trước lệnh kiểm tra hiện tại của bạn, ví dụ:

{
  "scripts": {
    "test": "nyc mocha"
  }
}

30
Và nếu bạn đang chạy phiên bản mocha được cài đặt cục bộ, hãy thử istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy

102
Hoặc, cài đặt cả istanbul và mocha cục bộ và thêm phần sau vào phần tập lệnh của gói.json và sau đó chỉ chạy vùng phủ sóng: "vùng phủ sóng": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn

6
Tôi gặp khó khăn khi nhận lệnh này để chạy trên windows, nhưng bằng cách chỉ định đường dẫn đầy đủ đến thùng mocha, tôi đã có thể làm cho nó hoạt động. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett

4
$(npm bin)là một lối tắt chính tắc đến ./node_modules/.bin/istanbul/lib/cli.jsđược đặt bí danh istanbultrong thư mục bin. Vì vậy, đây là một lệnh ngắn hơn:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth

19
@ Người dùng Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Cầu tàu-Luc Gendreau

150

Bây giờ ( 2020 ) cách ưa thích để sử dụng istanbul là thông qua "giao diện dòng lệnh nghệ thuật" nyc .

Thiết lập

Đầu tiên, cài đặt nó trong dự án của bạn với

npm i nyc --save-dev

Sau đó, nếu bạn có một dự án dựa trên npm, chỉ cần thay đổi tập lệnh kiểm tra bên trong scriptsđối tượng của tệp pack.json để thực thi phạm vi bảo hiểm mã của các bài kiểm tra mocha của bạn :

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

Chạy

Bây giờ hãy chạy thử nghiệm của bạn

npm test

và bạn sẽ thấy một bảng như thế này trong bảng điều khiển của bạn, ngay sau khi kết quả kiểm tra của bạn:

Bảo hiểm mã Istanbul Nyc Mocha

Tùy biến

Báo cáo Html

Chỉ dùng

nyc --reporter=html

thay vì text. Bây giờ nó sẽ tạo ra một báo cáo bên trong ./coverage/index.html.

Định dạng báo cáo

Istanbul hỗ trợ một loạt các định dạng báo cáo. Chỉ cần nhìn vào thư viện báo cáo của nó để tìm thấy hữu ích nhất cho bạn. Chỉ cần thêm một --reporter=REPORTER_NAMEtùy chọn cho mỗi định dạng bạn muốn. Ví dụ với

nyc --reporter=html --reporter=text

bạn sẽ có cả bảng điều khiển và báo cáo html.

Đừng chạy bảo hiểm với thử nghiệm npm

Chỉ cần thêm một tập lệnh khác vào của bạn package.jsonvà để lại testtập lệnh chỉ với người chạy thử nghiệm của bạn (ví dụ: mocha):

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

Bây giờ chạy tập lệnh tùy chỉnh này

npm run test-with-coverage

để chạy thử nghiệm với phạm vi bảo hiểm mã.

Kiểm tra lực lượng không thành công nếu phạm vi bảo hiểm mã thấp

Thất bại nếu tổng phạm vi bảo hiểm dưới 90%:

nyc --check-coverage --lines 90 

Không thành công nếu phạm vi bảo hiểm của ít nhất một tệp dưới 90%:

nyc --check-coverage --lines 90 --per-file

2
Điều này cũng hoạt động hoàn hảo cho hoa nhài: "nyc --reporter = html jasmine"
Sandip Subedi

12
cảm ơn vì đã thêm "now (2017)" - thực sự hữu ích trong thế giới javascript chuyển động nhanh này
kamahl

2
Trong trường hợp bất cứ ai khác bị nhầm lẫn - kho lưu trữ npm istanbul dường như đã bị áp đảo bởi nyc . Theo các phụ thuộc được liệt kê của nó, istanbul đã được chia thành các gói khác nhau được duy trì trong monorepo istanbuljs
aaaaaa

1
Tôi đang --reporter=htmlkích hoạt nhưng tệp html luôn trống, không có gì hiển thị về các khối chưa được khám phá hoặc% được bảo hiểm, v.v. chỉ là các tiêu đề của bảng
TGW

1
Vậy ... một khung gọi là Istanbul có lệnh CLI là NYC? ồ ... tôi không tin tưởng nó
Tivie

19

Chăn.js cũng hoạt động hoàn hảo.

npm install --save-dev blanket

ở phía trước bài kiểm tra / tests.js của bạn

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

chạy mocha -R html-cov > coverage.html


Yêu cầu ('blanket') ({mẫu: function (tên tệp) {return! /node_modules/.test (tên tệp);}});
jsan

4
Kể từ năm 2015, blanket.js không được duy trì nữa và không hỗ trợ ES6. Istanbul rất được khuyến khích.
teroi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.