วิธีการรันคลาสการทดสอบเฉพาะที่บน Gradle


429

ฉันใหม่กับ Gradle ฉันใช้ Gradle 1.10 และ Ubuntu 13

ฉันต้องการที่จะทราบว่ามีคำสั่งใด ๆ ในการดำเนินการเพียงคนเดียวในท้องถิ่นระดับทดสอบคล้ายกับ 'testonly ใน SBT


ให้คำตอบที่ชัดเจนมันเป็นเรื่องเกี่ยวกับการทดสอบในท้องถิ่นไม่ใช่การทดสอบด้วยเครื่องมือ Android / Gradle ทำให้สิ่งต่าง ๆ เกิดความสับสนโดยการเรียกการทดสอบ "หน่วย" ในท้องถิ่น
tir38

คำตอบ:


560

เมื่อต้องการเรียกใช้คำตอบของ Airborn คลาสการทดสอบเดียวเป็นสิ่งที่ดี

ด้วยการใช้ตัวเลือกบรรทัดคำสั่งซึ่งพบได้ที่นี่คุณสามารถทำสิ่งนี้ได้

gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui

จาก 1.10 รุ่นของ gradle จะสนับสนุนการทดสอบการเลือกใช้ตัวกรองการทดสอบ ตัวอย่างเช่น,

apply plugin: 'java'

test {
  filter {
    //specific test method
      includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"

     //specific test method, use wildcard for packages
     includeTestsMatching "*SomeTest.someSpecificFeature"

     //specific test class
     includeTestsMatching "org.gradle.SomeTest"

     //specific test class, wildcard for packages
     includeTestsMatching "*.SomeTest"

     //all classes in package, recursively
     includeTestsMatching "com.gradle.tooling.*"

     //all integration tests, by naming convention
      includeTestsMatching "*IntegTest"

     //only ui tests from integration tests, by some naming convention
     includeTestsMatching "*IntegTest*ui"
   }
}

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


วิธีการกรองอาจรวมกับกฎงานสำหรับการเลือกทดสอบที่สะดวก
Matt Whipple

สำหรับชุดทดสอบขนาดใหญ่แม้ว่าจะใช้--testsในการเรียกวิธีการทดสอบเดียวในชั้นเรียนเราจะเห็นการวนซ้ำในทุกชั้นเรียนแม้ทั้งหมดที่ไม่ได้ทำงานซึ่งช้าเกินไป ไม่ทราบว่าความช้านั้นเกิดจากความอิจฉาของเราหรือไม่ สามารถอัปเดตหากค้นหาเพิ่มเติม
19

185

คุณสามารถทำได้gradle -Dtest.single=ClassUnderTestTest testถ้าคุณต้องการทดสอบชั้นเดียวหรือใช้ regexp เช่นเดียวกับที่gradle -Dtest.single=ClassName*Test testคุณสามารถหาตัวอย่างเพิ่มเติมของชั้นเรียนกรองสำหรับการทดสอบภายใต้ลิงค์นี้ส่วน 23.12 ทดสอบ.


30
รุ่นล่าสุด (ราคาเริ่มต้นที่ 1.10 หรือดังนั้น) สนับสนุนการเลือกบรรทัดคำสั่งซึ่งเป็นชุดที่จะเข้ามาแทนที่--tests -DtestTaskName.single
Peter Niederwieser

58
ด้วย--testตัวเลือกที่คุณสามารถ จำกัด การทดสอบเป็นวิธีการเดียวในชั้นเรียนทดสอบของคุณ ตัวอย่างเช่น gradle test --tests *MyTest.someMethod จะทำการทดสอบเพียงครั้งเดียวsomeMethodในMyTestชั้นเรียนของคุณ ในขณะที่ฉันกำลังสร้างกรณีทดสอบฉันมักจะเรียกใช้วิธีการเดียวในแต่ละครั้งเพื่อให้ง่ายต่อการมุ่งเน้นไปที่ผลลัพธ์ที่ฉันต้องการในการดีบักจากนั้นจึงเรียกใช้กรณีทดสอบทั้งหมดในตอนท้าย
Jeff French

10
gradle -D:submodule:test.single=ClassUnderTestTest :submodule:testนอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าคุณต้องการที่จะเรียกใช้การทดสอบเดียวในโครงการหลายโมดูลแล้วคำสั่ง ดูการสนทนานี้ใน gradle.org
Bulat

