วิธีรันกรณีทดสอบ JUnit จากบรรทัดคำสั่ง


333

ฉันต้องการเรียกใช้กรณีทดสอบ JUnit จากบรรทัดคำสั่ง ฉันจะทำสิ่งนี้ได้อย่างไร


คำถาม
Junit


คำตอบสำหรับ JUnit 5 ที่stackoverflow.com/a/52373592/1431016
Sormuras

javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.javaทำงานให้ฉัน สังเกตจุดสิ้นสุด - มันสำคัญ!
parsecer

คำตอบ:


274

สำหรับJUnit 5.xมันคือ:

java -jar junit-platform-console-standalone-<version>.jar <Options>

ค้นหาสรุปโดยย่อได้ที่https://stackoverflow.com/a/52373592/1431016และรายละเอียดทั้งหมดได้ที่https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher

สำหรับJUnit 4.Xจริงๆแล้ว:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

แต่ถ้าคุณใช้JUnit 3.Xโปรดทราบว่าชื่อคลาสแตกต่างกัน:

java -cp .:/usr/share/java/junit.jar junit.textui.TestRunner [test class name]

คุณอาจต้องเพิ่ม JARs หรือไดเรกทอรีเพิ่มเติมด้วยไฟล์คลาสของคุณไปยัง classpath และแยกด้วย Semicolons (Windows) หรือ colons (UNIX / Linux) มันขึ้นอยู่กับสภาพแวดล้อมของคุณ

แก้ไข: ฉันได้เพิ่มไดเรกทอรีปัจจุบันเป็นตัวอย่าง ขึ้นอยู่กับสภาพแวดล้อมของคุณและวิธีสร้างแอปพลิเคชั่นของคุณ (สามารถเป็น bin / หรือ build / หรือแม้แต่ my_application.jar ฯลฯ ) หมายเหตุ Java 6+ รองรับ globs ใน classpath คุณสามารถทำได้:

