Chạy thử nghiệm đơn từ một lớp JUnit bằng dòng lệnh


95

Tôi đang cố gắng tìm một cách tiếp cận cho phép tôi chạy một bài kiểm tra duy nhất từ ​​một lớp JUnit chỉ sử dụng dòng lệnh và java.

Tôi có thể chạy toàn bộ tập hợp các bài kiểm tra từ lớp học bằng cách sử dụng như sau:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Điều tôi thực sự muốn làm là như thế này:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

hoặc là:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Tôi nhận thấy rằng có thể có nhiều cách để thực hiện việc này bằng cách sử dụng chú thích JUnit, nhưng tôi không muốn sửa đổi nguồn của các lớp thử nghiệm của mình bằng tay (cố gắng tự động hóa điều này). Tôi cũng thấy rằng Maven có thể có cách để làm điều này, nhưng nếu có thể, tôi muốn tránh phụ thuộc vào Maven.

Vì vậy, tôi đang tự hỏi nếu có bất kỳ cách để làm điều này?


Những điểm chính tôi đang tìm kiếm:

  • Khả năng chạy một bài kiểm tra từ một lớp kiểm tra JUnit
  • Dòng lệnh (sử dụng JUnit)
  • Tránh sửa đổi nguồn thử nghiệm
  • Tránh sử dụng các công cụ bổ sung

4
Tuyệt vời, một người đam mê loại "Unix là IDE của tôi". Tôi thích sử dụng IDE cho một trình soạn thảo (đặc biệt là với plugin vim cho NetBeans), nhưng tôi đồng ý rằng các công cụ sắc bén nhỏ tồn tại "mãi mãi" và có thể được lắp ráp trong các cấu hình tùy ý, thường tốt hơn việc liên tục phân phối lại các tính năng bí truyền của một loạt nhãn hiệu và phiên bản IDE. Tốt cho bạn!
Roboprog

2
Bạn nói rằng bạn muốn tránh maven. Đối với bất cứ ai muốn làm điều này bằng maven thấy cái nhìn ở đây, maven.apache.org/plugins/maven-surefire-plugin/examples/...
reevesy

Câu trả lời:


79

Bạn có thể tạo một Á hậu JUnit trần trụi tùy chỉnh khá dễ dàng. Đây là một trong những sẽ chạy một phương pháp thử nghiệm duy nhất trong biểu mẫu com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Bạn có thể gọi nó như thế này:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Sau khi xem nhanh nguồn JUnit, tôi đã đi đến kết luận giống như bạn rằng JUnit không hỗ trợ điều này tự nhiên. Điều này chưa bao giờ là vấn đề đối với tôi vì tất cả các IDE đều có tích hợp JUnit tùy chỉnh cho phép bạn chạy phương pháp thử nghiệm dưới con trỏ, trong số các hành động khác. Tôi chưa bao giờ chạy các bài kiểm tra JUnit trực tiếp từ dòng lệnh; Tôi đã luôn để IDE hoặc công cụ xây dựng (Ant, Maven) chăm sóc nó. Đặc biệt là vì điểm nhập CLI mặc định (JUnitCore) không tạo ra bất kỳ đầu ra kết quả nào ngoài mã thoát khác 0 khi (các) lỗi thử nghiệm.

LƯU Ý: đối với phiên bản JUnit> = 4.9 bạn cần thư viện hamcrest trong classpath


2
Trên thực tế, tôi dường như nhớ nhận được một dấu vết ngăn xếp đầy đủ trong nhật ký khi một xác nhận trong thử nghiệm không thành công, cũng như thông báo (tùy chọn, khi được xác định) từ mỗi xác nhận mô tả kỳ vọng chưa thực hiện. Cảm ơn vì công việc xung quanh.
Roboprog

48

Tôi sử dụng Maven để xây dựng dự án của mình và sử dụng plugin SureFire maven để chạy thử nghiệm tháng sáu. Miễn là bạn có thiết lập này, sau đó bạn có thể làm:

mvn -Dtest=GreatTestClass#testMethod test

Trong ví dụ này, chúng tôi chỉ chạy một phương pháp thử nghiệm có tên "testMethod" trong Lớp "GreatTestClass".

Để biết thêm chi tiết, hãy xem http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


-2

Chúng tôi đã sử dụng IntelliJ và cũng đã dành khá nhiều thời gian để tìm ra nó.

Về cơ bản, nó bao gồm 2 bước:

Bước 1: Biên dịch lớp kiểm tra

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Bước 2: Chạy thử nghiệm

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest


6
Điều này chạy mọi bài kiểm tra trong lớp, không chỉ một bài kiểm tra.
Robber
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.