จะตั้งค่าพารามิเตอร์ JVM สำหรับ Junit Unit Tests ได้อย่างไร?


96

ฉันมีการทดสอบหน่วย Junit บางอย่างที่ต้องใช้พื้นที่ฮีปจำนวนมากในการรันนั่นคือ 1G (พวกเขาทดสอบฟังก์ชันการทำงานที่ต้องใช้หน่วยความจำมากสำหรับแอป webstart ซึ่งจะทำงานโดยมีพื้นที่ฮีปเพียงพอเท่านั้นและจะทำงานภายในบนเครื่อง Win 7 64 บิตดังนั้นการออกแบบการทดสอบใหม่จึงไม่ใช่คำแนะนำที่ใช้ได้จริง)

ฉันกำลังพัฒนาใน Intellij IDEA ดังนั้นฉันจึงรู้ว่าฉันสามารถตั้งค่าพารามิเตอร์ JVM (เช่น -Xmx1024M) สำหรับคลาสทดสอบได้ อย่างไรก็ตามนี่เป็นเพียงการเรียกใช้คลาสทดสอบทั้งหมดเท่านั้น - หากฉันต้องการเรียกใช้การทดสอบแต่ละรายการฉันต้องสร้างคอนฟิกูเรชันการรันสำหรับวิธีทดสอบนั้นใหม่

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

สำหรับรอบการสร้างเราใช้ Maven ดังนั้นฉันจึงรู้วิธีระบุพารามิเตอร์ JVM สำหรับสิ่งนั้น

ดังนั้น: - ฉันกำลังมองหาวิธีระบุพารามิเตอร์ JVM ที่จะใช้กับคลาสทดสอบทั้งหมดและวิธีการทดสอบแต่ละวิธี และ - ฉันต้องการแบ่งปันข้อมูลจำเพาะเหล่านั้นกับ IDE บนเครื่องใด ๆ (เมื่อได้รับรหัสจากที่เก็บ)


ฉันสงสัยว่ามันเป็นไปได้ ในทุกเครื่องสำหรับ IDE ที่กำหนดควรเป็นไปได้ แต่ใน IDE ฉันไม่เห็นว่าเป็นอย่างไร
JB Nizet

@JBNizet - ฉันยินดีที่จะนำ IDE ข้ามเครื่องไปใช้ (โดยระบุว่าเป็น Intellij IDEA)
แก้ไข

คำตอบ:


48

ใน IntelliJ คุณสามารถระบุการตั้งค่าเริ่มต้นสำหรับการกำหนดค่าการรันแต่ละครั้ง ในRun / Debugการกำหนดค่าโต้ตอบ (คนที่คุณใช้ในการกำหนดค่ากองทดสอบ) คลิกที่ค่าเริ่มต้นและJUnit การตั้งค่าเหล่านี้จะนำไปใช้กับการกำหนดค่าการทดสอบ JUnit ใหม่โดยอัตโนมัติ ฉันเดาว่ามีการตั้งค่าที่คล้ายกันสำหรับ Eclipse

อย่างไรก็ตามไม่มีตัวเลือกง่ายๆในการถ่ายโอนการตั้งค่าดังกล่าว (อย่างน้อยใน IntelliJ) ข้ามสภาพแวดล้อม คุณสามารถคอมมิตไฟล์โปรเจ็กต์ IntelliJ ไปยังที่เก็บของคุณมันอาจใช้งานได้ แต่ฉันไม่แนะนำ

maven-surefire-pluginคุณจะรู้ว่าวิธีการตั้งค่าเหล่านี้ ดี. นี่เป็นวิธีที่พกพาสะดวกที่สุด (ดูตัวอย่างคำตอบของ Ptomli)

