Cách chạy các trường hợp kiểm tra JUnit từ dòng lệnh


333

Tôi muốn chạy các trường hợp thử nghiệm JUnit từ dòng lệnh. Tôi có thể làm cái này như thế nào?


câu hỏi tương tự về android
Junit

tài liệu android: chạy thử nghiệm trên thiết bị hoặc trình giả lập (từ dòng lệnh). ( thông qua andreea.sandu)
n611x007

Trả lời cho JUnit 5 tại stackoverflow.com/a/52373592/1431016
Sormuras

javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.javađã làm cho tôi. Lưu ý dấu chấm kết thúc - nó quan trọng!
phân tích cú pháp

Câu trả lời:


274

Đối với JUnit 5.x, đó là:

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

Tìm một bản tóm tắt ngắn gọn tại https://stackoverflow.com/a/52373592/1431016 và thông tin chi tiết đầy đủ tại https://junit.org/junit5/docs/civerse/user-guide/#ricky-tests-console-launcher

Đối với JUnit 4.X, nó thực sự:

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

Nhưng nếu bạn đang sử dụng JUnit 3.X thì lưu ý tên lớp là khác nhau:

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

Bạn có thể cần thêm nhiều JAR hoặc thư mục với các tệp lớp của mình vào đường dẫn lớp và phân tách chúng bằng dấu chấm phẩy (Windows) hoặc dấu hai chấm (UNIX / Linux). Nó phụ thuộc vào môi trường của bạn.

Chỉnh sửa: Tôi đã thêm thư mục hiện tại làm ví dụ. Phụ thuộc vào môi trường của bạn và cách bạn xây dựng ứng dụng của mình (có thể là bin / hoặc build / hoặc thậm chí my_application.jar, v.v.). Lưu ý Java 6+ không hỗ trợ các khối trong đường dẫn lớp, bạn có thể làm:

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

Hy vọng nó giúp. Viết bài kiểm tra! :-)


@Izap Bất kỳ ý tưởng nào để xác định theo chương trình một thử nghiệm đang sử dụng JUnit4 hoặc JUnit3?
Thủ môn444

2
Class.forName tôi đoán. Đó là năm tôi đã lập trình Java lần cuối ...
lzap

và nếu bạn đang sử dụng Android thì sao?
n611x007

1
Tài liệu cho đối số "-cp" (tức là CLASSPATH) có ở đây (Java 7, Unix)ở đây (Hướng dẫn)ở đây (Java 8, Unix)ở đây (Java 8, Windows) . Rõ ràng các ký tự đại diện trong classpath hiện được hỗ trợ.
David Tonhofer

1
Downvote. Đối với JUnit 4.x thì không đúng. Hướng dẫn của bạn đưa ra "Không thể tìm thấy lớp: [tên lớp kiểm tra]" Ngay cả khi [tên lớp kiểm tra] nằm trong đường dẫn lớp.
Philip Rego

117

Cách Maven

Nếu bạn sử dụng Maven, bạn có thể chạy lệnh sau để chạy tất cả các trường hợp thử nghiệm của mình:

mvn clean test

Hoặc bạn có thể chạy thử nghiệm cụ thể như dưới đây

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

Nếu bạn muốn xem theo dõi ngăn xếp (nếu có) trong bảng điều khiển thay vì các tệp báo cáo trong thư mục đích \ Surefire-báo cáo, hãy đặt thuộc tính người dùng Surefire.useFile thành false. Ví dụ:

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

Cách tốt nghiệp

Nếu bạn sử dụng Gradle, bạn có thể chạy lệnh sau để chạy tất cả các trường hợp thử nghiệm của mình:

gradle test

Hoặc bạn có thể chạy thử nghiệm cụ thể như dưới đây

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

Nếu bạn muốn biết thêm thông tin, bạn có thể xem xét các tùy chọn như --stacktrace hoặc --info hoặc --debug.

