Junit @Rule nasıl çalışır?


195

Bir toplu kod için test senaryoları yazmak istiyorum, JUnit @Ruleek açıklama özelliğinin ayrıntılarını bilmek istiyorum , böylece test senaryoları yazmak için kullanabilirsiniz. Lütfen basit bir örnekle işlevselliğinin ayrıntılı açıklamasını veren bazı iyi yanıtlar veya bağlantılar sağlayın.



Ben bu makaleyi@Rule oldukça iyi açıkladı , özellikle "Olayların Sıralaması Detay" son bölümüne göz
atın

Sanırım enjeksiyon kavramına benziyor, değil mi?
Chao

Bu bağlantıyı paylaştığınız için teşekkürler. Bir şey net değil. VARSAYILAN Statement.evaluate () ne zaman çağrılır? Tüm kuralların değerlendirilmesinden () önce veya hepsinden sonra mı çağrılır? Hepsinden sonra tahmin ediyorum.
MasterJoe2

@ testerjoe2 varsayılan Deyimi tamamen yok saymayı seçebilirsiniz. Buna temsilci seçmeyi ya da yerine başka bir İfadeyi koymayı seçebilirsiniz. O değil denilen olsun , sen diyoruz ya olmayabilir. Bu nokta 10'daydı: "Screenshot ifadesinin değerlendirme () yöntemi, varsayılan ifadenin değerlendirme () yöntemini çağırır."
Peter Perháč

Yanıtlar:


156

Kurallar, bir test sınıfı içindeki tüm testler için geçerli olan ancak daha genel bir şekilde ek işlevsellik eklemek için kullanılır.

Örneğin, ExternalResource kullanmak zorunda kalmadan, daha önce bir test yöntemi sonra kod çalıştırır @Beforeve @After. Bir kod kullanmak ExternalResourceyerine @Beforeve @Afterdaha iyi kod yeniden kullanımı için fırsatlar sunar; aynı kural iki farklı test sınıfından kullanılabilir.

Tasarım şunlara dayanıyordu: JUnit'teki önleyiciler

Daha fazla bilgi için bkz. JUnit wiki: Kurallar .


1
Düzeltme: "Örneğin, ExternalResource bir test sınıfından önce ve sonra kodu yürütür ." ExternalResource'un testler arasında çalışmasını sağlamak için Apply () yöntemini kullanma hakkında bir şeyler vardır.
derekm

62

Junit Kuralları AOP (en boyuta yönelik programlama) prensibi ile çalışır. Test yöntemini durdurur, böylece belirli bir test yönteminin yürütülmesinden önce veya sonra bazı şeyler yapma fırsatı sunar.

Aşağıdaki kod örneğini alın:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Yukarıdaki test yöntemi her çalıştırıldığında, geçici bir klasör oluşturulur ve yöntemin yürütülmesinden sonra silinir. Bu, Junit tarafından sağlanan kutudan çıkma kuralının bir örneğidir.

Benzer davranış, kendi kurallarımızı oluşturarak da elde edilebilir. Junit, kendi Junit Kuralımızı oluşturmak için uygulanabilecek TestRule arayüzünü sağlar.

İşte referans için yararlı bir bağlantı:


4
böylece nesneyi silmek / silmek için herhangi bir kod yazmadan silinir?
Dror

github.com/junit-team/junit4/blob/master/src/main/java/org/… kaynağına bakın , klasör before () geri arama yönteminde oluşturulur ve after () geri arama yönteminde silinir. ..
Pierluigi Vernetto

1
TemporaryFolder'ın neden silindiğini anlayamamış kişiler için, Junit tarafından otomatik olarak silinen bir geçici klasör olarak hizmet vermek için sağlanan bir TemporaryFolder - yani yırtma adımı TemporaryFolder sınıfının bir parçasıdır.
Mindaugas Bernatavičius

18

Nasıl çalıştığının açıklaması:

JUnit, test yönteminizi bir Deyim nesnesine sarar, böylece ifade ve Execute()testinizi çalıştırır. Daha sonra statement.Execute(), JUnit doğrudan testinizi çalıştırmak için çağırmak yerine , @RuleEk Açıklama ile bir TestRule deyimini iletir . TestRule'un "Apply" işlevi, testinizle birlikte Statement verilen yeni bir Statement döndürür. Yeni Statement'ın Execute()yöntemi, test Statement'ın execute metodunu çağırabilir (veya çağıramaz veya birden çok kez çağırabilir) ve istediği her şeyi yapabilir before and after.

Şimdi, JUnit'in sadece sınamayı çalıştırmaktan daha fazlasını yapan yeni bir Deyimi var ve sonunda Execute'u çağırmadan önce bunu daha fazla kurala aktarabilir.


2
İfadenin yürütme değil değerlendirme yöntemi vardır.
Hemanth

0

Kurallar, her test yönteminin davranışını genel bir şekilde geliştirmek için kullanılır. Junit kuralı test yöntemini durdurur ve bir test yöntemi yürütülmeye başlamadan önce ve bir test yöntemi yürütüldükten sonra bir şeyler yapmamıza izin verir.

Örneğin, @Timeout kuralını kullanarak tüm testler için zaman aşımını ayarlayabiliriz.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@TemporaryFolder kuralı geçici klasörler, dosyalar oluşturmak için kullanılır. Test yöntemi her yürütüldüğünde geçici bir klasör oluşturulur ve yöntemin yürütülmesinden sonra silinir.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Bu bağlantıda junit tarafından sağlanan bazı yerleşik kuralların örneklerini görebilirsiniz .

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.