ส่วนที่เหลือ - คุณต้องจำไว้ว่ากรณีทดสอบ JUnit เป็นเพียงคลาส Java จำนวนมากไม่ใช่โปรแกรมแบบสแตนด์อโลน มันขึ้นอยู่กับนักวิ่ง (ปล่อยให้เป็นนักวิ่ง JUnit แบบสแตนด์อโลน IDE ของคุณmaven-surefire-pluginเพื่อตั้งค่าตัวเลือกเหล่านั้นที่ถูกกล่าวว่าไม่มีวิธี "พกพา" ในการตั้งค่าดังนั้นการตั้งค่าหน่วยความจำจะถูกนำไปใช้โดยไม่คำนึงถึงนักวิ่ง

เพื่อให้คุณเป็นตัวอย่าง: คุณไม่สามารถกำหนดXmxพารามิเตอร์เมื่อพัฒนา servlet - ขึ้นอยู่กับคอนเทนเนอร์ที่จะกำหนดสิ่งนั้น คุณไม่สามารถพูดว่า Xmx=1G"เซิร์ฟเล็ตนี้ควรจะทำงานกับ


การกำหนดค่า Run / Debug อยู่ที่ไหน ฉันไม่เห็นสิ่งนี้ในการตั้งค่าหรือเมนูบริบทเมื่อเรียกใช้การทดสอบ?
Dean Hiller

2
โปรดทราบว่าการดำเนินการนี้จะไม่เปลี่ยนแปลงการกำหนดค่าการรัน JUnit ที่มีอยู่ซึ่งจะสร้างขึ้นหลังจากที่คุณเปลี่ยนค่าเริ่มต้นเท่านั้น คุณต้องเปลี่ยนสิ่งที่มีอยู่ด้วยตนเอง
MikeFHay

79

ใน Maven คุณสามารถกำหนดค่าปลั๊กอิน surefire

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xmx256M</argLine>
    </configuration>
</plugin>

หากคุณใช้ Maven สำหรับบิลด์คอนฟิกูเรชันนี้จะดำเนินการในแผนผังต้นทางและนำไปใช้เมื่อทำการทดสอบ ดูเอกสารประกอบMaven Surefire Plugin


1
@ptomli - ฉันมักจะไม่ไว้วางใจความคิดเห็นที่ขึ้นต้น "แน่นอน ... " การรวม Intellij maven ใช้การกำหนดค่าปลั๊กอิน pom เมื่อรันงานบนวงจรการสร้าง maven การรันการทดสอบหน่วยใน IDE เป็นกระบวนการแยกต่างหากและโดยค่าเริ่มต้นจะไม่มีความรู้เกี่ยวกับกระบวนการสร้าง สำหรับความรู้ของฉันไม่มีทางเชื่อมโยงสิ่งเหล่านี้ - แม้ว่าฉันจะมีความสุขที่ได้รับการบอกกล่าวเป็นอย่างอื่น นี่คือสิ่งที่คุณมีความรู้ / เคยทำ - ในกรณีนี้คุณสามารถแบ่งปันวิธีการได้หรือไม่?
แก้ไข

1
ฉันไม่แน่ใจว่าเป็นไปได้ใน Intellij TBH แม้ว่าจะเป็นเช่นนั้นฉันก็ไม่ต้องการใช้แนวทางนั้นเนื่องจากมีโอกาสที่ถ้าฉันทำการทดสอบหน่วยใน IDE ฉันต้องการใช้ประโยชน์จากดีบักเกอร์ IDE ซึ่งฉันไม่สามารถทำได้ โดยทำการทดสอบ mvn
แก้ไข

5
ที่จริงแล้วการรวม Maven IntelliJ ของไม่ใช้การกำหนดค่า Maven Surefire เมื่อมีการดำเนินการทดสอบหน่วยของแต่ละบุคคล การใช้การกำหนดค่า Maven ด้านบนจะทำให้-Xmx256Mถูกส่งผ่านไปยังบรรทัดคำสั่ง Java เมื่อดำเนินการทดสอบหน่วยของคุณโดยตรงจาก IntelliJ นี่ทำให้ฉันสับสนไปหมด :-(
Kkkev

1
FYI: Netbeans ยังใช้ Maven Suefire เพื่อทำการทดสอบอีกด้วย
Ferrybig

1
การผสานรวม Maven ของ @Kkkev IntelliJ นั้นแตกต่างจากการทดสอบแต่ละรายการใน IntelliJ ครั้งแรกใช้การกำหนดค่าการรัน Maven (ดังนั้นจึงอ่านอาร์กิวเมนต์) ส่วนที่สองใช้การกำหนดค่า JUnit, TestNG ...
andresp


15

ตามคำถามสนับสนุนนี้ https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

อาร์กิวเมนต์ -Xmx สำหรับการทดสอบ IntelliJ junit จะมาจาก maven-surefire-plugin หากตั้งค่าไว้

ข้อมูลโค้ด pom.xml นี้

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>-Xmx1024m</argLine>
            </configuration>
        </plugin>

ดูเหมือนว่าจะส่งอาร์กิวเมนต์ -Xmx1024 ไปยังการทดสอบจูนิทด้วย IntelliJ 2016.2.4


13

ฉันเห็นด้วยกับคนอื่น ๆ ที่บอกว่าไม่มีวิธีง่ายๆในการแจกจ่ายการตั้งค่าเหล่านี้

สำหรับ Eclipse: ขอให้เพื่อนร่วมงานของคุณตั้งค่าสิ่งต่อไปนี้:

  • การตั้งค่า Windows / Java / JRE ที่ติดตั้ง:
  • เลือก JRE / JDK ที่เหมาะสม (หรือทำเพื่อทั้งหมด)
  • แก้ไข
  • อาร์กิวเมนต์ VM เริ่มต้น: -Xmx1024m
  • เสร็จสิ้นตกลง

หลังจากนั้นการทดสอบทั้งหมดจะทำงานด้วย-Xmx1024mแต่น่าเสียดายที่คุณได้ตั้งค่าไว้ในการติดตั้ง Eclipse ทุกครั้ง บางทีคุณอาจสร้างแพ็คเกจ Eclipse แบบกำหนดเองซึ่งมีการตั้งค่านี้และมอบให้กับเพื่อนร่วมงานของคุณ

กระบวนการทำงานต่อไปนี้สามารถช่วยได้เช่นกัน: หาก IDE ไม่สามารถทำการทดสอบได้ผู้พัฒนาควรตรวจสอบว่า Maven สามารถรันการทดสอบนี้ได้หรือไม่

  • หาก Maven สามารถรันได้สาเหตุของความล้มเหลวมักจะเป็นการตั้งค่า IDE ของผู้พัฒนา นักพัฒนาควรตรวจสอบการตั้งค่าเหล่านี้
  • หาก Maven ไม่สามารถรันการทดสอบได้นักพัฒนาจะรู้ว่าสาเหตุของความล้มเหลวไม่ใช่ IDE ดังนั้นเขา / เธอสามารถใช้ IDE เพื่อดีบักการทดสอบได้

การบอกว่าโครงการต้องสร้างด้วย maven ไม่เป็นประโยชน์มากนัก (เรากำลังสร้างด้วย maven เท่านั้น) อย่างไรก็ตามโดยนัยในคำแนะนำของคุณคือเราควรเรียกใช้การทดสอบเป็นส่วนหนึ่งของวงจรการสร้าง maven เท่านั้น - เรามักใช้การทดสอบเดียวกันสำหรับการดีบักใน IDE (ด้วยประโยชน์เพิ่มเติมที่เมื่อแก้ไขข้อบกพร่องบางอย่างแล้วคุณสามารถเก็บการทดสอบเหล่านั้นไว้ในวงจรการสร้างได้อย่างง่ายดาย)
แก้ไข

ตกลง - แต่ตอนนี้คุณเพิ่งจะตอบคำตอบของ Tomasz ซ้ำ แต่ด้วยข้อกำหนดของ Eclipse ...
แก้ไข

2

คุณสามารถใช้ systemPropertyVariables (java.protocol.handler.pkgs คือชื่ออาร์กิวเมนต์ JVM ของคุณ):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <systemPropertyVariables>
            <java.protocol.handler.pkgs>com.zunix.base</java.protocol.handler.pkgs>
            <log4j.configuration>log4j-core.properties</log4j.configuration>
        </systemPropertyVariables>
    </configuration>
</plugin>

http://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html


1

ทางเลือกเฉพาะของ eclipse ที่ จำกัด ไว้ที่พารามิเตอร์ java.library.path JVM อนุญาตให้ตั้งค่าสำหรับโฟลเดอร์ต้นทางเฉพาะแทนที่จะเป็น jdk ทั้งหมดตามที่เสนอในการตอบกลับอื่น:

  1. เลือกโฟลเดอร์ต้นทางที่โปรแกรมจะเริ่มทำงาน (โดยปกติจะเป็น source / test / java)
  2. พิมพ์ alt enter เพื่อเปิดหน้า Properties สำหรับโฟลเดอร์นั้น
  3. เลือกเนทีฟในแผงด้านซ้าย
  4. แก้ไขเส้นทางดั้งเดิม เส้นทางอาจเป็นค่าสัมบูรณ์หรือสัมพันธ์กับพื้นที่ทำงานอย่างที่สองคือความยืดหยุ่นในการเปลี่ยนแปลงมากกว่า

สำหรับผู้ที่สนใจรายละเอียดว่าเหตุใดจึงควรเลือกแท็ก maven argline ให้กับ systemProperties one ดูตัวอย่างเช่น:

รับไฟล์ JNI ดั้งเดิมในการทดสอบ Maven (lwjgl)


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