Ví dụ: khi bạn chạy Gradle với mức ghi nhật ký thông tin --info, nó sẽ hiển thị cho bạn kết quả của từng bài kiểm tra trong khi chúng đang chạy. Nếu có bất kỳ ngoại lệ, nó sẽ hiển thị cho bạn dấu vết ngăn xếp, chỉ ra vấn đề là gì.

gradle test --info

Ví dụ: nếu bạn muốn xem kết quả kiểm tra tổng thể, bạn có thể mở báo cáo trong trình duyệt (Mở nó bằng Google Chrome trong Ubuntu):

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

Cách kiến

Khi bạn thiết lập tệp xây dựng tệp Ant build build, bạn có thể chạy các trường hợp kiểm tra JUnit của mình từ dòng lệnh như dưới đây:

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

Bạn có thể theo liên kết bên dưới để đọc thêm về cách định cấu hình các bài kiểm tra JUnit trong tệp xây dựng Ant: https://ant.apache.org/manual/T task /junit.html

Cách thông thường

Nếu bạn không sử dụng Maven, hoặc Gradle hoặc Ant, bạn có thể làm theo cách sau:

Trước hết, bạn cần biên dịch các trường hợp thử nghiệm của bạn. Ví dụ: (trong Linux):

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

Sau đó chạy trường hợp thử nghiệm của bạn. Ví dụ:

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
Tôi thích rằng câu trả lời này có ví dụ cho nhiều công nghệ, kudos!
Josie Thompson

những gì về thử nghiệm Groovy sử dụng phương pháp cuối cùng?
midori

1
Huy hiệu vàng rất xứng đáng;)
Eric Duminil

Cảm ơn phiên bản cho lớp! Thanh danh!
ady

52

Câu trả lời mà @lzap đưa ra là một giải pháp tốt. Tuy nhiên, tôi muốn thêm rằng bạn nên thêm. đến đường dẫn lớp, để thư mục hiện tại của bạn không bị bỏ sót, dẫn đến các lớp của riêng bạn bị bỏ qua. Điều này đã xảy ra với tôi trên một số nền tảng. Vì vậy, một phiên bản cập nhật cho JUnit 4.x sẽ là:

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

1
đó có phải là một dấu chấm phẩy không?
panny

14
@panny đó là một dấu chấm phẩy trên Windows. Trên môi trường n * nix (ít nhất là OSX và tất cả các bản phân phối Linux tôi đã sử dụng), bạn sử dụng dấu hai chấm.
rand_acs

1
@rand_acs tên lớp kiểm tra có cần phải là tên lớp được phân loại đầy đủ không?
Thủ môn444

1
@ Goaler444 Có, tôi luôn sử dụng tên đầy đủ, với tất cả các không gian tên được chỉ định.
rand_acs

22

Đảm bảo rằng JUnit.jar nằm trong đường dẫn lớp của bạn, sau đó gọi trình chạy dòng lệnh từ bảng điều khiển

java org.junit.runner.JUnitCore [tên lớp kiểm tra]

Tham khảo: Câu hỏi thường gặp


4
bạn cũng cần thiết lập phần còn lại của đường dẫn dự án của bạn.
Thilo

Điều này chỉ cung cấp "Không thể tìm thấy lớp: [tên lớp kiểm tra]" ngay cả khi [tên lớp kiểm tra] nằm trong đường dẫn lớp.
Philip Rego

19

Với JUnit 4.12, những điều sau đây không phù hợp với tôi:

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

Rõ ràng , từ JUnit 4.11 trở đi, bạn cũng nên đưa hamcrest-core.jarvào đường dẫn lớp của mình:

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

Có cùng một vấn đề với JUnit 4.12. Đến với một giải pháp tương tự, nhưng nó không hiệu quả với tôi, không tải được JUnitCore. Về cơ bản, tôi đã chuyển sang JUnit 4.8.2 vì nó không yêu cầu bao gồm hamcrest-core.jar trong đường dẫn lớp.
Vladimir Nazarenko

