Tanım: JUnit'de, bir test sınıfında, birden fazla test methodunun ihtiyaç duyacağı aynı değer ve nesneleri, testler çalışmadan önce yaratmak için kullanılan annotation.
Tanım: JUnit'de, bir test sınıfında, birden fazla test methodunun çalışmasından sonra ortak bazı kodların çalışması için kullanılan annotation. Örneğin bazı kaynakların serbest bırakılması vb.. bu method ile yapılır.
Tanım: JUnit'de, bir test sınıfındaki test method'ları çalıştırılmaya başlamadan önce yapılması gereken işlerin yapıldığı method'u tanımlamak için kullanılan annotation
Tanım: JUnit'de, bir test sınıfındaki test method'larının hepsinin tamamlanmasından sonra yapılması gereken işlerin yapıldığı method'u tanımlamak için kullanılan annotation
Tanım: Bir test methodunu çalıştırılmaması için kullanılan annotation. Bir test bloğunu silmek veya yorum yapmak yerine başına @Ignore eklemek yeterli olur.
Tanım: JUnit'de, bir koşulun gerçekleşmemesi durumunda testi kesmek (örneğin test için gerekli ön koşulların oluşmaması durumu) için kullanılan sınıf. assumeThat, assumeTrue gibi farklı fonksiyonları bulunmaktadır.
Tanım: Farklı parametre ve bu parametrelerle yapılabilecek farklı olasılıkları test etmeyi sağlayan sınıf ve bu sınıf. heory kullanılacak test sınıfının başına @RunWith(Theories.class) eklenir. @DataPoint ile parametreler, @Theory ile de test method'u tanımlanır.
Tanım: Junit'de test method'larının ve sınıflarınının kategorilere ayırmak için kullanılan sınıf ve bu sınıfın annotation'ı. @Category(X.class) ile bir test methodunun X.class kategorisine ait olduğu belirtilmiş olur. Bir test suitte @RunWith(Categories.class) @IncludeCategory(X.class) ifadeleri ile, sadece X kategorisindeki testlerin çalışması sağlanabilir. Benzer şekilde @ExcludeCategory(X.class) ile X hariç diğer kategorilerin çalışması sağlanabilir.
JUnit'de bir değerin veya nesnenin, beklendiği gibi olup olmadığını test amacıyla kullanılan , assert ile başlayan en önemli method'lar ve ne işe yaradıkları aşağıdaki gibidir:
assertEquals : Değer ile beklenen değerin eşitliğini kontrol eder. Eşit ise test başarılıdır
assertNotEquals : Değer ile beklenen değerin eşit olmamasını kontrol eder. Eşit değilse test başarılıdır
assertNull : Bir nesnenin null olmasını kontrol eder. Null ise test başarılıdır.
assertNotNull : Bir nesnenin null olmamasını kontrol eder. Null değilse test başarılıdır.
assertTrue : Değerini true olmasını kontrol eder. Değer true ise test başarılıdır
assertFalse: Değerini false olmasını kontrol eder. Değer false ise test başarılıdır
assertSame : İki nesnenin aynı olup olmadığını (aynı nesneye refrans vermesi) kontrol eder. İki nesne aynı ise test başarılıdır
assertNotSame : İki nesnenin aynı olup olmadığını (aynı nesneye refrans vermesi) kontrol eder. İki nesne aynı değil ise test başarılıdır
assertThat : Macther ile belirtilen koşula uyup uyulmadığını kontrol eder. Hamcrest kütüphanesi desteklenmektedir
assertArrayEquals : İki dizinin eşitliğini kontrol eder. Eşit ise test başarılıdır
Bazı testler, exception oluşup oluşmadığını test etmek amacıyla yapılabilir. Örneğin pozitif bir int değeri alması gereken bir fonksiyonda, negatif bir sayı verildiğinde IllegalArgumentException fırlatması gerekiyor ise, test negatif bir sayı ile çağrırarak yapılabilir. Örneğin aşağıdaki gibi bir kod IllegalArgumentException fırlatılmasını bekliyor anlamına gelir:
@Test(expected = IllegalArgumentException.class)
public void negatifTest(){
Simple.isle(3,-1);
}
Simple sınıfındaki isle methodu , IllegalArgumentException fırlatmalıdır. Eğer IllegalArgumentException oluşmaz ise test başarısız olmuştur
JUnit , Hamcrest ile matching (eşleme) desteklemektedir. Kullanılabilecek bazı önemli fonksiyonlar aşağıdaki gibidir:
is : Örneğin assertThat(d, is(1.3)) , d değerinin 1.3 olmasını test eder
not : Örneğin assertThat(d, is(not(1.3))), d değerinin 1.3 olmaması durumunu test eder
equalTo : assertThat(str, equalTo("test")), str'in "test" ifadesine eşit olmasını test eder
anyOf : assertThat(str, anyOf(is("A"), is("B"), is("C"))) , str ifadesinin A veya B veya C olup olmadığını test eder. Eğer str A,B veya C ise test başarılıdır
allOf : assertThat(list, allOf(hasItem("A"), hasItem("B"))), list'de hem A hem de B var ise test başarılıdır
any : assertThat(obj, is(any(String.class))) , obj nesnesi bir String ise test başarılıdır
instanceOf : assertThat(obj, is(instanceOf(String.class))) , obj nesnesi bir String ise test başarılıdır
nullValue : assertThat(obj, is(nullValue())), obj nesnesi null ise test başarılıdır
public class SimpleTest {
public int topla(int a, int b){
return a+b;
}
}
Kod sadece verilen iki sayıyı toplamaktadır. topla method'unun doğru çalıştığını test etmek için aşağıdaki gibi bir test sınıfı yazılabilir:
import org.junit.*;
import static org.junit.Assert.*;
public class Tester {
@Test
public void testTopla(){
SimpleTest simple=new SimpleTest();
int c=simple.topla(1,2);
assertEquals(3, c);
}
}
@Test annotation'ı bir fonksiyonun test kodu içerdiğini belirtir. Eclipse vb.. bir çok editor bu ifadeyi doğrudan çalıştırmanızı sağlayacak desteği bulunmkatadır. Test fonksiyonu (testTopla) içinde SimpleTest sınıfının nesnesi yaratılıp, 1 ve 2 sayısı toplanmakta ve c'ye atanmaktadır. C değerinin 3 olmasını bekliyoruz aksi takdirde hata var demektir. JUnit'de koşulları test etmek için assert ile başlayan çok sayıda fonksiyon bulunur. Biz değerin 3 olmasını kontrol etmek istediğimizden assertEquals fonksiyonunu kullanıyoruz
public class SimpleTest {
public int topla(int a, int b){
return a+b;
}
public int carp(int a, int b){
return a*b;
}
}
Bu sınıf içindeki topla ve carp method'larını test eden sınıf aşağıdaki gibi yazılabilir:
import org.junit.*;
import static org.junit.Assert.*;
public class Tester {
SimpleTest simple=null;
@Before
public void setUp(){
simple=new SimpleTest();
}
@After
public void tearDown(){
simple=null;
}
@Test
public void testTopla(){
int c=simple.topla(1,2);
assertEquals(3, c);
}
@Test
public void testCarp(){
int c=simple.carp(1,2);
assertEquals(2, c);
}
}
Yukarıdaki örnekte, SimpleTest nesnesi setUp içinde yapılmaktadır. Bu şekilde her test öncesi nesne yaratılır ve test sonrası nesne null haline getirilir
Aşağıda basit bir test suite sınıfı örneği görülmektedir:
import org.junit.runner.*;
import org.junit.runners.*;
@RunWith(Suite.class)
@Suite.SuiteClasses({
Test1.class,
Test2.class,
Test3.class,
Test4.class
})
public class SimpleTestSuite {
// bu sınıfın dolu olmasına gerek yoktur
}
Test suite 4 test sınıfından oluşmaktadır ve test suite çalıştırıldığında testler sırasıyla çalıştırılacaktır
Aşağıdaki gibi iki sayıyı toplayan bir methodu olan bir sınıfımız olsun:
public class Toplar {
public int topla(int a, int b){
return a+b;
}
}
Toplama işlemi sadece bir kere değil, birden fazla sayıda tekrarlanabilir. Bunun için aşağıdaki gibi bir test sınıfı yazılabilir:
import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Parameterized.*;
@RunWith(value = Parameterized.class)
public class ToplaTest {
private int number1;
private int number2;
private int expected;
public ToplaTest(int number1, int number2, int expected) {
this.number1=number1;
this.number2=number2;
this.expected=expected;
}
@Parameters(name = "{index}: topla({0}+{1})={2}")
public static Iterable
Her test için gerekli olan parametreler test sınıfın kurucusunda verilmektedir. Toplama örneğinde iki sayı ve toplama sonucu beklediğimiz sayı değerleri bulunmaktadır. Dikkat edilirse @Test ile belirtilen fonksiyon, number1, number2 ve expected şeklinde sınıf değişkenlerini kullanmaktadır. @Parameters ile kullanılacak farklı parametre örnekleri , bir Iterable
public class Toplar {
public int topla(int a, int b){
return a+b;
}
}
Bu sınıfdaki topla methodu için Theory sınıfı aşağıdaki gibidir:
import org.junit.experimental.theories.*;
import org.junit.runner.*;
import static org.junit.Assert.*;
@RunWith(Theories.class)
public class TheoryTest {
@DataPoints public static int[] first = new int[] {1, 2};
@DataPoints public static int[] second = new int[] {3, 4};
@Theory
public void testTopla(int a, int b) {
System.out.println(a+"+"+b);
assertEquals(a+b, (new Toplar()).topla(a, b));
}
}
DataPoints ile kullanılabilecek veriler verilmektedir. Verilen iki sayının + ile toplaı ile toplam fonksiyonudan gelen değerlerin tutması gerekiyor. Test çalıştırıldığında tüm olasılıklar ekrana basılmıştır:
Maven kullanmıyorsanız gerekli jar'ları eklemeniz gerekir.
5.4 versiyonu henüz geliştirme aşamasındadır. Bir önceki versiyon da kullanılabilir.
Test edilecek aşağıdaki gibi bir sınıf yapalım:
public class Hello {
public static String hello(String name) {
return "hello "+name;
}
}
Test kodu aşağıdaki gibidir:
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class HelloTest {
@Test
public void helloTest() {
String result=Hello.hello("test");
assertEquals("hello test", result);
}
}
Eğer dönen metin "hello test" ise sonuç test başarılı olacaktır.
JUnit 5'de rule desteği kaldırılmıştır. TemporaryFolder gibi bazı ön tanımlı rule'lar da JUnit 5 kütüphanesinde artık bulunmamaktadır. Ancak 5.4.2 sürümünden sonra @TempDir şeklinde Temporary Folder desteği gelmiştir. 5.4.2 öncesi TemporaryFolder işlevini sağlamak için TemporaryFolder uzantısı (extention) yaratmanız gerekir. Veya junit-extensions projesini kullanabilirsiniz. Bu github.com/glytching/junit-extensions ve glytching.github.io/junit-extensions/index bağlantılarına bakabilirsiniz. Öncelikle projeye bağımlılıkları aşağıdaki gibi ekleyebiliriz:
Sınıfın en üstünde @ExtendWith(TemporaryFolderExtension.class) ile TemporaryFolderExtension'ı kullanacağımız belirtiyoruz. @BeforeAll ile tanımlanan yöntem ile TemporaryFolder'ı alıyoruz ve bir properties dosyasını yaratıyoruz. loadTest() yönteminde ise asıl test edeceğimiz PropertiesLoader sınıfını yaratıyoruz ve verilen path'deki properties dosyasını yükletiyoruz. Eğer test değeri testvalue ise PropertiesLoader başarılı bir şekilde çalışmış demektir. JUnit 5, 5.4.2 sonrası için herhangi bir extention kütüphanesi kullanmadan "@TempDir Path path" şeklinde test yöntemlerine aktarılabilirsiniz:
Bir JUnit sınıfında , sıralama için @FixMethodOrder kullanılabilir.
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ExternalSubscriptionManageTest {
@Test
public void test2(){..}
@Test
public void test3(){..}
@Test
public void test1(){..}
}
Yukarıdaki örnekte method isimlerine göre test method'ları sırayla çağrılmaktadır. Önce test1 , sonra test2 ve en son test3 çalıştırılacaktır
Rulet Çemberi Seçimi algoritmasi olasılığa dayanan bir algoritma olduğu için birim testini yapmak zor. Örneğin şuradaki algoritmayı test etmek isteyelim : Rulet Çemberi Seçimi Algoritması Junit 5 ile aşağıdaki gibi bir test yapılabilir :
@RepeatedTest(100)
public void testRouletteWheelSelector() {
int[] values=new int[]{0,100};
int index = RouletteWheelSelector.select(values);
assertEquals(1, index);
}
Bu test 100 kere tekrarlandığında hep başarılı olmalıdır. Çünkü ile değer 0 olasılıktır ve hep ikinci seçilecektir. Olasılıkta örnekler ne kadar fazla ise sonuç olasılık değerlerine yaklaşır. Bir yazı turayı bir milyon kez atarsanız yaklaşık 500 bin kez tura ve yazı gelir. Yüz milyona çıkarırsanız daha da değerler yaklaşır birbirine. Bunu şu şekilde kullanabiliriz :
static int index1Count=0;
static int index2Count=0;
@BeforeAll
public static void init() {
index1Count=0;
index2Count=0;
}
@RepeatedTest(10000)
public void testRouletteWheelSelector50Percent() {
int[] values=new int[]{50,50};
int index = RouletteWheelSelector.select(values);
if(index==0) {
index1Count++;
}if(index==1) {
index2Count++;
}
}
@AfterAll
public static void beforeAll() {
System.out.println(index1Count+":"+index2Count);
}
Değerler %50 ve %50 verilmesinden dolayı çıkan sonuçlar birbirine yakın olmalıdır. Örneğin 5100 - 4900 gibi değerler çıkacaktır. Yüz bin kez de yapılabilir test. Tabi burada çıkan sonucu insan gözüyle değerlendirdik. Halbuki bir hata payı verip kod ile test etmeliydik.
Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir