Komut satırı kullanarak bir JUnit sınıfından tek bir test çalıştırın


97

Sadece komut satırı ve java kullanarak bir JUnit sınıfından tek bir test çalıştırmama izin verecek bir yaklaşım bulmaya çalışıyorum.

Aşağıdakileri kullanarak tüm testleri sınıftan çalıştırabilirim:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Gerçekten yapmak istediğim şey şöyle bir şey:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

veya:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Bunu JUnit açıklamalarını kullanarak yapmanın bir yolu olabileceğini fark ettim, ancak test sınıflarımın kaynağını elle değiştirmemeyi tercih ederim (bunu otomatikleştirmeye çalışarak). Maven'in bunu yapmak için bir yolu olabileceğini de gördüm, ancak mümkünse Maven'e bağlı olmaktan kaçınmak isterim.

Öyleyse bunu yapmanın bir yolu var mı diye merak ediyorum?


Aradığım anahtar noktalar:

  • Bir JUnit test sınıfından tek bir test çalıştırma yeteneği
  • Komut Satırı (JUnit kullanarak)
  • Test kaynağını değiştirmekten kaçının
  • Ek araçlar kullanmaktan kaçının

4
Harika, başka bir "Unix benim IDE'm" türü meraklısı. Bir editör için bir IDE kullanmayı seviyorum (özellikle NetBeans için vim eklentisi ile), ancak "sonsuza kadar" süren ve keyfi konfigürasyonlarda bir araya getirilebilen küçük keskin araçların, devam eden bir IDE markaları ve versiyonları. Aferin sana!
Roboprog

2
Maven'den kaçınmak istediğini söyledin. Bunu maven kullanarak yapmak isteyenler için buraya bakın, maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Yanıtlar:


79

Özel, barebone bir JUnit koşucusunu oldukça kolay bir şekilde yapabilirsiniz. İşte formda tek bir test yöntemi çalıştıracak olan com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Bunu şu şekilde çağırabilirsiniz:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

JUnit kaynağına hızlı bir şekilde baktıktan sonra, JUnit'in bunu yerel olarak desteklemediği konusunda sizinle aynı sonuca vardım. IDE'lerin tümü, diğer eylemlerin yanı sıra test yöntemini imlecin altında çalıştırmanıza izin veren özel JUnit entegrasyonlarına sahip olduğundan, bu benim için hiçbir zaman sorun olmadı. JUnit testlerini doğrudan komut satırından çalıştırmadım; Her zaman IDE'nin veya inşa aracının (Ant, Maven) bununla ilgilenmesine izin verdim. Özellikle varsayılan CLI giriş noktası (JUnitCore), test başarısızlıklarında sıfır olmayan çıkış kodu dışında herhangi bir sonuç çıktısı üretmediğinden.

NOT: JUnit sürümü> = 4.9 için sınıf yolunda hamcrest kitaplığına ihtiyacınız var


2
Aslında, bir testteki bir iddia başarısız olduğunda günlükte tam bir yığın takibi aldığımı ve her iddiadan gerçekleşmemiş beklentiyi açıklayan (tanımlandığında isteğe bağlı) mesajı aldığımı hatırlıyorum. Çalışma için teşekkürler.
Roboprog


-2

IntelliJ kullandık ve onu anlamaya çalışmak için oldukça zaman harcadık.

Temel olarak 2 adımdan oluşur:

Adım 1: Test Sınıfını Derleyin

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

2. Adım: Testi çalıştırın

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest


6
Bu, yalnızca bir testi değil, sınıftaki her testi çalıştırır.
Soyguncu
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.