Kapsamlı bir test giysisi, birçok ayrı test sınıfıyla hızla balonlaşabilir. İç içe testleri kullanarak bunları gruplar halinde nasıl düzenleyeceğinizi öğrenin.
İyi yazılmış bir test paketi, belirli bir özellik için birkaç teste sahip olacaktır. İlgili özellikleri gruplayarak, birkaç test grubu arasındaki ilişkiyi ifade edebilirsiniz. Birim test sınıflarını gruplandırmanın en büyük yararlarından biri, gruplandırılmış testler kaynakları paylaştığı için yazdığınız test kodu miktarını azaltabilmesidir.
JUnit 5, @Nested ek açıklamasını kullanarak iç içe testler oluşturmanıza olanak tanır. Bu yazıda @Nested notunun ne olduğunu ve nasıl kullanılacağını öğreneceksiniz.
Yuvalanmış Test Nedir?
JUnit’in @Nested notu, ilişkilendirdiği sınıfın başka bir sınıfın üyesi olan bir iç sınıf olduğunu gösterir. Yuvalanmış test, @Nested ek açıklamasını içeren bir test sınıfıdır, çünkü bu, üst düzey bir test sınıfında bir (veya daha fazla) iç sınıf olduğu anlamına gelir. Yuvalanmış bir sınıf, üst düzey bir sınıf içinde veya aynı zamanda yuvalanmış bir sınıf içinde görünebilir.
Test Edilecek Java Sınıfları Oluşturma
Yuvalanmış bir test sınıfı, üst sınıfının tüm özelliklerini devralır. Bu nedenle, yuvalanmış bir test oluşturmak için en iyi zaman, mantıksal bir test senaryosu gruplamasının olduğu veya tek bir test senaryosunun farklı özelliklere sahip olduğu zamandır. Bunun iyi bir örneği, bir sınıfın yararlı nesneler oluşturma yeteneğini test etmek istediğiniz zamandır. Başka bir örnek, tek bir yöntemin iki veya daha fazla amacı olduğu zamandır.
Burada, bir perakende uygulamasında kullanabileceğiniz, yuvalanmış bir testi nasıl oluşturabileceğinizi gösteren örnek bir sınıf bulunmaktadır.
public class Customer {
protected int customerId;
protected String customerName;
protected String customerCode;
// default constructor
public Customer() {
this.customerId = 0;
this.customerName = “”;
this.customerCode =””;
}
// primary constructor
public Customer(int customerId, String customerName, String customerCode) {
this.customerId = customerId;
this.customerName = customerName;
this.customerCode = customerCode;
}
// copy constructor
public Customer(Customer customer) {
this.customerId = customer.customerId;
this.customerName = customer.customerName;
this.customerCode = customer.customerCode;
}
// getters and setters
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerCode() {
return customerCode;
}
public void setCustomerCode(String customerCode) {
this.customerCode = customerCode;
}
// determine a customer discount percentage based on customer type
public double customerType(String customerCode) {
double discount = 0;
if (customerCode.toLowerCase().equals(“pre”)) {
discount = 0.10;
} else if (customerCode.toLowerCase().equals(“gen”)) {
discount = 0.02;
} else if (customerCode.toLowerCase().equals(“new”)) {
discount = 0.05;
}
return discount;
}
// determine a customer’s grandTotal based on customer type
public double grandTotal(double total) {
double discount = customerType(customerCode);
double discountPercentage = total * discount;
double finalTotal = total – discountPercentage;
return finalTotal;
}
}
Bu Müşteri sınıfı, iki yöntemle tamamlanmış bir Java Sınıfının tüm bileşenlerini içerir.
JUnit 5 ile İç İçe Test Oluşturma
Customer sınıfının birkaç yapıcısı, alıcısı ve ayarlayıcısı ve iki yöntemi vardır. Yeni bir Müşteri nesnesi oluşturan ve tüm bileşenlerini test eden iç içe bir sınıf (Müşteri test sınıfı içinde) oluşturabilirsiniz.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@DisplayName(“Customer Test Class Showing How to Create Nested Tests.”)
class CustomerTest {
protected int customerId = 301;
protected String customerName = “Mike Wilson”;
protected String customerCode = “Pre”;
protected double total = 600;
@Nested
@DisplayName(“Customer Builder Nested Test Class Within a Top-Level Test Class”)
class CustomerBuilderTest {
Customer customer = new Customer(customerId, customerName, customerCode);
double grandTotal = customer.grandTotal(total);
@Test
@DisplayName(“Testing the Customer’s Class Constructors, Getters and Setters, and Methods.”)
void customerBuilder() {
assertAll(() -> {
assertEquals(customerId, customer.getCustomerId());
assertEquals(customerName, customer.getCustomerName());
assertEquals(customerCode, customer.getCustomerCode());
assertEquals(0.10, customer.customerType(customerCode));
assertEquals(540, grandTotal);
});
}
}
}
CustomerTest sınıfı, iç içe bir CustomerBuilderTest sınıfının en üst düzey test sınıfıdır. CustomerBuilderTest, yeni bir Müşteri nesnesi oluşturur ve onay testlerini kullanarak bileşenlerini test eder .
CustomerTest test sınıfının yürütülmesi, aşağıdaki başarılı test sonuçlarını üretir:
İlk iç içe test raporu
@DisplayName Annotation sayesinde test sınıflarının ve test yönteminin adları açıklayıcı ve kapsamlıdır .
Yazılımın Nasıl Test Edileceğini Bilmek Çok Önemlidir
Teknoloji, çoğu insan için günlük yaşamın önemli bir yönüdür. Tam olarak yapması gerekeni yapan bir yazılım yaratmanın riskleri hiç bu kadar yüksek olmamıştı.
Başka bir nesneye olan yakınlığını yanlış hesaplayan kendi kendini süren bir araba büyük bir kazaya neden olabilir. Bu nedenle, uygulamanızı geliştirmenin her aşamasında test etmeniz gerekir.