Spring Boot JPA এবং In-Memory Testing
Spring Boot JPA তে in-memory database testing এর মাধ্যমে আমরা সহজেই unit tests বা integration tests তৈরি করতে পারি। H2 Database একটি জনপ্রিয় ইন-মেমরি ডেটাবেস যা testing উদ্দেশ্যে ব্যবহার করা হয়। H2 ডেটাবেস সম্পূর্ণরূপে in-memory থাকে, অর্থাৎ ডেটাবেসের সমস্ত ডেটা শুধুমাত্র রানটাইমে থাকে এবং অ্যাপ্লিকেশন বন্ধ হলে ডেটা হারিয়ে যায়।
Spring Boot এবং JPA এর সাথে H2 database ব্যবহার করে in-memory testing করা অত্যন্ত সহজ এবং কার্যকর। এখানে, আমরা দেখব কিভাবে Spring Boot JPA প্রজেক্টে H2 Database ব্যবহার করে ইন-মেমরি টেস্টিং করা যায়।
1. Spring Boot প্রজেক্ট সেটআপ
1.1. Dependency Setup
প্রথমে H2 Database এবং Spring Boot Test এর জন্য ডিপেনডেন্সি আপনার pom.xml ফাইলে যোগ করতে হবে।
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- H2 Database for In-Memory Testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot Starter Test for Unit Testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2. application.properties কনফিগারেশন
H2 Database এবং JPA configuration সেটআপ করার জন্য application.properties ফাইলে কিছু কনফিগারেশন লিখতে হবে।
# H2 Database Configuration
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.h2.console.enabled=true
এখানে, H2 ডেটাবেসের ইন-মেমরি মোডে ব্যবহার করার জন্য কনফিগারেশন করা হয়েছে। DB_CLOSE_DELAY=-1 সেট করার মাধ্যমে ডেটাবেস বন্ধ হওয়ার পরেও ডেটা রাখা হয়।
2. JPA Entity তৈরি করা
2.1. User Entity তৈরি করা
এখানে একটি User Entity তৈরি করা হয়েছে, যা H2 ডেটাবেসের সাথে ইন্টিগ্রেট করা হবে।
package com.example.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
2.2. UserRepository Interface তৈরি করা
Spring Data JPA তে JpaRepository ইন্টারফেস ব্যবহার করে আমরা CRUD অপারেশন গুলি পরিচালনা করবো।
package com.example.repository;
import com.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// Custom queries can go here if needed
}
3. Unit Test বা Integration Test তৈরি করা
Spring Boot এবং JPA এর জন্য in-memory testing করার জন্য আমরা Spring Boot Test ব্যবহার করবো। @DataJpaTest অ্যানোটেশন ব্যবহার করে, JPA সম্পর্কিত সমস্ত কনফিগারেশন এবং ডেটাবেস সংক্রান্ত কাজ শুধুমাত্র টেস্ট কেসের জন্য চালানো যাবে।
3.1. Test Class তৈরি করা
UserRepository এর জন্য একটি টেস্ট ক্লাস তৈরি করা হচ্ছে, যেখানে H2 Database তে ইন-মেমরি ডেটাবেস ব্যবহার করা হবে।
package com.example;
import com.example.model.User;
import com.example.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveUser() {
User user = new User();
user.setId(1L);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
User savedUser = userRepository.save(user);
assertNotNull(savedUser);
assertEquals(user.getName(), savedUser.getName());
}
@Test
public void testFindUserByEmail() {
User user = new User();
user.setId(2L);
user.setName("Jane Doe");
user.setEmail("jane.doe@example.com");
userRepository.save(user);
User foundUser = userRepository.findById(2L).orElse(null);
assertNotNull(foundUser);
assertEquals("jane.doe@example.com", foundUser.getEmail());
}
}
3.2. Test Execution
@DataJpaTest: এই অ্যানোটেশনটি শুধুমাত্র JPA সম্পর্কিত টেস্টিংয়ের জন্য ব্যবহৃত হয়। এটি in-memory database কে টেস্ট চলাকালীন স্বয়ংক্রিয়ভাবে প্রস্তুত করে এবং টেস্ট শেষ হওয়ার পর তা মুছে ফেলে।- Test Methods:
testSaveUser: এখানে,Userঅবজেক্ট ডাটাবেসে সেভ করা হচ্ছে এবং এটি সঠিকভাবে সেভ হয়েছে কিনা চেক করা হচ্ছে।testFindUserByEmail: এখানে, ডেটাবেসে সেভ করা ইউজারটি আবার খোঁজা হচ্ছে এবং নিশ্চিত করা হচ্ছে যে এটি সঠিকভাবে সেভ হয়েছে।
3.3. Test Run
এই টেস্ট ক্লাসটি চালানোর পরে, আপনার UserRepository এর ডেটাবেস অপারেশন পরীক্ষা করা যাবে এবং H2 ইন-মেমরি ডেটাবেস ব্যবহার করা হবে। JUnit এর মাধ্যমে টেস্ট সফলভাবে সম্পন্ন হলে, এটি নিশ্চিত করবে যে আপনার JPA সম্পর্কিত কাজ সঠিকভাবে কাজ করছে।
4. Test Logs
টেস্ট চলাকালীন, আপনি H2 console এর মাধ্যমে আপনার ইন-মেমরি ডেটাবেসটি দেখতে পারেন।
- H2 Console Access:
http://localhost:8080/h2-console/ - Console Configuration:
- JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password:
password
- JDBC URL:
এখানে আপনি H2 কনসোল ব্যবহার করে ইন-মেমরি ডেটাবেসের ডেটা দেখতে পারেন।
সারাংশ
Spring Boot JPA তে H2 Database ব্যবহার করে in-memory testing খুবই সহজ এবং কার্যকরী। @DataJpaTest অ্যানোটেশন ব্যবহার করে, আপনি JPA সম্পর্কিত unit tests বা integration tests তৈরি করতে পারেন যেখানে H2 Database ইন-মেমরি মোডে কাজ করে। এতে ডেটাবেস অপারেশনগুলি দ্রুত পরীক্ষা করা যায় এবং প্রোডাকশনের ডেটাবেসের উপর কোনো প্রভাব না পড়ে। H2 Database এবং Spring Boot JPA এর সমন্বয়ে এই ধরনের টেস্টিং আপনার অ্যাপ্লিকেশনের ডেটাবেস সম্পর্কিত লজিক যাচাই করতে সহায়ক হবে।
Read more