เรียกใช้การทดสอบเดี่ยวจากคลาส JUnit โดยใช้บรรทัดคำสั่ง


98

ฉันพยายามหาแนวทางที่จะช่วยให้ฉันสามารถเรียกใช้การทดสอบเดียวจากคลาส JUnit โดยใช้บรรทัดคำสั่งและ java เท่านั้น

ฉันสามารถเรียกใช้การทดสอบทั้งชุดจากชั้นเรียนโดยใช้สิ่งต่อไปนี้:

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

สิ่งที่ฉันอยากทำจริงๆคืออะไรแบบนี้:

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

หรือ:

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

ฉันสังเกตเห็นว่าอาจมีวิธีดำเนินการนี้โดยใช้คำอธิบายประกอบ JUnit แต่ฉันไม่ต้องการแก้ไขซอร์สของคลาสทดสอบของฉันด้วยมือ (พยายามทำให้เป็นอัตโนมัติ) ฉันยังเห็นว่า Maven อาจมีวิธีทำเช่นนี้ แต่ถ้าเป็นไปได้ฉันอยากจะหลีกเลี่ยงโดยขึ้นอยู่กับ Maven

ฉันจึงสงสัยว่ามีวิธีใดบ้างที่จะทำเช่นนี้?


ประเด็นสำคัญที่ฉันกำลังมองหา:

  • ความสามารถในการเรียกใช้การทดสอบเดียวจากคลาสทดสอบ JUnit
  • Command Line (โดยใช้ JUnit)
  • หลีกเลี่ยงการแก้ไขแหล่งทดสอบ
  • หลีกเลี่ยงการใช้เครื่องมือเพิ่มเติม

4
เจ๋งอีกอย่าง "Unix is ​​my IDE" ผู้คลั่งไคล้ประเภท ฉันชอบใช้ IDE สำหรับเครื่องมือแก้ไข (โดยเฉพาะอย่างยิ่งกับปลั๊กอินกลุ่มสำหรับ NetBeans) แต่ฉันยอมรับว่าเครื่องมือที่แหลมคมขนาดเล็กที่คงอยู่ "ตลอดไป" และสามารถประกอบในการกำหนดค่าตามอำเภอใจมักจะดีกว่าการเรียนรู้คุณลักษณะลึกลับของการดำเนิน ชุดของแบรนด์และเวอร์ชันของ IDE ดีสำหรับคุณ!
Roboprog

2
คุณบอกว่าคุณต้องการหลีกเลี่ยง maven สำหรับใครที่อยากทำโดยใช้ maven ดูที่นี่maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

คำตอบ:


79

คุณสามารถสร้างนักวิ่ง JUnit แบบแบร์โบนแบบกำหนดเองได้อย่างง่ายดาย นี่คือวิธีการทดสอบเดียวในรูปแบบ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);
    }
}

คุณสามารถเรียกมันได้ดังนี้:

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

หลังจากดูอย่างรวดเร็วในแหล่งข้อมูล JUnit ฉันก็ได้ข้อสรุปเช่นเดียวกับคุณว่า JUnit ไม่สนับสนุนสิ่งนี้โดยกำเนิด สิ่งนี้ไม่เคยเป็นปัญหาสำหรับฉันเนื่องจาก IDE ทั้งหมดมีการรวม JUnit แบบกำหนดเองที่ช่วยให้คุณสามารถเรียกใช้วิธีการทดสอบภายใต้เคอร์เซอร์รวมถึงการดำเนินการอื่น ๆ ฉันไม่เคยเรียกใช้การทดสอบ JUnit จากบรรทัดคำสั่งโดยตรง ฉันปล่อยให้ IDE หรือ build tool (Ant, Maven) ดูแลอยู่เสมอ โดยเฉพาะอย่างยิ่งเนื่องจากจุดเริ่มต้น CLI เริ่มต้น (JUnitCore) จะไม่สร้างผลลัพธ์ใด ๆ นอกเหนือจากรหัสทางออกที่ไม่ใช่ศูนย์เมื่อการทดสอบล้มเหลว

หมายเหตุ: สำหรับเวอร์ชัน JUnit> = 4.9 คุณต้องมีไลบรารีhamcrestใน classpath


2
ที่จริงแล้วฉันดูเหมือนจะจำได้ว่าได้รับการติดตามสแต็กแบบเต็มในบันทึกเมื่อการยืนยันในการทดสอบล้มเหลวรวมถึงข้อความ (ไม่บังคับเมื่อกำหนด) จากการยืนยันแต่ละครั้งที่อธิบายถึงความคาดหวังที่ยังไม่เกิดขึ้นจริง ขอบคุณสำหรับการแก้ไขปัญหา
Roboprog

51

ฉันใช้ Maven เพื่อสร้างโปรเจ็กต์ของฉันและใช้ปลั๊กอิน SureFire maven เพื่อทำการทดสอบจูนิท หากคุณมีการตั้งค่านี้คุณสามารถทำได้:

mvn -Dtest=GreatTestClass#testMethod test

ในตัวอย่างนี้เราเรียกใช้วิธีการทดสอบชื่อ "testMethod" ภายใน Class "GreatTestClass"

ดูรายละเอียดเพิ่มเติมได้ที่http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


-2

เราใช้ IntelliJ และใช้เวลาไม่น้อยในการพยายามคิดออกด้วย

โดยทั่วไปจะมี 2 ขั้นตอน:

ขั้นตอนที่ 1: รวบรวมคลาสทดสอบ

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

ขั้นตอนที่ 2: เรียกใช้การทดสอบ

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


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