REST web hizmetimi nasıl test edebilirim?


16

Birim sınamasında yeniyim, sadece DB'yi çağıran ve bir DTO dolduran bir REST web yöntemim var. Sahte kod:

public object GetCustomer(int id)
{
  CustomerDTO objCust = //get from DB
  return objCust;
}

Şüphem, bu yöntemler için testlerin nasıl yazılacağı ve dahil edilecek testlerin türü (Entegrasyon / Birim). Ve birim testleri için DB'ye çarpması gerekiyor mu? Öyleyse ve bir müşteri kimliği iletirsem ve az sayıda iddiada bulunursam, veriler sonunda değişebilir ve hatalara neden olabilir.

Sanırım burada bu kavramları anlayan bir şey eksik.


5
Gönderdiğiniz kodda test edilecek şeyler şunlardır: (1) GetCustomer'ı int ile parametre olarak çağırabilirsiniz. (2) Bir CustomerDTO nesnesi döndürüyor mu? (3) Bu nesne DB'den beklendiği gibi dolduruldu mu? (4) Geçerli bir müşteriye karşılık gelmeyen bir int ile çağrılırsa beklenen bir davranış ortaya çıkıyor mu? Bunların hiçbirinin henüz REST ile ilgisi yok. RESTful isteklerine yanıt veren kodu yazmaya hazır olduğunuzda, bunun için testler yazacaksınız.
DavidO

@DavidO: "Bu nesne DB'den beklendiği gibi dolduruldu mu?" kesinlikle bir birim test değildir (OP koduna göre). Bu bir entegrasyon testi.
flater

Evet haklısın. Geri dönüp bir entegrasyon testinde DB bileşenini doğrulayacağınızı ve aksi halde alay edeceğinizi belirtmek için yorumu değiştirebilirsem, bu düzenlemeyi yaparım, ancak 5 dakika boyunca yorumlar için düzenleme penceresi ve yorum altı yapıldı Yıllar önce. :)
DavidO

Yanıtlar:


18

Birim sınaması sırasında, bir veritabanı ile sınamanız beklenmez veya en azından, birim sınaması için hazırlanmadığınız bir veritabanı ile sınamanız beklenmez. Bir veritabanı ile test etmek ve bu nedenle uygulamanızın farklı katmanlarını aynı anda test etmek genellikle entegrasyon testleri olarak görülür . Birim testleri ile yalnızca yönteminizin ne yaptığını, farklı parametrelere bağlı olarak ne döndürdüğünü ve ne zaman (ya da değil) başarısız olması gerektiğini test etmeniz gerekir.

Metodunuzda diğer sınıflardan X metoduna çağrı yapmanız çok beklenir . Bu X yöntemlerini test etmiyorsunuz, bu yüzden yapmanız gereken bu yöntemleri alay etmek.

Kodunuzu Java ile yazdığınızı varsayalım, bu durumda Mockito gibi size yardımcı olabilecek harika alaycı çerçeveleriniz var. Alaycı bir çerçeve kullansanız da kullanmasanız da tercihiniz olsun, sadece size çok zaman kazandıracaklarını ve en azından bahsettiğim çerçevenin gerçekten karmaşık olmadığını söyleyeceğim.

Denemek için sadece kendi alayınızı yazmak istiyorsanız, aşağıdaki CustomerRepositorysınıfa sahip olduğunuzu varsayalım :

public class CustomerRepository {
 public CustomerDTO getCustomer(int id) {
   ...
 }
}

Kendi alaycı ve kirli CustomerRepositorysınıfınızı şu şekilde yazabilirsiniz :

public class MockedCustomerRepository extends CustomerRepository {
 public boolean bThrowDatabaseException;
 public boolean bReturnNull;
 public boolean bReturnCustomerWrongId;
 public boolean bReturnCustomerWithId;
 public CustomerDTO getCustomer(int id) {
  if(bThrowDatabaseException) { 
    throw new DatabaseException("xxx"); 
  } else if(bReturnNull) { 
    return null; 
  } else if(bReturnCustomerWrongId) { 
    throw new CustomerNotExistException(id);
  } else if(bReturnCustomerWithId) { 
    return new CustomerDTO(id); 
  }
 }
}

Ardından, test durumunuzda temel olarak "standart" örneğinizi, CustomerRepositoryyönteminizi çeşitli sonuçlar için test etmenizi sağlayacak alay edilmiş bir örnekle değiştirirsiniz getCustomer:

public class CustomerRestTest {
  public void testGetCustomer_databaseFailure() {
    MockedCustomerRepository dto = new MockedCustomerRepository();
    dto.bThrowDataBaseException = true;
    yRestClass rest = new MyRestClass();
    rest.dto = dto;
    rest.getCustomer(0);
    // depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here

  public void testGetCustomer_customerNotExist() {
    // etc.
  }
}

Genel olarak, her test yöntemi sadece bir şeyi test etmelidir, bu testlerinizi küçük tutmanıza ve bir göreve odaklanmanıza yardımcı olur.

Tekrar edeceğim :-) Bütün alaycı bir sınıf yazmak gördüğünüz gibi biraz zaman alıyor. Alaycı bir çerçeve kullanmayı düşünün, ne kadar az kod yazarsa, o kadar az hata yapar , değil mi? İstisna atan veya belirli bir parametre için belirli bir değer döndüren bir yöntemi alay etmek çok kolay ve 2 veya 3 satır (en az mockito ile) alır

Umarız REST yönteminizi test etmenize yardımcı olur.


4
Genellikle DTO sınıflarınızda mantık yoktur, özellikle de veri depolama alanınızla etkileşime girmez.
JustAnotherUserYouMayKnowOr

1
Bu sadece bir örnekti, ama kesinlikle haklısın. Örnekleri, teoriye daha iyi uyacak şekilde değiştireceğim.
Jalayn
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.