2
คุณอาจต้องการใช้--no-rebuildตัวเลือกเช่นgradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testเพื่อป้องกันการพึ่งพาสร้างขึ้นมาใหม่และเพื่อดำเนินการทดสอบเดียวที่รวดเร็วขึ้น
falconepl

2
ตัวเลือกนี้เลิกใช้ใน Gradle 5 แม้ว่า
Eyal

108

ในกรณีที่คุณมีโครงการหลายโมดูล:

ให้เราบอกว่าโครงสร้างโมดูลของคุณคืออะไร

root-module
 -> a-module
 -> b-module

และการทดสอบ (testToRun) ที่คุณต้องการเรียกใช้อยู่ในโมดูล b โดยมีพา ธ เต็ม: com.xyz.b.module.TestClass.testToRun

ที่นี่คุณสนใจที่จะทำการทดสอบในโมดูล b ดังนั้นคุณควรเห็นงานที่มีสำหรับโมดูล b

./gradlew :b-module:tasks

คำสั่งด้านบนจะแสดงรายการงานทั้งหมดในโมดูล b พร้อมคำอธิบาย และในกรณีที่เหมาะสมที่สุดคุณจะมีภารกิจชื่อทดสอบเพื่อเรียกใช้การทดสอบหน่วยในโมดูลนั้น

./gradlew :b-module:test

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

./gradlew :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"

ตอนนี้แทนที่จะเป็นแบบนี้ถ้าคุณวิ่ง

./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"

มันจะรันงานทดสอบสำหรับทั้งโมดูล a และ b ซึ่งอาจส่งผลให้เกิดความล้มเหลวเนื่องจากไม่มีสิ่งใดที่ตรงกับรูปแบบข้างต้นในโมดูล


1
หรือเพียง./gradlew :b-module:test --tests testToRun
Ahmed Ashour

32

หลังจากหาคำตอบได้มากแล้ว

gradle test --tests "a.b.c.MyTestFile.mySingleTest"


10
คำสั่งนี้ไม่ทำงานสำหรับฉัน > ข้อผิดพลาด: ตัวเลือกบรรทัดคำสั่งที่ไม่รู้จัก '--tests'
Tarkik

31

โปรดทราบว่า--testsตัวเลือกอาจไม่ทำงานหากคุณมีบิลด์ที่แตกต่างtypes/flavors(ล้มเหลวUnknown command-line option '--tests') ในกรณีนี้จำเป็นต้องระบุงานทดสอบเฉพาะ (เช่นtestProdReleaseUnitTestแทนที่จะเป็นแค่test)


6
วิ่งเข้าไปในสถานการณ์ที่แน่นอนนี้ขอบคุณ!
JPM

คุณสามารถอธิบายตัวอย่างเต็มรูปแบบได้หรือไม่? ฉันพยายามเรียกใช้การทดสอบ 3 ครั้งที่ตรงกับการใช้ไวด์การ์ด./gradlew test --tests *testMyCollectionTake*และฉันไม่สามารถบอกได้ว่าฉันควรแทนที่testด้วยชื่อการทดสอบไวด์การ์ด
DanielCuadra

4

ด้านล่างเป็นคำสั่งให้รันคลาสทดสอบเดียวโดยใช้gradlewตัวเลือกบรรทัดคำสั่ง:

gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

ตัวอย่างด้านล่างเพื่อเรียกใช้คลาสที่com.example.TestClassมีชุดตัวเลือกVariant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 

2

คุณควรลองใส่เครื่องหมายดอกจัน (*) ลงท้าย

การทดสอบเกรด - ทดสอบ "com.abc *"



0

ในกรณีของฉันคำเตือนคอมไพเลอร์ eclipse java ของฉันถูกตั้งค่าไว้สูงเกินไปและ eclipse ไม่รู้จักคลาสของฉันว่าถูกต้องสำหรับการดำเนินการ การอัปเดตการตั้งค่าคอมไพเลอร์ของฉันแก้ไขปัญหาได้ คุณสามารถอ่านเพิ่มเติมได้ที่นี่: annotation-nonnull-ไม่สามารถแก้ไขได้

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