JUnit: test araçları sınıflarında "çalıştırılabilir yöntem yok" dan nasıl kaçınılır


118

JUnit3.8'den JUnit4.4'e geçtim. Testlerimi ant kullanarak çalıştırıyorum, tüm testlerim başarılı bir şekilde çalışıyor ancak test aracı sınıfları "Çalıştırılabilir yöntem yok" hatasıyla başarısız oluyor. Kullandığım desen, test klasörü altında * Test * adındaki tüm sınıfları dahil etmek.

Koşucunun @ Test özniteliği ile açıklanmış herhangi bir yöntem bulamadığını anlıyorum. Ancak böyle bir açıklama içermezler çünkü bu sınıflar test değildir. Şaşırtıcı bir şekilde bu testleri tutulma sırasında çalıştırırken, bu sınıflardan şikayet etmiyor.

JUnit3.8'de, bu yardımcı program sınıfları TestCase'i genişletmediğinden, koşucu onları çalıştırmaya çalışmadığı için hiç sorun değildi.

Bu belirli sınıfları ant script'inin junit hedefinde hariç tutabileceğimi biliyorum. Ancak, eklediğim her yeni yardımcı program sınıfında yapı dosyasını değiştirmek istemiyorum. Ayrıca sınıfları yeniden adlandırabilirim (ancak sınıflara iyi isimler vermek her zaman en zayıf yeteneğimdi :-))

Bu problem için zarif bir çözüm var mı?


Testleriniz Eclipse / NetBeans / favori IDE'nizde çalışıyor mu?
guerda

Tutulma kullanıyorum. Aslında orada bir sorun yok, bir şekilde tutulma bu sınıfları çalıştırmaya çalışmıyor. Nasıl olduğunu merak ediyorum?
LiorH

Sorunuzu anladık mı bilmiyorum. Lütfen sorunuzu tekrar okuyun ve muhtemelen biraz daha bilgi ekleyin.
guerda

1
@guerda: Soru bana oldukça açık görünüyor. Ant görevi, test içermeyen sınıflar bulmaktır, çünkü filtre fayda sınıfını seçmektedir. Bu nedenle, hala tamamen alakalı olduğuna inandığım cevabım.
Jon Skeet

LiorH: Açıklığa kavuşturduğunuz için teşekkürler, bu yüzden cevabım boşa
gitmiş

Yanıtlar:


50

Eğer test sınıfları bulmak için kullanılan desen kontrolü sizdedir varsayarsak, bunu maç için değiştirmeniz önerilir ediyorum *Testziyade *Test*. Bu yol TestHelpereşleşmeyecek, ancak eşleşecek FooTest.


1
Yardımcı olacağını sanmıyorum, çünkü JUnit 4.4'e geçti ve bu önemli olmamalı.
guerda

2
Cevabımın amacını kaçırmış gibisin. Test olarak değerlendirilecek sınıfları belirlemek için bir isim filtresine sahiptir. Filtreyi değiştirirse, yardımcı sınıfları kolayca hariç tutabilir.
Jon Skeet

