ฉันจะรันการทดสอบเดี่ยวโดยใช้ Jest ได้อย่างไร


356

ฉันมีการทดสอบ 'ทำงานกับเด็กที่ซ้อนกัน' ภายในไฟล์ fix-order-test.js

การรันด้านล่างจะเป็นการทดสอบทั้งหมดในไฟล์

jest fix-order-test

ฉันจะรันการทดสอบเพียงครั้งเดียวได้อย่างไร ด้านล่างไม่ทำงานตามที่ค้นหาไฟล์ของ regex ที่ระบุ

jest 'works with nested children'


ตั้งแต่ใช้คำสั่ง jest ของคุณอาจผ่าน npm แล้วเพียงเพิ่ม--testNamePattern 'works with nested children' ตัวเลือก Jest CLI #testNamePattern
steven87vt

@BioGenX: ตอนนี้ลิงก์เสีย
Dan Dascalescu

คำตอบ:


429

จากบรรทัดคำสั่งใช้--testNamePatternหรือ-tตั้งค่าสถานะ

jest -t 'fix-order-test'

สิ่งนี้จะทำการทดสอบที่ตรงกับรูปแบบชื่อการทดสอบที่คุณระบุเท่านั้น มันอยู่ในเอกสารล้อเล่น

อีกวิธีหนึ่งคือเรียกใช้การทดสอบในโหมดดูjest --watchแล้วกดpเพื่อกรองการทดสอบโดยพิมพ์ชื่อไฟล์ทดสอบหรือtเพื่อรันชื่อการทดสอบเดียว


หากคุณมีส่วนitในของdescribeบล็อกคุณจะต้องเรียกใช้

jest -t '<describeString> <itString>'

ฉันได้รับตัวเลือกที่ไม่รู้จักสำหรับ -t ใช่เอกสารนั้นไม่ได้พูดถึง เพิ่มค่าสถานะใน 16.0 แล้ว ฉันเป็นเวอร์ชั่นล่าสุด ล้อเล่น - ช่วยดูเหมือนจะไม่พูดถึงธง ขอบคุณ
vijayst

12
โปรดทราบว่านี่เป็นรูปแบบการทดสอบสำหรับชื่อการทดสอบเฉพาะภายในit()ฟังก์ชั่นไม่ใช่ชื่อไฟล์ นั่นคือสิ่งที่ฉันคิด
HussienK

70
หากใช้การทดสอบ npm คุณต้องทำnpm test -- -t "fix order test"
Sarsaparilla

3
วิธีนี้ใช้ได้ผลสำหรับฉัน แต่ก็ข้ามการทดสอบอื่น ๆ ในโครงการซึ่งช้าสำหรับโครงการขนาดใหญ่ การระบุไฟล์ทดสอบเฉพาะที่การทดสอบนั้นช่วยได้จริง ๆ :./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932

ใช้งานได้กับฉันโดยไม่ระบุ <describeString> ฉันสังเกตว่ามันช้ากว่า grep ของมอคค่า (-g 'searchString') - แต่ฉันจะเอามัน :-)
schmoopy

125

เอกสาร Jestแนะนำสิ่งต่อไปนี้:

หากการทดสอบล้มเหลวหนึ่งในสิ่งแรกที่ควรตรวจสอบคือการทดสอบล้มเหลวหรือไม่หากเป็นการทดสอบเพียงครั้งเดียวที่ทำงาน ใน Jest นั้นง่ายต่อการรันเพียงการทดสอบเดียว - เพียงแค่เปลี่ยนtest คำสั่งนั้นเป็นชั่วคราวtest.only

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

หรือ

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

7
ทำงานได้กับฉันด้วยความตลกขบขัน 20.0.4 แม้ว่าจะข้ามการทดสอบที่เหลือในไฟล์นั้นไปเท่านั้น การทดสอบในไฟล์อื่น ๆ จะยังคงทำงานต่อไปหากคุณไม่ได้ จำกัด การใช้งานไฟล์เดียว
Holf

