Spring Boot ile Test Yazımı ve En İyi Uygulamalar

Test Yazımı Neden Önemlidir?
Test yazımı, yazılım geliştirme sürecinin kritik bir parçasıdır. Testler, uygulamanızın doğru çalıştığını ve beklenen sonuçları verdiğini doğrular. Ayrıca, kodunuzu değiştirirken veya yeni özellikler eklerken hataları erken aşamada tespit etmenize yardımcı olur.
Spring Boot ile Test Türleri
Spring Boot, farklı test türleri için çeşitli araçlar ve kütüphaneler sunar:
- Birim Testleri (Unit Tests): Kodunuzun küçük parçalarını (genellikle yöntemleri) bağımsız olarak test eder.
- Entegrasyon Testleri (Integration Tests): Farklı bileşenlerin birlikte nasıl çalıştığını test eder.
- Sistem Testleri (System Tests): Uygulamanın uçtan uca işlevselliğini test eder.
Spring Boot ile Birim Testleri
Birim testleri, genellikle JUnit ve Mockito kullanılarak yazılır.
JUnit ile Birim Testi Yazma
Bağımlılıkları Ekleme
pom.xml
dosyanıza aşağıdaki bağımlılıkları ekleyin:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
Örnek Birim Testi
src/test/java/com/example/demo/service/BookServiceTest.java
dosyasını oluşturun:
package com.example.demo.service;
import com.example.demo.model.Book;
import com.example.demo.repository.BookRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
public class BookServiceTest {
@InjectMocks
private BookService bookService;
@Mock
private BookRepository bookRepository;
@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testGetBookById() {
Book book = new Book();
book.setId(1L);
book.setTitle("Spring Boot in Action");
book.setAuthor("Craig Walls");
when(bookRepository.findById(1L)).thenReturn(Optional.of(book));
Book result = bookService.getBookById(1L);
assertEquals("Spring Boot in Action", result.getTitle());
assertEquals("Craig Walls", result.getAuthor());
}
}
Bu test, BookService
sınıfının getBookById
yöntemini test eder ve BookRepository
'yi mock'lar.
Spring Boot ile Entegrasyon Testleri
Entegrasyon testleri, genellikle Spring Boot’un test desteği ve veri tabanı için H2 gibi bellek içi veritabanları kullanılarak yazılır.
Örnek Entegrasyon Testi
src/test/java/com/example/demo/controller/BookControllerTest.java
dosyasını oluşturun:
package com.example.demo.controller;
import com.example.demo.model.Book;
import com.example.demo.repository.BookRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private BookRepository bookRepository;
@Test
public void testGetBookById() throws Exception {
Book book = new Book();
book.setTitle("Spring Boot in Action");
book.setAuthor("Craig Walls");
bookRepository.save(book);
mockMvc.perform(get("/books/" + book.getId())
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json("{\"title\":\"Spring Boot in Action\",\"author\":\"Craig Walls\"}"));
}
}
Bu test, BookController
sınıfının getBookById
yöntemini test eder ve gerçek bir veritabanı kullanarak isteği simüle eder.
Spring Boot ile Sistem Testleri
Sistem testleri, uygulamanın uçtan uca işlevselliğini test eder. Genellikle Selenium veya Cucumber gibi araçlar kullanılarak yapılır.
Örnek Sistem Testi
src/test/java/com/example/demo/BookSystemTest.java
dosyasını oluşturun:
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class BookSystemTest {
@Test
public void testHomePage() {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080");
String title = driver.getTitle();
assertThat(title).isEqualTo("Home Page");
driver.quit();
}
}
Bu test, Selenium kullanarak uygulamanın ana sayfasını açar ve başlık etiketini kontrol eder.
En İyi Uygulamalar
- Test Otomasyonu: Testleri otomatikleştirin ve CI/CD süreçlerine entegre edin.
- Test İzolasyonu: Testlerinizi izole edin ve birbirinden bağımsız çalışmasını sağlayın.
- Gerçekçi Veriler: Testlerde gerçekçi veri kullanarak uygulamanın gerçek dünyadaki davranışını simüle edin.
- Hızlı Testler: Testlerin hızlı çalışmasını sağlayın, özellikle birim testlerinin.
Sonuç
Bu makalede, Spring Boot ile test yazımı ve en iyi uygulamaları ele aldık. Test yazımı, uygulamanızın güvenilirliğini ve kalitesini artırmak için kritik bir öneme sahiptir. Bir sonraki yazımızda, Spring Boot ile performans optimizasyonu ve en iyi uygulamalarını ele alacağız.