Xác nhận rằng điều này phải được thực hiện với JUnit 4.12. +1.
rayryeng

Điều này làm việc cho tôi:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
Raffi Khatchadourian

11

Trong cửa sổ nó là

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [tên lớp kiểm tra không có phần mở rộng. Class]

ví dụ: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ...v.v., nếu một người có nhiều hơn một lớp kiểm tra.

-cp là viết tắt của đường dẫn lớp và dấu chấm (.) đại diện cho đường dẫn lớp hiện có trong khi dấu hai chấm (;) nối thêm tệp đã cho vào đường dẫn lớp, như trong ví dụ trên, Junit-4.8.2 hiện có sẵn trong đường dẫn lớp để thực thi lớp JUnitCore ở đây chúng tôi đã sử dụng để thực hiện các lớp kiểm tra của chúng tôi.

Câu lệnh dòng trên giúp bạn thực hiện các bài kiểm tra Junit (phiên bản 4+) từ dấu nhắc lệnh (tức là MSDos).

Lưu ý: JUnitCore là một mặt tiền để thực hiện các bài kiểm tra Junit, mặt tiền này được bao gồm trong hơn 4 phiên bản của Junit.


Hãy giải thích câu trả lời của bạn rất ngắn gọn.
Mohit Jain

Tôi không yêu cầu bạn giữ câu trả lời ngắn gọn. Tôi yêu cầu thêm một số lời giải thích (ít nhất là một lời giải thích ngắn gọn). Đó là một thực hành tốt để giải thích làm thế nào câu trả lời của bạn làm việc. Người đọc có thể hiểu nó, thích nó, upvote nó.
Mohit Jain

Vì vậy, nếu tôi có một bình thử nghiệm bổ sung VÀ bình đựng vanilla Junit, Id phải có cả hai thứ trong lệnh java -cp để mọi thứ thực sự hoạt động? Có cách nào để đặt tất cả những thứ này vào một dòng lệnh để tôi không phải gõ nhiều thứ không?
Ungeheuer

5

Trên thực tế, bạn cũng có thể làm cho Junit kiểm tra một Jar có thể chạy được và gọi jar có thể chạy được là java -jar


2
Trong Eclipse, nhấp chuột phải vào dự án JUnit của bạn -> Nhấp vào Xuất -> Chọn Java-> Tệp Jar có thể chạy
Indraneel

4

Nếu dự án của bạn dựa trên Maven, bạn có thể chạy tất cả các phương thức kiểm tra từ CustomTest của lớp kiểm tra thuộc mô-đun 'mô-đun của tôi' bằng cách sử dụng lệnh tiếp theo:

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

Hoặc chỉ chạy 1 phương thức thử nghiệm myMethod từ CustomTest của lớp thử nghiệm bằng lệnh tiếp theo:

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

Để có khả năng này, bạn cần Plugin Maven Surefire v.2.7.3 + và Junit 4. Chi tiết khác có tại đây: http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


4

Cá nhân tôi sẽ sử dụng người chạy Maven Surefire JUnit để làm điều đó.



-1

Nếu dự án của bạn dựa trên kiến ​​thì bạn sẽ có thể làm một cái gì đó như thế này từ bảng điều khiển:

ant test

Nếu điều này không hiệu quả, nhưng dự án của bạn vẫn dựa trên kiến, bạn có thể chạy ant -pđể liệt kê các mục tiêu chính của dự án.


2
Q không liên quan gì đến ant
accuya

3
Đó là lý do tại sao tôi nói "nếu dự án của bạn dựa trên kiến". Cũng lưu ý rằng OP có thể không biết về kiến.
cherouvim

Tôi đã có dillema này, các tập tin kiểm tra đơn vị không có trong thư mục được đánh dấu là nguồn bởi nhật thực. Dự án đó sử dụng kiến ​​để xây dựng, đây là cách thích hợp để chạy các bài kiểm tra JUnit đó.
Andrzej Rehmann
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.