Birim Testi nasıl yazılır?


135

Bir Java sınıfım var. Üniteyi nasıl test edebilirim ?


Benim durumumda, bir ikili toplamı sınıf var. İki byte[]dizi alır , bunları toplar ve yeni bir ikili dizi döndürür.


7
JUnit gibi bir araç kullanabilir ve java sınıfınız için test senaryoları (test yöntemleri) yazabilirsiniz. Daha sonra oluşturma işleminin bir parçası olarak jUnit testlerini başlatın (ant / maven). JUnit kullanmak hiç de zor değil, zor kısmı, hataları erken ve sık sık yakalayabilmeniz için aklınıza gelebilecek kadar çok test senaryosu ortaya çıkıyor.
CoolBeans

Yanıtlar:


133
  1. Doğru bir giriş ile normal bir durum için beklenen ve istenen çıkışı tanımlayın.

  2. Şimdi, bir sınıf bildirerek testi uygulayın, herhangi bir ad verin (Genellikle TestAddingModule gibi bir şey) ve testAdd yöntemini ekleyin (örn. Aşağıdaki gibi):

    • Bir yöntem yazın ve üstüne @Test ek açıklamasını ekleyin.
    • Yöntemde, ikili toplamınızı ve assertEquals(expectedVal,calculatedVal).
    • Yönteminizi çalıştırarak test edin (Eclipse'de, sağ tıklayın, Farklı çalıştır → JUnit testi'ni seçin).

      //for normal addition 
      @Test
      public void testAdd1Plus1() 
      {
          int x  = 1 ; int y = 1;
          assertEquals(2, myClass.add(x,y));
      }
      
  3. İstediğiniz gibi başka durumlar da ekleyin.

    • Tamsayı taşması durumunda ikili toplamınızın beklenmeyen bir istisna atmadığını test edin.
    • Yöntemin Null girdileri zarif bir şekilde işlediğini test edin (aşağıdaki örnek).

      //if you are using 0 as default for null, make sure your class works in that case.
      @Test
      public void testAdd1Plus1() 
      {
          int y = 1;
          assertEquals(0, myClass.add(null,y));
      }
      

1. @ Test notasyonu gerekli mi? 2. neden assertNotNull ile null girdiyi test etmiyorsunuz? 3. Birim testlerinin sonuçları nerede tutulur? sonuçlar kullanıcıya nasıl gösterilir?
user137717

10
Evet, @Testgösterim gereklidir. Bu, birim test çalıştırıcısına, bu yöntemin bir birim testini temsil ettiğini ve yürütülmesi gerektiğini bildirmek için yapılır. Açıklama eklenmeyen yöntemler @Testtest çalıştırıcısı tarafından yürütülmez.
Ali Şah Ahmed

ikinci test için - sadece vermek nulliçin a eklememelisiniz ? yy
Adjit

Teşekkürler! staticTest yönteminin değiştiricisine neden gerek olmadığını bilmek istiyorum .
Liang Zhang

104

Her ikisine de bu yazıyı sağlamak intellij ve Eclipse .

Eclipse:

Projeniz için birim testi yapmak için lütfen aşağıdaki adımları izleyin (bu testi yazmak için Eclipse kullanıyorum):

1- Yeni -> Java Projesi'ne tıklayın.

Proje Oluştur

2- Proje adınızı yazın ve bitir'e tıklayın.

Proje Oluştur

3- Projenize sağ tıklayın. Ardından Yeni -> Sınıf'a tıklayın.

Sınıf Oluştur

4- Sınıf adınızı yazın ve bitir'e tıklayın.

Sınıf Oluştur

Ardından, sınıfı şu şekilde tamamlayın:

public class Math {
    int a, b;
    Math(int a, int b) {
        this.a = a;
        this.b = b;
    }
    public int add() {
        return a + b;
    }
}

5- Dosya -> Yeni -> JUnit Test Durumuna tıklayın.

JUnite Testi Oluştur

6- setUp () işaretini kontrol edin ve bitir'e tıklayın. SetUp (), testinizi başlattığınız yerdir.

Kurulumu Kontrol Et ()

7- Tamam'a tıklayın.

JUnit ekle

8- Burada, 7 ve 10'u ekliyorum. Yani, cevabın 17 olmasını bekliyorum. Test sınıfınızı şu şekilde tamamlayın:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class MathTest {
    Math math;
    @Before
    public void setUp() throws Exception {
        math = new Math(7, 10);
    }
    @Test
    public void testAdd() {
        Assert.assertEquals(17, math.add());
    }
}

9- Paket gezginde test sınıfınıza tıklayın ve Farklı çalıştır -> JUnit Testi üzerine tıklayın.

JUnit Testini Çalıştır

10- Bu testin sonucudur.

Test Sonucu

