Gradle'da yalnızca bir yerel test sınıfı nasıl çalıştırılır


429

Gradle'da yeniyim. Gradle 1.10 ve Ubuntu 13 kullanıyorum.

SBT'de 'testonly'ye benzer, sadece bir yerel test sınıfı yürütmek için herhangi bir komut olup olmadığını bilmek istiyorum .


Cevaplar göz önüne alındığında, bunun enstrümanlı testlerle değil, yerel testlerle ilgili olduğu açık olmalıdır . Android / Gradle bu yerel testleri "birim" testleri çağırarak işleri kafa karıştırıcı hale getiriyor.
tir38

Yanıtlar:


560

Tek bir test sınıfı çalıştırmak Airborn'un cevabı iyidir.

Burada bulunan bazı komut satırı seçeneklerini kullanarak , böyle bir şey yapabilirsiniz.

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

Sınıfın 1.10 versiyonundan bir test filtresi kullanarak testlerin seçilmesini destekler . Örneğin,

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

Çok lezzet ortamlar (Android için ortak kullanım-case) için, bu cevabı kontrol olarak, --testsargüman için desteği ve bir hata alırsınız.


Filtre yaklaşım olasılıkla bazı uygun deney seçimi için Görev kuralları ile kombine edilebilir
Matt Whipple

Büyük test paketleri için, --testssınıf içinde tek bir test yöntemini çağırmak için kullansanız bile , o zaman çok yavaş olan tüm sınıflar üzerinde bile yineleme görüyoruz. Bu yavaşlığın kıskançlığımızdan mı kaynaklandığını veya başkalarını etkileyip etkilemeyeceğini bilmiyorum. Daha fazlası bulunursa güncellenebilir.
arntg

185

Sen yapabilirsin gradle -Dtest.single=ClassUnderTestTest testsen gibi tek sınıf veya kullanım Regexp'i test etmek istiyorsanız gradle -Dtest.single=ClassName*Test testsize testler için sınıfları filtreleme daha fazla örnek bulabilirsiniz bu bağlantıyı altında bölüm 23,12. Ölçek.


30
Son sürümler (1.10'dan başlayarak) --tests, değiştirilmek üzere ayarlanmış bir komut satırı seçeneğini destekler -DtestTaskName.single.
Peter Niederwieser

58
Bu --testseçenekle, testi test sınıfınızdaki tek bir yöntemle sınırlayabilirsiniz. Örneğin: gradle test --tests *MyTest.someMethod sadece tek bir test çalışacaktır someMethodsenin içinde MyTestsınıfta. Bir test senaryosu oluşturduğum için, yalnızca hata ayıklamak için ihtiyacım olan çıktıya odaklanmayı kolaylaştırmak için bir seferde tek bir yöntem çalıştırıyorum, sonra sonunda tüm test senaryosunu çalıştırıyorum.
Jeff French

10
Ayrıca, çok modüllü bir projede tek bir test yapmak istiyorsanız, komutun olduğunu belirtmek gerekir gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Bkz gradle.org Bu tartışmaya
Bulat

2
Ayrıca --no-rebuild, örneğin gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testbağımlılıkların yeniden oluşturulmasını önlemek ve bu tek testi daha hızlı yürütmek için bir seçenek kullanmak isteyebilirsiniz .
falconepl

2
Bu seçenek 5. Sınıfta kullanımdan kaldırılmıştır
Eyal

108

Çok modüllü bir projeniz varsa:

diyelim ki modül yapınız

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

ve çalıştırmak istediğiniz test (testToRun) tam yol ile b modülünde: com.xyz.b.module.TestClass.testToRun

Burada testi b-modülünde çalıştırmakla ilgileniyorsunuz, bu yüzden b-modülü için mevcut görevleri görmelisiniz.

./gradlew :b-module:tasks

Yukarıdaki komut b modülündeki tüm görevleri açıklamalı olarak listeler. İdeal durumda, bu modüldeki birim testlerini çalıştırmak için test adlı bir göreve sahip olursunuz .

./gradlew :b-module:test

Şimdi, tüm testleri b modülünde çalıştırma noktasına ulaştınız, son olarak belirli yol modeliyle eşleşen testleri çalıştırmak için yukarıdaki göreve bir parametre iletebilirsiniz.

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

Şimdi, bunun yerine koşarsan

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

Hem modül a hem de b için test görevini çalıştırır, bu da bir modülde yukarıdaki desenle eşleşen hiçbir şey olmadığından hataya neden olabilir.


1
Veya basitçe./gradlew :b-module:test --tests testToRun
Ahmed Ashour

32

Çok düşündükten sonra, aşağıdakiler benim için çalıştı:

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


10
bu komut benim için çalışmıyor. > Hata: Bilinmeyen komut satırı seçeneği '--tests'
Tarkik

31

--testsFarklı derlemeniz varsa types/flavors(başarısız olursa Unknown command-line option '--tests') seçeneğin çalışmayabileceğini lütfen unutmayın . Bu durumda, belirli test görevini belirtmek gerekir (örneğin testProdReleaseUnitTest, sadece yerine test)


6
Bu durumla karşılaştım Teşekkürler!
JPM

Tam bir örnek verebilir misiniz? Kullanarak bir joker karakterle eşleşen 3 test çalıştırmaya çalışıyorum ve joker karakterli test adı ile ./gradlew test --tests *testMyCollectionTake*nasıl değiştirmeliyim söyleyememtest
DanielCuadra

4

gradlewKomut satırı seçeneğini kullanarak tek bir test sınıfı çalıştırma komutu aşağıdadır :

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

Sınıfı com.example.TestClassvaryant ile çalıştırmak için aşağıdaki örnek Variant_1:

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

2

Sonuna asterik (*) eklemeyi denemelisiniz.

sınıf testi - testler "com.abc *"


2

MyTest adlı tek bir test yapın:

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

0

Benim durumumda, eclipse java derleyici uyarılarım çok yüksek ayarlanmıştı ve eclipse sınıfımı yürütme için geçerli olarak tanımıyordu. Derleyici ayarlarımı güncellemek sorunu çözdü. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: ek açıklama-nonnull-çözülemez

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.