Làm thế nào để chỉ chạy một lớp kiểm tra cục bộ trên Gradle


428

Tôi mới đến Gradle. Tôi sử dụng Gradle 1.10 và Ubuntu 13.

Tôi muốn biết nếu có bất kỳ lệnh nào chỉ thực hiện một lớp kiểm tra cục bộ , tương tự như 'testonly' trong SBT.


Đưa ra các câu trả lời, cần phải rõ ràng đây là về các bài kiểm tra địa phương , không phải bài kiểm tra cụ . Android / Gradle khiến mọi thứ trở nên khó hiểu bằng cách gọi các bài kiểm tra "đơn vị" kiểm tra cục bộ này.
tir38

Câu trả lời:


559

Để chạy một lớp kiểm tra duy nhất Câu trả lời của Airborn là tốt.

Với việc sử dụng một số tùy chọn dòng lệnh, được tìm thấy ở đây , bạn có thể chỉ cần làm một cái gì đó như thế này.

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

Từ phiên bản 1.10 của lớp, nó hỗ trợ chọn các bài kiểm tra, sử dụng bộ lọc kiểm tra . Ví dụ,

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"
   }
}

Đối với môi trường đa hương vị (trường hợp sử dụng phổ biến cho Android), hãy kiểm tra câu trả lời này , vì --testsđối số sẽ không được hỗ trợ và bạn sẽ gặp lỗi.


cách tiếp cận bộ lọc có thể cũng có thể được kết hợp với các quy tắc Nhiệm vụ cho một số lựa chọn kiểm tra thuận tiện
Matt Whoop

Đối với các bộ kiểm thử lớn, ngay cả khi sử dụng --testsđể gọi một phương thức kiểm tra duy nhất trong lớp, thì chúng ta sẽ thấy phép lặp trên tất cả các lớp ngay cả tất cả những lớp không được chạy, quá chậm. Không biết rằng sự chậm chạp đó là do env của chúng tôi hay nó sẽ ảnh hưởng đến người khác. Có thể cập nhật nếu tìm thêm.
arntg

185

Bạn có thể làm gradle -Dtest.single=ClassUnderTestTest testnếu bạn muốn kiểm tra lớp đơn hoặc sử dụng biểu thức chính quy như gradle -Dtest.single=ClassName*Test testbạn có thể tìm thêm ví dụ về các lớp lọc cho các bài kiểm tra trong phần liên kết này 23.12. Kiểm tra.


30
Các phiên bản gần đây (bắt đầu từ 1.10 trở lên) hỗ trợ --teststùy chọn dòng lệnh, được đặt để thay thế -DtestTaskName.single.
Peter Niederwieser

58
Với --testtùy chọn, bạn cũng có thể giới hạn kiểm tra theo một phương thức duy nhất trong lớp kiểm tra của mình. Ví dụ: gradle test --tests *MyTest.someMethod sẽ chỉ chạy thử nghiệm duy nhất someMethodtrong MyTestlớp của bạn . Khi tôi đang xây dựng một trường hợp thử nghiệm, tôi thường chạy một phương thức duy nhất tại một thời điểm để dễ dàng tập trung vào chỉ đầu ra mà tôi cần gỡ lỗi, sau đó chạy toàn bộ trường hợp thử nghiệm ở cuối.
Jeff Pháp

10
Cũng đáng lưu ý rằng nếu bạn muốn chạy thử nghiệm đơn lẻ trong một dự án đa mô-đun, thì lệnh là gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Xem cuộc thảo luận này trên gradle.org
Bulat

2
Bạn cũng có thể muốn sử dụng một --no-rebuildtùy chọn, ví dụ gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testđể ngăn chặn các phụ thuộc được xây dựng lại, và lần lượt thực hiện thử nghiệm đơn lẻ đó nhanh hơn.
falconepl

2
Tùy chọn này không được chấp nhận trong Lớp 5 mặc dù
Eyal

108

Trong trường hợp bạn có một dự án đa mô-đun:

hãy để chúng tôi nói cấu trúc mô-đun của bạn là

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

và thử nghiệm (testToRun) mà bạn đang tìm kiếm để chạy trong mô-đun b, với đường dẫn đầy đủ: com.xyz.b.module.TestClass.testToRun

Như ở đây, bạn quan tâm đến việc chạy thử nghiệm trong mô-đun b, vì vậy bạn sẽ thấy các tác vụ có sẵn cho mô-đun b.

./gradlew :b-module:tasks

Lệnh trên sẽ liệt kê tất cả các tác vụ trong mô-đun b với mô tả. Và trong trường hợp lý tưởng, bạn sẽ có một nhiệm vụ có tên là test để chạy thử nghiệm đơn vị trong mô-đun đó.

./gradlew :b-module:test

Bây giờ, bạn đã đạt đến điểm để chạy tất cả các thử nghiệm trong mô-đun b, cuối cùng bạn có thể chuyển một tham số cho tác vụ trên để chạy thử nghiệm phù hợp với mẫu đường dẫn nhất định

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

Bây giờ, thay vì điều này nếu bạn chạy

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

Nó sẽ chạy nhiệm vụ thử nghiệm cho cả mô-đun a và b, điều này có thể dẫn đến thất bại vì không có gì khớp với mẫu trên trong mô-đun.


1
Hoặc đơn giản hơn./gradlew :b-module:test --tests testToRun
Ahmed Ashour

32

Sau khi tìm hiểu kỹ, những điều sau đây đã giúp tôi:

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


10
lệnh này không làm việc cho tôi. > Lỗi: Tùy chọn dòng lệnh không xác định '--tests'
Tarkik

31

Xin lưu ý rằng --teststùy chọn có thể không hoạt động nếu bạn có bản dựng khác types/flavors(không thành công Unknown command-line option '--tests'). Trong trường hợp này, cần phải chỉ định tác vụ thử nghiệm cụ thể (ví dụ testProdReleaseUnitTestthay vì chỉ test)


6
Ran vào tình huống chính xác này Cảm ơn!
JPM

Bạn có thể xây dựng một ví dụ đầy đủ? Tôi đang cố gắng chạy 3 bài kiểm tra khớp với ký tự đại diện bằng cách sử dụng ./gradlew test --tests *testMyCollectionTake*và tôi không thể biết nên thay thế testbằng tên kiểm tra ký tự đại diện
DanielCuadra

4

Dưới đây là lệnh để chạy một lớp thử nghiệm bằng cách sử dụng gradlewtùy chọn dòng lệnh:

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

Ví dụ dưới đây để chạy lớp com.example.TestClassvới biến thể Variant_1:

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

2

Bạn nên cố gắng thêm dấu hoa thị (*) vào cuối.

kiểm tra xếp loại - bài kiểm tra "com.abc *"


2

Chạy thử nghiệm duy nhất được gọi là MyTest:

./gradlew app:testDebug --tests=com.example.MyTest

0

Trong trường hợp của tôi, các cảnh báo trình biên dịch java nhật thực của tôi được đặt quá cao và nhật thực không nhận ra lớp của tôi là hợp lệ để thực thi. Cập nhật cài đặt trình biên dịch của tôi đã khắc phục sự cố. Bạn có thể đọc thêm về nó ở đây: chú thích-không phải là không thể giải quyết

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.