7
แม้ว่าจะเป็นเรื่องตลก - เพราะมันทำการทดสอบแบบอะซิงโครนัสจึงไม่สามารถระบุได้ว่าการทดสอบใดที่จะรันในไฟล์ตั้งแต่ต้น test.onlyดังนั้นมันจะเรียกใช้ไฟล์ทั้งหมดต่อการเริ่มต้นและภายในแฟ้มตรวจสอบ ดังนั้นถ้าคุณเพียงต้องการที่จะเรียกใช้การทดสอบหนึ่งที่อยู่ในแฟ้มที่มีกรณีทดสอบมากมายภายในชุดของ testcases ที่ประกอบด้วยไฟล์จำนวนมากคุณมีเพื่อให้ทำงานที่น่าเสียดายว่าไฟล์เดียวjest myTestFile.test.js
ขุย

@johnslay: มันไม่ได้เป็นเพียงแค่การทดสอบมัน
ขุย

@flaky npm testผมคิดว่าผมหมายถึงว่ามันไม่ทำงานเมื่อทำงาน คุณจะต้องเรียกใช้ไฟล์ด้วยตัวเองหรือกดpเพื่อตั้งค่าตัวกรอง
johnslay

3
@ Johnslay เป็นอย่างดีขอบคุณสำหรับการอ่านความคิดเห็นก่อนหน้านี้ก่อนที่จะเขียนคำตอบของคุณฉันเดา / s :)
สะบัด

55

ตามที่ระบุไว้ในคำตอบอื่น ๆtest.onlyเพียงกรองการทดสอบอื่น ๆ ในไฟล์เดียวกัน ดังนั้นการทดสอบไฟล์อื่น ๆ จะยังคงทำงานอยู่

ดังนั้นเพื่อทำการทดสอบเดี่ยวมีสองวิธีคือ:

  • ตัวเลือกที่ 1: หากชื่อการทดสอบของคุณไม่ซ้ำกันคุณสามารถป้อนtในขณะที่อยู่ในโหมดดูและป้อนชื่อของการทดสอบที่คุณต้องการเรียกใช้

  • ตัวเลือก 2:

    1. กดpปุ่มขณะที่อยู่ในโหมดดูเพื่อป้อน regex สำหรับชื่อไฟล์ที่คุณต้องการเรียกใช้ (คำสั่งที่เกี่ยวข้องเช่นนี้จะปรากฏขึ้นเมื่อคุณเรียกใช้ Jest ในโหมดดู)
    2. เปลี่ยนitไปit.onlyในการทดสอบที่คุณต้องการที่จะทำงาน

ด้วยวิธีใดวิธีหนึ่งข้างต้น Jest จะเรียกใช้การทดสอบเดี่ยวในไฟล์ที่คุณระบุเท่านั้น


54

คำสั่งแบบเต็มเพื่อรันการทดสอบ Jest เดียว

คำสั่ง:

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
    • อื่น ๆ : node_modules/.bin/jest
  • -i <you-test-file>: พา ธ ไปยังไฟล์ด้วยการทดสอบ ( jsหรือts)
  • -c <jest-config>: พา ธ ไปยังไฟล์ Jest config (JSON) แยกต่างหากหากคุณเก็บการกำหนดค่า Jest ไว้ในนั้นpackage.jsonคุณไม่จำเป็นต้องระบุพารามิเตอร์นี้ (Jest จะค้นหาได้โดยไม่ต้องใช้ตัวช่วย)
  • -t <the-name-of-test-block>: ที่จริงมันเป็นชื่อ (พารามิเตอร์แรก) ของdescribe(...), it(...)หรือtest(...)บล็อก

ตัวอย่าง:

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

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

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

});

ดังนั้นคำสั่ง

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

จะทดสอบit("1 + 1 = 2", ...)แต่ถ้าคุณเปลี่ยน-tพารามิเตอร์เป็น"math tests"แล้วมันจะเรียกใช้การทดสอบทั้งสองจากdescribe("math tests",...)บล็อก

หมายเหตุ:

  1. สำหรับ Windows แทนที่ด้วยnode_modules/.bin/jestnode_modules\jest\bin\jest.js
  2. วิธีนี้ช่วยให้คุณสามารถดีบักสคริปต์ที่ทำงานอยู่ เพื่อเปิดใช้งานการดีบักเพิ่ม'--inspect-brk'พารามิเตอร์ให้กับคำสั่ง

รันการทดสอบ Jest เดียวผ่านสคริปต์ NPM ใน 'package.json'

มีการติดตั้งล้อเล่นคุณสามารถลดความซับซ้อนของไวยากรณ์ของคำสั่งนี้ (เหนือ) โดยใช้สคริปต์ NPM ในการ"package.json"เพิ่มสคริปต์ใหม่ใน"scripts"ส่วน:

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

