รหัสครอบคลุมกับมอคค่า


288

ฉันใช้มอคค่าสำหรับทดสอบแอปพลิเคชัน NodeJS ของฉัน ฉันไม่สามารถหาวิธีใช้คุณสมบัติครอบคลุมรหัสได้ ฉันลอง googling แล้ว แต่ไม่พบบทแนะนำที่เหมาะสม กรุณาช่วย.

คำตอบ:


410

คุณต้องมีไลบรารีเพิ่มเติมสำหรับการครอบคลุมโค้ดและคุณจะถูกปลิวไปโดยวิธีที่ทรงพลังและง่าย อิสตันบูลเป็น ลองทำสิ่งต่อไปนี้หลังจากที่คุณได้รับการทดสอบมอคค่าของคุณเพื่อผ่าน:

npm install nyc

ตอนนี้เพียงแค่วางคำสั่ง nyc ไว้หน้าคำสั่งทดสอบที่มีอยู่ของคุณตัวอย่างเช่น

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

30
istanbul cover node_modules/mocha/bin/_mochaและถ้าคุณกำลังเรียกใช้รุ่นที่ติดตั้งภายในของมอคค่าลอง
Eric McCarthy

102
หรือติดตั้งทั้ง istanbul และ mocha แบบโลคัลและเพิ่มส่วนต่อไปนี้ในส่วนสคริปต์ของ package.json ของคุณและจากนั้นเพียงเรียกใช้การครอบคลุม npm: "ครอบคลุม": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ มอคค่า / bin / _mocha - --ui bdd -R ข้อมูลจำเพาะ -t 5,000
Dan Kohn

6
ฉันมีปัญหาในการทำให้คำสั่งนี้ทำงานบน windows แต่ด้วยการระบุพา ธ เต็มไปยัง mocha bin ฉันสามารถทำให้มันทำงานได้ istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett

4
$(npm bin)เป็นทางลัดแบบบัญญัติถึง./node_modules/.bin/และistanbul/lib/cli.jsเป็นนามแฝงistanbulในโฟลเดอร์ช่องเก็บ ดังนั้นนี่เป็นคำสั่งที่สั้นกว่า:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth

19
ผู้ใช้ @ Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau

150

ตอนนี้ ( 2020 ) วิธีที่ต้องการใช้อิสตันบูลคือผ่านทาง"ส่วนต่อประสานบรรทัดคำสั่งที่ทันสมัย" ของ nyc nyc

ติดตั้ง

ก่อนติดตั้งในโครงการของคุณด้วย

npm i nyc --save-dev

จากนั้นหากคุณมีโปรเจ็กต์ตาม npm เพียงแค่เปลี่ยนสคริปต์ทดสอบภายในscriptsวัตถุของไฟล์package.jsonของคุณเพื่อดำเนินการครอบคลุมโค้ดของการทดสอบมอคค่าของคุณ:

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

วิ่ง

ตอนนี้ทำการทดสอบของคุณ

npm test

และคุณจะเห็นตารางแบบนี้ในคอนโซลของคุณหลังจากเอาท์พุทการทดสอบของคุณ:

รหัสอิสตันบูล Nyc Mocha

การปรับแต่ง

รายงาน Html

เพียงแค่ใช้

nyc --reporter=html

textแทน ตอนนี้มันจะสร้างรายงานภายใน./coverage/index.htmlตอนนี้มันจะผลิตภายในรายงาน

รูปแบบรายงาน

อิสตันบูลรองรับรูปแบบรายงานที่หลากหลาย เพียงดูที่ห้องสมุดรายงานเพื่อค้นหาสิ่งที่มีประโยชน์ที่สุดสำหรับคุณ เพียงเพิ่ม--reporter=REPORTER_NAMEตัวเลือกสำหรับแต่ละรูปแบบที่คุณต้องการ ตัวอย่างเช่นด้วย

nyc --reporter=html --reporter=text

คุณจะมีทั้งคอนโซลและรายงาน html

อย่าเรียกใช้ความครอบคลุมด้วยการทดสอบ npm

เพียงเพิ่มสคริปต์อื่นในของคุณpackage.jsonและปล่อยให้testสคริปต์มีเพียงนักทดสอบของคุณ (เช่นมอคค่า):

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

ตอนนี้เรียกใช้สคริปต์ที่กำหนดเองนี้

npm run test-with-coverage

เพื่อเรียกใช้การทดสอบที่มีรหัสครอบคลุม

บังคับให้ทดสอบล้มเหลวหากรหัสครอบคลุมต่ำ

ล้มเหลวหากความครอบคลุมรหัสทั้งหมดต่ำกว่า 90%:

nyc --check-coverage --lines 90 

ล้มเหลวหากรหัสครอบคลุมของไฟล์อย่างน้อยหนึ่งไฟล์ต่ำกว่า 90%:

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

2
วิธีนี้ใช้ได้ผลดีกับดอกมะลิเช่นกัน: "nyc --reporter = html jasmine"
Sandip Subedi

12
ขอบคุณสำหรับการเพิ่ม "ตอนนี้ (2017)" - มีประโยชน์จริง ๆ ในโลกจาวาสคริปต์ที่เคลื่อนไหวรวดเร็วนี้
kamahl

2
ในกรณีที่คนอื่นสับสน - พื้นที่เก็บข้อมูล NPM อิสตันบูลดูเหมือนจะถูกแทนที่โดยnyc ตามการอ้างอิงที่ระบุไว้อิสตันบูลถูกแบ่งออกเป็นแพคเกจต่าง ๆ ซึ่งทั้งหมดได้รับการดูแลในอิสตันบูล monorepo
aaaaaa

1
ฉัน--reporter=htmlเปิดใช้งานแล้ว แต่ไฟล์ html นั้นว่างเสมอไม่มีสิ่งใดที่แสดงให้เห็นถึงบล็อกที่ไม่มีการเปิดหรือ% ที่ปกคลุม ฯลฯ เพียงส่วนหัวของตาราง
TGW

2
ดังนั้น ... กรอบที่เรียกว่าอิสตันบูลซึ่งคำสั่ง CLI คือ NYC? เอ่อ ... ฉันไม่เชื่อ!
Tivie

19

Blanket.js ก็ทำงานได้อย่างสมบูรณ์แบบเช่นกัน

npm install --save-dev blanket

นำหน้าการทดสอบ / tests.js ของคุณ

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

วิ่ง mocha -R html-cov > coverage.html


ต้องการ ('แบบครอบคลุม') ({pattern: function (ชื่อไฟล์) {return! /node_modules/.test (ชื่อไฟล์);}});
jsan

4
ตั้งแต่ปี 2015, ผ้าห่ม.jsไม่ได้รับการบำรุงรักษาอีกต่อไปและไม่รองรับ ES6 ขอแนะนำให้อิสตันบูล
teroi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.