java -cp lib/*.jar:/usr/share/java/junit.jar ...

หวังว่ามันจะช่วย เขียนแบบทดสอบ! :-)


@Izap ความคิดใด ๆ ที่กำหนดโดยทางโปรแกรมว่าการทดสอบใช้ JUnit4 หรือ JUnit3 หรือไม่?
Goaler444

2
Class.forName ฉันเดา เป็นเวลาหลายปีแล้วที่ฉันได้เขียนโปรแกรมภาษาจาวาเป็นครั้งสุดท้าย ...
lzap

และถ้าคุณใช้แอนดรอยด์ล่ะ?
n611x007

1
เอกสารสำหรับ "-cp" อาร์กิวเมนต์ (เช่น CLASSPATH) ที่เป็นที่นี่ (Java 7, Unix)และนี่ (กวดวิชา)และนี่ (Java 8, Unix)และนี่ (Java 8, Windows) ขณะนี้สนับสนุน wildcard ที่เห็นได้ชัดใน classpath แล้ว
David Tonhofer

1
downvote สำหรับ JUnit 4.x มันไม่ถูกต้อง คำแนะนำของคุณให้ "ไม่สามารถหาคลาส: [ชื่อคลาสทดสอบ]" แม้ในขณะที่ [ชื่อคลาสทดสอบ] อยู่ในคลาสพา ธ
Philip Rego

117

ทาง Maven

หากคุณใช้ Maven คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อเรียกใช้กรณีทดสอบทั้งหมด:

mvn clean test

หรือคุณสามารถเรียกใช้การทดสอบเฉพาะด้านล่าง

mvn clean test -Dtest=your.package.TestClassName
mvn clean test -Dtest=your.package.TestClassName#particularMethod

หากคุณต้องการดูการติดตามสแต็ก (ถ้ามี) ในคอนโซลแทนไฟล์รายงานในโฟลเดอร์เป้าหมาย \ surefire-reports ให้ตั้งค่าคุณสมบัติผู้ใช้ surefire.useFile เป็น false ตัวอย่างเช่น:

mvn clean test -Dtest=your.package.TestClassName -Dsurefire.useFile=false

วิธีการไล่ระดับสี

หากคุณใช้ Gradle คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อเรียกใช้กรณีทดสอบทั้งหมด:

gradle test

หรือคุณสามารถเรียกใช้การทดสอบเฉพาะด้านล่าง

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod

หากคุณต้องการข้อมูลเพิ่มเติมคุณสามารถพิจารณาตัวเลือกเช่น --stacktrace หรือ --info หรือ --debug

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

gradle test --info

หากคุณต้องการดูผลการทดสอบโดยรวมคุณสามารถเปิดรายงานในเบราว์เซอร์ได้ (เปิดโดยใช้ Google Chrome ใน Ubuntu):

google-chrome build/reports/tests/index.html

วิธีมด

เมื่อคุณตั้งค่า Ant build file build.xml แล้วคุณสามารถรัน JUnit test cases จากบรรทัดคำสั่งดังต่อไปนี้:

ant -f build.xml <Your JUnit test target name>

คุณสามารถไปที่ลิงก์ด้านล่างเพื่ออ่านเพิ่มเติมเกี่ยวกับวิธีกำหนดค่าการทดสอบ JUnit ในไฟล์ Ant build: https://ant.apache.org/manual/Tasks/junit.html

วิธีปกติ

หากคุณไม่ได้ใช้ Maven หรือ Gradle หรือ Ant คุณสามารถทำตามวิธีต่อไปนี้:

ก่อนอื่นคุณต้องรวบรวมกรณีทดสอบของคุณ ตัวอย่าง (ใน Linux):

javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java

จากนั้นเรียกใช้กรณีทดสอบของคุณ ตัวอย่างเช่น:

java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName

1
ฉันชอบที่คำตอบนี้มีตัวอย่างสำหรับเทคโนโลยีที่หลากหลายรุ่งโรจน์!
Josie Thompson

การทดสอบ Groovy ใช้วิธีการสุดท้ายอย่างไร
midori

1
ตราสีทองที่สมควรจะได้;)
Eric Duminil

ขอบคุณสำหรับเวอร์ชั่นสำหรับ gradle! รุ่งโรจน์!
ady

52

คำตอบที่ @lzap ให้นั้นเป็นทางออกที่ดี อย่างไรก็ตามฉันต้องการเพิ่มที่คุณควรเพิ่ม ไปที่คลาสพา ธ เพื่อไม่ให้ไดเรกทอรีปัจจุบันของคุณค้างอยู่ส่งผลให้คลาสของคุณถูกทิ้ง สิ่งนี้เกิดขึ้นกับฉันในบางแพลตฟอร์ม ดังนั้นเวอร์ชันที่อัปเดตสำหรับ JUnit 4.x จะเป็น:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

1
นั่นควรจะเป็นเครื่องหมายทวิภาคหรือไม่
panny

14
@panny มันเป็นเครื่องหมายอัฒภาคบน Windows ในสภาพแวดล้อม n * nix (อย่างน้อย OSX และ Linux distros ทั้งหมดที่ฉันใช้) คุณใช้โคลอน
rand_acs

1
@rand_acs ชื่อคลาสทดสอบจำเป็นต้องเป็นชื่อคลาสที่ถูกจัดประเภทอย่างสมบูรณ์หรือไม่?
Goaler444

1
@ Goaler444 ใช่ฉันมักจะใช้ชื่อเต็มกับ namespaces ทั้งหมดที่ระบุ
rand_acs

22

ตรวจสอบให้แน่ใจว่า JUnit.jar อยู่ใน classpath ของคุณจากนั้นเรียกใช้ command line runner จากคอนโซล

java org.junit.runner.JUnitCore [ชื่อคลาสทดสอบ]

การอ้างอิง: คำถามที่พบบ่อย Junit


4
คุณต้องตั้งค่า classpath ที่เหลือของโครงการของคุณ
Thilo

สิ่งนี้จะให้ "ไม่สามารถหาคลาส: [ชื่อคลาสทดสอบ]" แม้ในขณะที่ [ชื่อคลาสทดสอบ] อยู่ในคลาสพา ธ
Philip Rego

19

ด้วย JUnit 4.12 สิ่งต่อไปนี้ใช้ไม่ได้สำหรับฉัน:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

เห็นได้ชัดว่าจาก JUnit 4.11 เป็นต้นไปคุณควรรวมhamcrest-core.jarไว้ใน classpath ของคุณ:

java -cp .:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar org.junit.runner.JUnitCore [test class name]

มีปัญหาเดียวกันกับ JUnit 4.12 มาพร้อมกับโซลูชันที่คล้ายกัน แต่ไม่ได้ผลสำหรับฉันไม่สามารถโหลด JUnitCore โดยทั่วไปฉันเปลี่ยนไปใช้ JUnit 4.8.2 เนื่องจากไม่จำเป็นต้องรวม hamcrest-core.jar ใน classpath
Vladimir Nazarenko

ยืนยันว่าจะต้องทำกับ JUnit 4.12 +1
rayryeng

สิ่งนี้ใช้ได้กับฉัน:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
Raffi Khatchadourian

11

ใน windows มันเป็น

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [ชื่อคลาสทดสอบที่ไม่มีนามสกุล. class]

ตัวอย่างเช่น: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ...และอื่น ๆ หากมีมากกว่าหนึ่งคลาสทดสอบ

-cpย่อมาจากคลาสพา ธ และจุด (.) แสดงถึง classpath ที่มีอยู่ในขณะที่เซมิโคลอน (;) ผนวก jar ที่กำหนดเพิ่มเติมให้กับ classpath ดังตัวอย่างข้างต้น junit-4.8.2 มีอยู่ใน classpath เพื่อเรียกใช้คลาส JUnitCore ที่ ที่นี่เราใช้ในการรันคลาสทดสอบของเรา

ข้อความสั่งบรรทัดคำสั่งด้านบนช่วยให้คุณสามารถทำการทดสอบ junit (รุ่น 4 ขึ้นไป) จากพรอมต์คำสั่ง (เช่น MSDos)

หมายเหตุ: JUnitCore เป็นส่วนหน้าสำหรับการทดสอบ Junit อาคารนี้รวมอยู่ในรุ่น Junit 4+ รุ่น


โปรดอธิบายคำตอบของคุณสั้น ๆ
Mohit Jain

ฉันไม่ได้ขอให้คุณตอบสั้น ๆ ฉันขอเพิ่มคำอธิบาย (อย่างน้อยก็คำอธิบายสั้น ๆ ) เป็นการปฏิบัติที่ดีที่จะอธิบายว่าคำตอบของคุณทำงานอย่างไร ผู้อ่านอาจเข้าใจว่าชอบโหวตขึ้น
Mohit Jain

ดังนั้นถ้าฉันมี jar ทดสอบเพิ่มเติมและ jar วนิลา Junit Id ต้องมีทั้งสองอย่างในคำสั่ง java -cp เพื่อให้สิ่งใดใช้งานได้จริง? มีวิธีแก้ไขหรือไม่ที่จะนำทั้งหมดนี้ไปไว้ในบรรทัดคำสั่งเพื่อที่ฉันจะได้ไม่ต้องพิมพ์อะไรมาก?
Ungeheuer

5

ที่จริงแล้วคุณสามารถทำให้ Junit ทดสอบ runnable Jar และเรียก jar ที่รันได้เป็น java -jar


2
ใน Eclipse คลิกขวาที่โครงการ JUnit ของคุณ -> คลิกที่ส่งออก -> เลือก Java-> ไฟล์ Jar ที่เรียกใช้
Indraneel

4

หากโครงการของคุณใช้ Maven คุณสามารถเรียกใช้วิธีทดสอบทั้งหมดจาก CustomTest ซึ่งเป็นของโมดูล 'my-module' โดยใช้คำสั่งถัดไป:

mvn clean test -pl :my-module -Dtest=CustomTest

หรือเรียกใช้เพียงหนึ่งวิธีทดสอบ myMethod จาก CustomTest ทดสอบระดับโดยใช้คำสั่งถัดไป:

mvn clean test -pl :my-module -Dtest=CustomTest#myMethod

สำหรับความสามารถนี้คุณต้องใช้ Maven Surefire Plugin v.2.7.3 + และ Junit 4 รายละเอียดเพิ่มเติมอยู่ที่นี่: http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html




-1

หากโครงการของคุณมีพื้นฐานมาจากมดคุณควรจะทำสิ่งนี้ได้จากคอนโซล:

ant test

หากสิ่งนี้ไม่ได้ผล แต่โครงการของคุณยังมีพื้นฐานมาจาก ant คุณสามารถเรียกใช้ant -pเพื่อแสดงรายการเป้าหมายหลักของโครงการ


2
คำถามไม่มีอะไรเกี่ยวข้องกับมด
accuya

3
นั่นเป็นเหตุผลที่ฉันพูดว่า "ถ้าโครงการของคุณเป็นแบบมด" โปรดทราบว่า OP อาจไม่ทราบเกี่ยวกับมด
cherouvim

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