ในกรณีนี้เราใช้นามแฝง'jest'แทนการเขียนเส้นทางแบบเต็มไปยังมัน นอกจากนี้เราไม่ได้ระบุพา ธ ของไฟล์กำหนดค่าเนื่องจากเราสามารถวางไว้ในช่องได้"package.json"เช่นกันและ Jest จะตรวจสอบตามค่าเริ่มต้น ตอนนี้คุณสามารถเรียกใช้คำสั่ง:

npm run test:math

และ"math tests"บล็อกที่มีการทดสอบสองครั้งจะถูกดำเนินการ หรือแน่นอนคุณสามารถระบุการทดสอบหนึ่งอย่างโดยใช้ชื่อ

ตัวเลือกอื่นจะดึง<the-name-of-test-block>พารามิเตอร์ภายนอก"test:math"สคริปต์และส่งผ่านจากคำสั่ง NPM:

package.json:

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

คำสั่ง:

npm run test:math "math tests"

ตอนนี้คุณสามารถจัดการชื่อของการทดสอบรันด้วยคำสั่งที่สั้นกว่ามาก

หมายเหตุ:

  1. 'jest'คำสั่งจะทำงานร่วมกับสคริปต์ NPM เพราะ

    npmสร้าง"./node_modules/.bin"รายการแรกในPATHตัวแปรสภาพแวดล้อมเมื่อเรียกใช้สคริปต์วงจรชีวิตใด ๆ ดังนั้นสิ่งนี้จะทำงานได้ดีแม้ว่าโปรแกรมของคุณจะไม่ได้ติดตั้งทั่วโลก ( บล็อก NPM )

  2. วิธีนี้ดูเหมือนจะไม่อนุญาตให้มีการแก้จุดบกพร่องเพราะเจ็ทจะดำเนินการผ่านทางไบนารี / CLInodeไม่ผ่าน

เรียกใช้การทดสอบ Jest ที่เลือกในรหัส Visual Studio

หากคุณใช้รหัส Visual Studio คุณสามารถใช้ประโยชน์จากมันและเรียกใช้การทดสอบที่เลือกในปัจจุบัน (ในตัวแก้ไขรหัส) โดยการกดF5ปุ่ม ในการทำเช่นนี้เราจะต้องสร้างบล็อกการกำหนดค่าการเปิดตัวใหม่ใน".vscode/launch.json"ไฟล์ ในการกำหนดค่านั้นเราจะใช้ตัวแปรที่กำหนดไว้ล่วงหน้าซึ่งจะถูกแทนที่ด้วยค่าที่เหมาะสม (น่าเสียดายที่ไม่เสมอไป ) เมื่อใช้งาน เรามีความสนใจเฉพาะในสิ่งเหล่านี้:

  • ${relativeFile} - ไฟล์ที่เปิดปัจจุบันเทียบกับ ${workspaceFolder}
  • ${selectedText} - ข้อความที่เลือกในปัจจุบันในไฟล์ที่ใช้งานอยู่

แต่ก่อนที่จะเขียนการกำหนดค่าเริ่มต้นเราควรเพิ่ม'test'สคริปต์ในของเรา'package.json'(ถ้าเรายังไม่มี)

package.json:

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

จากนั้นเราสามารถใช้มันในการกำหนดค่าเริ่มต้นของเรา

เรียกใช้การกำหนดค่า:

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

จริง ๆ แล้วมันเหมือนกับคำสั่งที่อธิบายไว้ก่อนหน้าในคำตอบนี้ ตอนนี้ทุกอย่างพร้อมเราสามารถเรียกใช้การทดสอบใด ๆ ที่เราต้องการโดยไม่ต้องเขียนพารามิเตอร์คำสั่งด้วยตนเอง

นี่คือทั้งหมดที่คุณต้องทำ:

  1. เลือกการกำหนดค่าเริ่มต้นที่สร้างขึ้นในแผงการดีบัก:

เลือกเรียกใช้การกำหนดค่าในแผงการดีบัก VSCode

  1. เปิดไฟล์ที่มีการทดสอบในเครื่องมือแก้ไขโค้ดและเลือกชื่อการทดสอบที่คุณต้องการทดสอบ (โดยไม่ใส่เครื่องหมายอัญประกาศ):

เลือกชื่อการทดสอบ

  1. กด'F5'ปุ่ม

และ voila!