IntelliJ: Ekran görüntüleri için IntelliJ IDEA topluluğu 2020.1 kullandığımı unutmayın. Ayrıca, bu adımlardan önce jre'nizi ayarlamanız gerekir. JDK 11.0.4 kullanıyorum.

1- Projenizin ana klasörünü sağ tıklayın -> yeni -> dizini. Buna 'test' demelisiniz. resim açıklamasını buraya girin 2- Test klasörünü sağ tıklayın ve uygun paketi oluşturun. Orijinal sınıfla aynı ambalaj adlarını oluşturmanızı öneririm. Ardından, test dizinine sağ tıklayın -> dizini farklı işaretle -> test kaynakları kökü. resim açıklamasını buraya girin 3- Test dizinindeki doğru pakette, bir Java sınıfı oluşturmanız gerekir (Test.java kullanmanızı öneririm). resim açıklamasını buraya girin 4- Oluşturulan sınıfta '@Test' yazın. Ardından, IntelliJ'in size sunduğu seçenekler arasında, sınıf yoluna 'JUnitx' Ekle'yi seçin. 5- Test yönteminizi test sınıfınıza yazın. Yöntem imzası şöyledir:resim açıklamasını buraya girin resim açıklamasını buraya girin

@Test
public void test<name of original method>(){
...
}

Aşağıdaki gibi iddialarınızı yapabilirsiniz:

Assertions.assertTrue(f.flipEquiv(node1_1, node2_1));

Bunlar eklediğim ithalat:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

resim açıklamasını buraya girin

Bu yazdığım test: resim açıklamasını buraya girin

Aşağıdaki gibi yöntemlerinizi kontrol edebilirsiniz:

Assertions.assertEquals(<Expected>,<actual>);
Assertions.assertTrue(<actual>);
...

Birim testlerinizi çalıştırmak için, teste sağ tıklayın ve Çalıştır'a tıklayın. resim açıklamasını buraya girin

Testiniz başarılı olursa, sonuç aşağıdaki gibi olacaktır: resim açıklamasını buraya girin

Umut ediyorum bu yardım eder. Projenin yapısını GitHub https://github.com/m-vahidalizadeh/problem_solving_project içinde görebilirsiniz .


12
Cevabınızı seviyorum, en iyi "nasıl yapılır"!
alisa

4
Cevabımın yararlı olduğuna sevindim. Yorumun için teşekkür ederim.
Mohammad

1
Öğreticiler böyle görünmelidir; temiz, özlü, tam örnek. Çok iyi.
Jack Of Blades

1
Çok teşekkür ederim Jack. Yararlı bulduğunuz için memnunum.
Mohammad

18

Bu çok genel bir sorudur ve cevaplanabileceği birçok yol vardır.

Testleri oluşturmak için JUnit kullanmak istiyorsanız, testcase sınıfınızı oluşturmanız ve daha sonra testlerin altında sınıfınızın / modülünüzün belirli işlevlerini test eden bireysel test yöntemleri oluşturmanız gerekir (tek testcase sınıfları genellikle tek bir "üretim" sınıfıyla ilişkilendirilir. test edilmektedir) ve bu yöntemlerin içinde çeşitli işlemleri gerçekleştirin ve sonuçları doğru olanla karşılaştırın. Mümkün olduğunca çok köşe vakasını denemek ve örtmek özellikle önemlidir.

Özel örneğinizde, örneğin aşağıdakileri test edebilirsiniz:

  1. İki pozitif sayı arasında basit bir ekleme. Bunları ekleyin, ardından sonucun beklediğiniz gibi olduğunu doğrulayın.
  2. Pozitif ve negatif bir sayı arasında bir ekleme (ilk argümanın işareti ile bir sonuç döndürür).
  3. Pozitif ve negatif bir sayı arasında bir ekleme (ikinci argümanın işareti ile bir sonuç döndürür).
  4. İki negatif sayı arasında bir toplama.
  5. Taşmaya neden olan bir ek.

Sonuçları doğrulamak için org.junit.Assert sınıfından çeşitli assertXXX yöntemlerini kullanabilirsiniz (kolaylık olması açısından, 'static org.junit.Assert. *' Dosyasını içe aktarabilirsiniz). Bu yöntemler belirli bir koşulu test eder ve onaylamazsa (isteğe bağlı olarak belirli bir mesajla) testi başarısız olur.

Sizin durumunuzda örnek testcase sınıfı (tanımlanan yöntem içeriği olmadan):

import static org.junit.Assert.*;

public class AdditionTests {
    @Test
    public void testSimpleAddition() { ... }


    @Test
    public void testPositiveNegativeAddition() { ... }


    @Test
    public void testNegativePositiveAddition() { ... }


    @Test
    public void testNegativeAddition() { ... }


    @Test
    public void testOverflow() { ... }
}