1
Öneriniz geçerli, ancak test derslerime baktım ve bazıları Test ile başlıyor ve bazıları Test ile bitiyor. Hizmet sınıfları ile gerçek test sınıfları arasında net bir ayrım yoktur. Önerdiğiniz sözleşmenin iyi bir uygulama olduğunu düşünüyor musunuz? (yani
araçlar

4
Test senaryosu sınıflarına * Test ile son eklemeniz neredeyse bir kuraldır. Test sınıflarını uygun şekilde yeniden adlandırarak yeniden düzenlemeniz ve ayrıca yardımcıları bu son ek kuralını kullanmamaları için yeniden adlandırmanız gerekebilir.
Spoike

2
Spoike'a katılıyorum - sınıfın adından test mi yoksa yardımcı mı olduğunu anlayamıyorsanız, sınıfı yeniden adlandırmalısınız. Kural daha çok "sınıf, ancak ve ancak Test ile biterse bir testtir." Fayda sınıfları Test ile başlayabilir veya başlamayabilir - önemli değil.
Jon Skeet

142

Kullanım sınıflarınıza @Ignore ile açıklama ekleyin. Bu, JUnit'in bunları test olarak çalıştırmamasına neden olur.


6
Aslında hayır, olmamalı. @Ignore, testleri geçici olarak devre dışı bırakmak içindir.
Alice Young

1
Üzgünüm ama bu kötü bir fikir. Sadece bir test modeliyle eşleşebilecekleri için üretim kodunuza testle ilgili ek açıklamalarla açıklama eklemeye başlamak ister misiniz? Doğru cevap, testler için desen eşleştirmesini tetikliyorlarsa sınıf adlarını düzeltmektir. Ve kalıbın yalnızca Test ile BİTEN sınıfları bulduğundan emin olun. Bu yaygın olarak kabul edilen bir kalıp
Kevin M

Evet, bu kötü ve kaldıramayacağım başka bir ek oyla katkıda bulunana kadar bunun farkında değildim. Temel sınıfınızı soyutlayın, ardından JUnit bunu yok sayacaktır. @ Gmoore'un aşağıdaki cevabına bakın.
Ryan Shillington

83

Benim özel durumumda aşağıdaki senaryo var. Testlerimiz

public class VenueResourceContainerTest extends BaseTixContainerTest

hepsi uzar

BaseTixContainerTest

ve JUnit BaseTixContainerTest'i çalıştırmaya çalışıyordu. Zavallı BaseTixContainerTest sadece kabı kurmaya, müşteriyi kurmaya, pizza sipariş etmeye ve rahatlamaya çalışıyordu ... adamım.

Daha önce bahsedildiği gibi, sınıfa ek açıklama ekleyebilirsiniz.

@Ignore

Ancak bu, JUnit'in bu testi atlandı olarak rapor etmesine neden oldu (tamamen göz ardı edilmek yerine).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1

Bu beni biraz rahatsız etti.

Bu yüzden BaseTixContainerTest'i soyut yaptım ve şimdi JUnit bunu gerçekten görmezden geliyor.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

7
@Ignore
Şundan

Ben @Ignore yaklaşımı çalıştı ve 's iyi, o zaman ben bu cevabı okumak ve, alında kendimi tokatladı iyi ki, düşünce "Tabii tabii !"
dnuttle

38

JUnit'in test temel sınıfınızı başlatmasını önlemek için,

public abstract class MyTestBaseClass { ... whatever... }

(@Ignore, geçici olarak göz ardı edilen testler için ayırdığım göz ardı edildiğini bildiriyor .)


3
JUnit çalıştırıcıları genellikle soyut sınıfları da başlatmaya çalışır ve ardından bir örnekleme hatasıyla başarısız olur.
Holly Cummins

Temel test derslerim için mükemmel çalışıyor
ruX

3
Bu, soyut değiştirici nedeniyle değil, ad nedeniyle çalışıyor (Test'te bitmiyor). Sınıf adını MyBaseClassTest olarak değiştirin ve @HollyCummins (ve başarısız) tarafından belirtildiği gibi somutlaştırmaya çalışacaktır
Hutch

Benim durumumda olmalı protected abstract class.
Mistik Lin

18
  1. Bu, örneğin AbstractTest gibi temel test sınıfınızsa ve tüm testleriniz bunu genişletirse, bu sınıfı soyut olarak tanımlayın
  2. Util sınıfı ise, sınıftan * Test'i kaldırın, MyTestUtil veya Utils vb. Adını değiştirin.

10

İçe aktarma eklemek için bir IDE'nin kod tamamlamasını kullanırken dikkatli olun @Test.

Örneğin olmalı import org.junit.Testve olmamalı import org.testng.annotations.Test. İkincisini yaparsanız, "çalıştırılabilir yöntem yok" hatası alırsınız.


Bu bir cevaptan ziyade bir yorum olmalıdır.
Swaranga Sarma

3
Neden anlamıyorum Bu geçerli bir çözüm.
Sridhar Sarnobat

4
Intellij Idea 2017, org.junit.jupiter.api.Testbunun yerine içe aktararak aklımı karıştırıyordu ! ama senin sayende şimdi çözüldü
AmiNadimi

Çok teşekkür ederim, "çalıştırılabilir yöntem yok" problemi alırken kafam karıştı.
Peter S.

7

Ant şimdi skipNonTeststam olarak aradığınız şeyi yapmak için tasarlanmış bir özellik ile geliyor . Temel sınıflarınızı soyutlamak veya bunlara ek açıklamalar eklemek için değiştirmenize gerek yok.


2
Görünüşe göre bu skipNonTestsözellik sadece ant 1.9+ sürümünde mevcut, ki bu çok utanç verici çünkü inanılmaz derecede kullanışlı görünüyor. Ayrıca soyut test üst sınıflarını da hariç tutacaktır.
Holly Cummins

4

Bu sınıflara boş bir test yöntemi eklemeye ne dersiniz?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() {
    assertTrue(true); // do nothing;
}

8
ama bu, yaptığımız testlerin sayısını yanlış bir şekilde artırıyor :) bu büyük bir
mesele

1

Test sınıfınızda import org.junit.jupiter.api.Test yazdıysanız; onu silin ve import org.junit.Test yazın; Bu durumda benim de işe yaradı.


1
inanılmaz, işe yaradı. Windows komut satırında manuel olarak çalıştırdım. ancak başka bir sorun da bu @BeforeAllve @AfterAllçalıştırılmamasıdır.
BingLi224

görünüşte, JUnit4 çalıştı ( @BeforeClassve JUnit5 çalışmadı @AfterClass. Referans: junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

En basit kod parçasını (@Test, @Before vb. Kullanarak) çalıştırmada da benzer bir sorunla ("çalıştırılabilir yöntemler yok ..") karşı karşıyaydım ve çözümü hiçbir yerde bulamadım. Junit4 ve Eclipse SDK sürüm 4.1.2 kullanıyordum. En son Eclipse SDK 4.2.2'yi kullanarak sorunumu çözdüm. Umarım bu, benzer bir sorunla mücadele eden insanlara yardımcı olur.

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.