ตอนนี้เพื่อรันการทดสอบใด ๆ ที่คุณต้องการเปิดในตัวแก้ไขเลือกชื่อแล้วกด F5

น่าเสียดายที่มันไม่ได้เป็น "voila" บนเครื่อง Windows เพราะมันใช้แทน (ใครจะรู้สาเหตุ) ${relativeFile}ตัวแปรที่มีพา ธ ที่มีเครื่องหมายแบ็กสแลชและเจสต์จะไม่เข้าใจเส้นทางดังกล่าว

หมายเหตุ:

  1. ในการรันภายใต้ตัวดีบั๊กอย่าลืมเพิ่ม'--inspect-brk'พารามิเตอร์
  2. 'package.json'ในตัวอย่างการกำหนดค่านี้เราไม่ได้มีการกำหนดค่าพารามิเตอร์เจ็สมมติว่ามันรวมอยู่ใน

1
ยอดเยี่ยม นี่ควรเป็นคำตอบที่ยอมรับได้ โดยเฉพาะอย่างยิ่งหากเพิ่มการกล่าวถึงnpxการทำให้การโทร Jest ง่ายขึ้นมากโดยไม่คำนึงถึงระบบปฏิบัติการ
Dan Dascalescu

19

นอกจากนี้คุณยังสามารถใช้fหรือxเพื่อมุ่งเน้นหรือยกเว้นการทดสอบ ตัวอย่างเช่น

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);
});

1
ไม่แน่ใจว่าทำไมคำตอบนี้จึงลดลงดูเหมือนว่าจะตอบคำถามและใช้งานได้
mbillard

1
xitทำงานได้สำหรับฉัน แต่fitไม่ได้ ฉันใช้ jest@22.4.4
Hinrich

ฉันคิดว่าข้อเสียเปรียบหลักของวิธีการนี้คือ - ถ้าคุณแค่พยายามเจาะลึกการทดสอบหนึ่งครั้งเพื่อแก้ไขข้อผิดพลาด - มันทำให้เกิดการเปลี่ยนแปลงที่ไม่จำเป็นสำหรับไฟล์ทดสอบพื้นฐาน ถ้าด้วยเหตุผลใดก็ตามคุณต้องการบำรุงรักษารหัสทดสอบ (ข้ามคำสั่งพูด) สิ่งนี้อาจสมเหตุสมผล
webelo

14

ตามที่กล่าวไว้ข้างต้นคุณสามารถเรียกใช้คำสั่ง

jest -t 'fix-order-test'

หากคุณมีส่วนitในของdescribeบล็อกคุณจะต้องเรียกใช้

jest -t '<describeString> <itString>'

13

หากคุณjestเรียกใช้เป็นคำสั่งสคริปต์npm testคุณต้องใช้คำสั่งต่อไปนี้เพื่อให้สามารถใช้งานได้:

npm test -- -t "fix order test"

8

ด้วยjest เวอร์ชั่นล่าสุดคุณสามารถใช้ข้อใดข้อหนึ่งต่อไปนี้เพื่อเรียกใช้การทดสอบเดียวเท่านั้นสำหรับชุดทดสอบ

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

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

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

jest 'test 1' อาจทำงานได้เช่นกันหากชื่อการทดสอบนั้นไม่ซ้ำกัน


4

ในรหัส VS ให้ฉันรัน / debug เพียง 1 การทดสอบ Jest พร้อมเบรกพอยต์: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

ของฉันlaunch.jsonมีสิ่งนี้อยู่ภายใน:

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

และสิ่งนี้ในpackage.json:

  "scripts": {
    "test": "jest"
  }
  • ในการรันการทดสอบ 1 ครั้งในการทดสอบนั้นให้เปลี่ยนtest(หรือit) เป็นtest.only(หรือit.only) เมื่อต้องการเรียกใช้ชุดทดสอบที่ 1 (การทดสอบหลาย) เปลี่ยนแปลงไปdescribedescribe.only
  • ตั้งค่าเบรกพอยต์หากคุณต้องการ
  • ในรหัส VS ให้ไปที่มุมมองดีบัก (Shift + Cmd + D)
  • Jest Current Fileจากเมนูแบบเลื่อนที่ด้านบนให้เลือก
  • คลิกลูกศรสีเขียวเพื่อเรียกใช้การทดสอบนั้น