Birim testleri yazmaya alışkın değilseniz, bunun yerine kodunuzu "görsel" olarak doğruladığınız geçici testleri yazarak test ediyorsanız (örneğin, klavyeyi kullanarak girilen bağımsız değişkenleri kabul eden ve sonuçları çıktısını alan basit bir ana yöntem yazarsınız) - ve sonra değerleri girmeye ve sonuçların doğru olup olmadığını kontrol etmeye devam ederseniz), bu tür testleri yukarıdaki formatta yazıp sonuçları manuel olarak yapmak yerine doğru assertXXX yöntemiyle doğrulayarak başlayabilirsiniz. Bu şekilde, manuel testler yapmanız gerektiğinde testi çok daha kolay bir şekilde tekrar çalıştırabilirsiniz.


8

@CoolBeans bahsettiğimiz gibi, bir göz atın jUnit . İşte size jUnit 4.x ile başlamanız için kısa bir eğitim

Son olarak, gerçekten test ve test odaklı geliştirme (TDD) hakkında daha fazla bilgi edinmek istiyorsanız, Kent Beck'in aşağıdaki kitabına bir göz atmanızı öneririm: Örnek Teste Dayalı Geliştirme .


6

Diğer yanıtlar, test sınıflarını ayarlamak için JUnit'in nasıl kullanılacağını göstermiştir. JUnit tek Java test çerçevesi değildir. Bununla birlikte, bir çerçeve kullanmanın teknik detaylarına odaklanmak, eylemlerinizi yönlendirmesi gereken en önemli kavramlardan uzaklaşmaktadır, bu yüzden bunlardan bahsedeceğim.

  • Test (her türlü şeyden) bir şeyin gerçek davranışını (Test Altındaki Sistem, SUT) beklenen davranışı ile karşılaştırır.

  • Otomatik test bir bilgisayar programı kullanılarak yapılabilir. Bu karşılaştırma esnek olmayan ve akıllı bir bilgisayar programı tarafından yapıldığından, beklenen davranışın kesin ve açık bir şekilde bilinmesi gerekir.

  • Bir programın veya bir programın (sınıf veya yöntem) bir kısmının yapması beklenen özelliktir . Test yazılımı bu nedenle SUT için bir spesifikasyona sahip olmanızı gerektirir. Bu, açık bir açıklama veya kafanızda beklenenin ne olduğuna dair örtülü bir özellik olabilir.

  • Bu nedenle otomatik birim testi, test ettiğiniz sınıfın veya yöntemin kesin ve açık bir belirtimini gerektirir.

  • Ancak bu kodu yazmak için yola çıktığınızda bu spesifikasyona ihtiyacınız vardı. Bu yüzden testin ne olduğunun bir kısmı aslında SUT'un bir satırını yazmadan önce başlar. Test Odaklı Geliştirme'nin (TDD) test tekniği bu fikri aşırıya çeker ve test edilecek kodu yazmadan önce birim test kodunu oluşturmanızı sağlar.

  • Birim test çerçeveleri SUT'unuzu iddialar kullanarak test eder . Bir iddia , SUT'un doğru davranması durumunda olması gereken mantıksal bir ifadedir ( booleansonuç türüne sahip bir ifade ; yüklem ) true. Dolayısıyla spesifikasyon, iddia olarak ifade edilmelidir (veya yeniden ifade edilmelidir).

  • Bir spesifikasyonu iddia olarak ifade etmek için kullanışlı bir teknik, sözleşmeyle programlamadır . Bu özellikler açısından ne Hedefşartlar . Bir son koşul, bir yöntemden veya bir kurucudan döndükten sonra SUT'un herkes tarafından görülebilir durumu hakkında bir iddiadır. Bazı yöntemlerde değişmez olan ve yöntemin yürütülmesinden önce ve sonra doğru olan tahminler olan son koşullar vardır . Bir sınıfın , sınıfın her kurucusunun ve yönteminin son koşulları olan değişmezlere sahip olduğu söylenebilir ve bu nedenle her zaman doğru olmalıdır . Son koşullar (ve değişmezler) yalnızca tanıtım görünür durumu: publicve protectedalanlar olarak ifade edilir.publicve protectedyöntemler (alıcılar gibi) ve yöntemlere aktarılan (referans olarak) nesnelerin herkes tarafından görülebilir durumu.


Yeni başlayanlar, burada bazı kodları nasıl test edebileceklerini soran, kodu sunarak ancak bu kodun özelliklerini belirtmeden sorular sorarlar. Bu tartışmanın gösterdiği gibi, herkesin böyle bir soruya iyi bir cevap vermesi imkansızdır , çünkü en iyi potansiyel cevaplayıcıların spesifikasyonu tahmin etmesi gerekir ve bunu yanlış yapabilir. Asker sorununun besbelli bir şartname önemini anlamıyor ve bu nedenle ben burada açıklanan temellerini anlamak gerekir acemi biri önce bazı test kodunu yazmaya çalışıyorum.

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.