ในกรณีของฉันการกำหนดค่าของคุณรันเพียงการทดสอบเดียว (โดยใช้มันเท่านั้น (... )) แต่ก็ไม่ได้หยุดที่เบรกพอยต์ :(
Tudor Leustean

การเรียกใช้ JavaScript เพื่อให้ถึงจุดพักในตัวดีบักอาจยุ่งยากเนื่องจากลักษณะแบบอะซิงโครนัส ในรหัส VS ให้เล่นกับจุดที่คุณวางจุดพักรวมทั้งคำสั่งในเมนูดีบั๊กจนกระทั่งมันกระทบ ถ้ามันข้ามจุดพักให้วาง EARLIER ในรหัสของคุณ หาก 1 ไฟล์เรียกใช้ฟังก์ชันในไฟล์อื่นให้วางเบรกพอยต์ที่การเรียกใช้ฟังก์ชันนั้นจากนั้น "Step Into" การเรียกเพื่อข้ามไฟล์ เล่นกับคำสั่ง Debug เหล่านี้: "Step Over, Step Into, Step Out, Continue"
Raymond Gan

ที่จริงแล้วคุณไม่จำเป็นต้อง "scripts": { "test": "jest" }ในpackage.jsonเพราะคุณได้ระบุเส้นทางที่เต็มรูปแบบในพารามิเตอร์ใน"program" launch.json
Sergey

4

เพียงแค่แอดออนเล็กน้อยเพราะดูเหมือนว่าจะมีการต่อสู้หากจะใช้./node_modules/.bin/jest -i ...หรือเพียงแค่jest -i ...หรือnpm test -- -i ...

  1. เพียงแค่เรียกใช้jestงานได้หากคุณติดตั้งไว้ทั่วโลก (เช่นเดียวกับการติดตั้ง npm -g jest) ซึ่งเป็นวิธีที่ไม่สะอาดในการจัดการการพึ่งพา
  2. หากคุณติดตั้ง jest ไว้ในเครื่องเท่านั้นในแพ็คเกจและต้องการเรียกใช้สคริปต์ jest โดยไม่ใช้สคริปต์ npm detour คุณสามารถใช้npx jest -i ...=> นี่เป็นสิ่งที่ npx ใช้ ช่วยให้คุณไม่ต้องเขียน./node_modules/.bin/...

3

นี่คือของฉัน:

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

หมายเหตุ:

  • ./node_modules/.bin/...เป็นวิธีที่ยอดเยี่ยมในการเข้าถึงไบนารีตลก (หรือมอคค่าหรือ ... ) ที่ติดตั้งในท้องถิ่นที่มาพร้อมกับแพคเกจที่ติดตั้งในเครื่อง (ใช่ในสคริปต์ npm คุณสามารถทำได้jestโดยไม่ต้องมีอะไรมาก่อน แต่มันมีประโยชน์ในบรรทัดคำสั่ง ... (นั่นเป็นจุดเริ่มต้นที่ดีสำหรับการกำหนดค่าการดีบักของคุณไม่ว่าคุณจะใช้ IDE ใด ...
  • โครงการของคุณอาจไม่มีชุดตัวเลือกการกำหนดค่า แต่ถ้ามันเป็น (มองเข้าไปในสคริปต์ในpackage.json) นี่คือสิ่งที่คุณต้องการ
  • --runInBand - ตามที่กล่าวมาไม่ทราบเกี่ยวกับการกำหนดค่าของคุณ แต่ถ้าคุณมุ่งเน้นการพัฒนา / แก้ไขการทดสอบเดียวคุณไม่ต้องการที่จะจัดการกับคนงานเว็บ ...
  • ใช่คุณสามารถให้เส้นทางทั้งหมดกับไฟล์ของคุณได้อย่างชัดเจน
  • เป็นทางเลือกคุณสามารถใช้-tเพื่อไม่เรียกใช้การทดสอบทั้งหมดในไฟล์นั้น แต่มีเพียงอันเดียวเท่านั้น (ที่นี่: อันที่มีสิ่งที่มีเครื่องหมาย ' show expanded' อยู่ในชื่อ) เอฟเฟกต์เดียวกันนี้สามารถทำได้โดยการติดกาว.only()ลงในไฟล์นั้น


0
npm run test -- test-name

วิธีนี้จะใช้งานได้หากชื่อสเปคการทดสอบของคุณไม่ซ้ำ รหัสข้างต้นจะอ้างอิง

ไฟล์ที่มีชื่อนี้: test-name.component.spec.ts

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