Gson ব্যবহার করার জন্য Unit Testing একটি গুরুত্বপূর্ণ প্রক্রিয়া, যেটি নিশ্চিত করে যে আপনার JSON সিরিয়ালাইজেশন (Serialization) এবং ডেসিরিয়ালাইজেশন (Deserialization) সঠিকভাবে কাজ করছে। JUnit এবং Mockito এর মতো টেস্টিং লাইব্রেরি ব্যবহার করে আপনি Gson এর কার্যকারিতা পরীক্ষা করতে পারেন। এখানে, আমি JUnit এর সাহায্যে Gson এর জন্য unit test কিভাবে লিখতে হয় তা দেখাব।
1. Gson Serialization এবং Deserialization এর জন্য Unit Test:
ধরা যাক, আপনার একটি Person ক্লাস আছে, যেটি আপনি JSON-এ রূপান্তর এবং JSON থেকে Person অবজেক্টে রূপান্তর করতে চান।
Step 1: Person ক্লাস তৈরি করা
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setters (Optional, if needed)
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
Step 2: Unit Test তৈরি করা
এখন আমরা JUnit ব্যবহার করে Gson এর serialization এবং deserialization টেস্ট করব। এই জন্যে, JUnit 5 এবং Gson ব্যবহার করা হবে।
Dependency (Maven):
JUnit এবং Gson dependency আপনার pom.xml ফাইলে যোগ করুন:
<dependencies>
<!-- JUnit 5 Dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<!-- Gson Dependency -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.8</version>
</dependency>
</dependencies>
Unit Test Class:
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class GsonTest {
// Test Serialization
@Test
public void testPersonSerialization() {
Person person = new Person("John", 30);
Gson gson = new Gson();
String json = gson.toJson(person);
// Assert the expected JSON output
String expectedJson = "{\"name\":\"John\",\"age\":30}";
assertEquals(expectedJson, json);
}
// Test Deserialization
@Test
public void testPersonDeserialization() {
String json = "{\"name\":\"John\",\"age\":30}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
// Assert the deserialized object fields
assertNotNull(person);
assertEquals("John", person.getName());
assertEquals(30, person.getAge());
}
// Test Deserialization with Missing Fields
@Test
public void testPersonDeserializationWithMissingField() {
String json = "{\"name\":\"John\"}"; // Missing 'age' field
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
// Assert the deserialized object and check missing fields
assertNotNull(person);
assertEquals("John", person.getName());
assertEquals(0, person.getAge()); // Default value for int
}
}
ব্যাখ্যা:
- Test Serialization: এখানে
testPersonSerialization()টেস্টে আমরা একটিPersonঅবজেক্ট তৈরি করেছি এবং এটিGsonএর মাধ্যমে JSON স্ট্রিংয়ে রূপান্তরিত করেছি। তারপর আমরা assertEquals ব্যবহার করেছি, যা যাচাই করে যে JSON স্ট্রিংটি প্রত্যাশিত আউটপুটের সাথে মেলে কিনা। - Test Deserialization:
testPersonDeserialization()টেস্টে, JSON স্ট্রিংটি একটিPersonঅবজেক্টে ডেসিরিয়ালাইজ করা হয়েছে। তারপর আমরা assertNotNull এবং assertEquals ব্যবহার করে নিশ্চিত করেছি যে ডেসিরিয়ালাইজড অবজেক্টের ফিল্ডগুলি সঠিক। - Test Deserialization with Missing Fields: এখানে, একটি JSON স্ট্রিং দেয়া হয়েছে যেখানে
ageফিল্ড মিসিং।ageফিল্ডটিintটাইপ হওয়ায় এর ডিফল্ট মান0হবে। আমরা এই পরিস্থিতি যাচাই করেছি যে ডিফল্ট মান0সেট হয়েছে।
4. Test Run এবং Output:
এই টেস্ট ক্লাসটি আপনি JUnit ব্যবহার করে চালাতে পারেন। যদি সব কিছু ঠিকঠাক থাকে, তাহলে টেস্টগুলো সফলভাবে রান করবে এবং আপনার টেস্টের আউটপুট হবে:
Test passed successfully
এখানে প্রতিটি টেস্ট নিশ্চিত করে যে Gson সঠিকভাবে JSON সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করছে এবং মিসিং ফিল্ডগুলোর জন্য সঠিক ডিফল্ট মান প্রদান করছে।
5. Mockito ব্যবহার করে Gson টেস্টিং
এছাড়া, আপনি Mockito ব্যবহার করে mock objects তৈরি করতে পারেন এবং Gson এর ব্যবহার এবং আচরণ যাচাই করতে পারেন। এই ধরনের টেস্টিং সাধারণত তখন প্রয়োজন হয় যখন আপনি কোন এক্সটার্নাল সার্ভিস বা API-এর সাথে কাজ করছেন।
Mockito Example (Optional):
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
public class GsonMockitoTest {
@Test
public void testMockingGson() {
Gson gson = mock(Gson.class);
// Create mock response
Person person = new Person("John", 30);
when(gson.fromJson("{\"name\":\"John\",\"age\":30}", Person.class)).thenReturn(person);
// Verify behavior
Person result = gson.fromJson("{\"name\":\"John\",\"age\":30}", Person.class);
assertEquals("John", result.getName());
assertEquals(30, result.getAge());
}
}
এখানে Mockito ব্যবহার করে Gson এর fromJson মেথডের জন্য একটি mock object তৈরি করা হয়েছে এবং আমরা তার ব্যবহার যাচাই করছি।
সংক্ষেপে:
- Gson এর জন্য unit tests লেখার জন্য JUnit এর assertEquals, assertNotNull ইত্যাদি মেথড ব্যবহার করা হয়।
- Serialization এবং Deserialization এর জন্য আলাদা টেস্ট লিখে নিশ্চিত করা হয় যে JSON অবজেক্টে রূপান্তর এবং Java অবজেক্টে রূপান্তর সঠিকভাবে হচ্ছে।
- Mockito এর সাহায্যে mocking এবং stubbing করে, এক্সটার্নাল সার্ভিস বা API ব্যবহার না করেও Gson এর টেস্টিং করা সম্ভব।
Gson সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন এর জন্য ইউনিট টেস্ট তৈরি করা একটি গুরুত্বপূর্ণ কাজ যা নিশ্চিত করে যে আপনার JSON প্রক্রিয়া সঠিকভাবে কাজ করছে। ইউনিট টেস্টের মাধ্যমে আপনি আপনার JSON ফরম্যাটের সঠিকতা যাচাই করতে পারেন এবং নিশ্চিত হতে পারেন যে ডেটা সঠিকভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হচ্ছে।
এখানে আমি Gson সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন এর জন্য একটি ইউনিট টেস্ট তৈরির উদাহরণ দেব। আমরা JUnit ফ্রেমওয়ার্ক ব্যবহার করে এই টেস্ট তৈরি করব।
1. Maven ডিপেনডেন্সি
প্রথমে আপনার pom.xml ফাইলে Gson এবং JUnit এর ডিপেনডেন্সি যোগ করুন:
<dependencies>
<!-- Gson dependency -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.8</version>
<scope>test</scope>
</dependency>
<!-- JUnit dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
</dependencies>
2. Java ক্লাস:
এখন আমরা একটি সাধারণ Java ক্লাস Person তৈরি করি এবং এর সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন এর জন্য ইউনিট টেস্ট লিখব।
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
3. JUnit টেস্ট ক্লাস:
এখন, JUnit ব্যবহার করে Gson এর সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন চেক করার জন্য একটি টেস্ট ক্লাস লিখব।
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class GsonSerializationTest {
private final Gson gson = new Gson();
// Unit Test for Serialization
@Test
public void testSerialization() {
// Arrange
Person person = new Person("John", 30);
// Act
String json = gson.toJson(person);
// Assert
String expectedJson = "{\"name\":\"John\",\"age\":30}";
assertEquals(expectedJson, json, "Serialization failed");
}
// Unit Test for Deserialization
@Test
public void testDeserialization() {
// Arrange
String json = "{\"name\":\"John\",\"age\":30}";
// Act
Person person = gson.fromJson(json, Person.class);
// Assert
assertNotNull(person, "Deserialization failed");
assertEquals("John", person.getName(), "Name mismatch");
assertEquals(30, person.getAge(), "Age mismatch");
}
// Unit Test for Serialization and Deserialization Round-Trip
@Test
public void testSerializationDeserializationRoundTrip() {
// Arrange
Person originalPerson = new Person("John", 30);
// Act: Serialize -> Deserialize
String json = gson.toJson(originalPerson);
Person deserializedPerson = gson.fromJson(json, Person.class);
// Assert: Check if original and deserialized objects are equal
assertEquals(originalPerson.getName(), deserializedPerson.getName(), "Name mismatch after round-trip");
assertEquals(originalPerson.getAge(), deserializedPerson.getAge(), "Age mismatch after round-trip");
}
}
ব্যাখ্যা:
testSerialization():- এখানে
Personঅবজেক্টকে Gson ব্যবহার করে JSON এ সিরিয়ালাইজ করা হচ্ছে। তারপর আমরা সিরিয়ালাইজড JSON ফরম্যাটের সাথে তুলনা করছি। যদি এটি মিল না খায়, তাহলে টেস্টটি ব্যর্থ হবে।
- এখানে
testDeserialization():- এখানে একটি JSON স্ট্রিং দিয়ে
Personঅবজেক্ট ডেসিরিয়ালাইজ করা হচ্ছে। তারপর আমরা যাচাই করছি যে ডেসিরিয়ালাইজড অবজেক্টটির ফিল্ড মান সঠিকভাবে সেট হয়েছে কিনা।
- এখানে একটি JSON স্ট্রিং দিয়ে
testSerializationDeserializationRoundTrip():- এখানে আমরা একটি
Personঅবজেক্ট সিরিয়ালাইজ করে JSON তৈরি করছি এবং তারপর সেই JSON থেকে আবারPersonঅবজেক্ট ডেসিরিয়ালাইজ করছি। এরপর, আমরা যাচাই করছি যে অরিজিনাল অবজেক্ট এবং ডেসিরিয়ালাইজড অবজেক্ট একই।
- এখানে আমরা একটি
4. JUnit টেস্ট চালানো:
যদি আপনি Maven ব্যবহার করেন, আপনি টেস্ট চালাতে পারেন:
mvn test
অথবা, আপনি IDE (যেমন IntelliJ IDEA বা Eclipse) থেকেও টেস্ট রান করতে পারেন।
5. আউটপুট:
এখন, যদি সবকিছু সঠিকভাবে কাজ করে, JUnit টেস্টগুলো সফল হবে এবং নিচের মতো আউটপুট আসবে:
Test passed: testSerialization
Test passed: testDeserialization
Test passed: testSerializationDeserializationRoundTrip
সারাংশ:
- Gson সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন এর জন্য JUnit টেস্ট তৈরি করতে, আমরা Gson এর
toJson()এবংfromJson()মেথড ব্যবহার করে সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন কার্যকারিতা যাচাই করি। - আমরা JUnit ব্যবহার করে পরীক্ষাগুলি লিখে যাচাই করি যে JSON ফরম্যাট সঠিক এবং ডেটা সঠিকভাবে ট্রান্সফার হচ্ছে।
- Unit tests নিশ্চিত করে যে আপনার JSON প্রক্রিয়াগুলি কাজ করছে এবং পরবর্তীতে কোড পরিবর্তন করলে তা ঠিকভাবে কাজ করবে।
JUnit হল Java এর একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক, যা ইউনিট টেস্ট লেখার জন্য ব্যবহৃত হয়। Gson টেস্ট করতে হলে, JUnit এর মাধ্যমে আপনি JSON ডেটাকে Java অবজেক্টে এবং Java অবজেক্টকে JSON ডেটাতে রূপান্তর করার কার্যকারিতা পরীক্ষা করতে পারেন।
এখানে আমরা দেখব কিভাবে JUnit ব্যবহার করে Gson-এর Serialization এবং Deserialization টেস্ট করা যায়।
1. JUnit Test Framework Setup
JUnit 5 ব্যবহার করতে হলে আপনাকে Maven বা Gradle এর মাধ্যমে JUnit এবং Gson ডিপেনডেন্সি যোগ করতে হবে।
Maven Dependency:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
Gradle Dependency:
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
implementation 'com.google.code.gson:gson:2.8.9'
2. Test Case Example: Gson Serialization and Deserialization
ধরা যাক আমাদের একটি Person ক্লাস রয়েছে এবং আমরা Person অবজেক্টকে JSON-এ রূপান্তর করতে চাই এবং JSON ডেটা থেকে আবার Person অবজেক্টে রূপান্তর করতে চাই।
Person Class (POJO Class):
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
JUnit Test Case for Gson Serialization and Deserialization:
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class GsonTest {
private Gson gson = new Gson();
// Test Serialization (Java Object to JSON)
@Test
public void testSerialization() {
Person person = new Person("John", 30);
// Serialize Person object to JSON
String json = gson.toJson(person);
// Validate the JSON string contains the expected values
assertTrue(json.contains("John"));
assertTrue(json.contains("30"));
}
// Test Deserialization (JSON to Java Object)
@Test
public void testDeserialization() {
String json = "{\"name\":\"John\",\"age\":30}";
// Deserialize JSON to Person object
Person person = gson.fromJson(json, Person.class);
// Validate the Person object's properties
assertNotNull(person);
assertEquals("John", person.getName());
assertEquals(30, person.getAge());
}
// Test Deserialization with invalid JSON (Edge case)
@Test
public void testDeserializationInvalidJson() {
String invalidJson = "{\"name\":\"John\",\"age\":\"thirty\"}";
// Try to deserialize the invalid JSON
Person person = gson.fromJson(invalidJson, Person.class);
// Validate that the deserialized object is null because of type mismatch
assertNull(person);
}
}
3. Test Case Explanation
- testSerialization():
- এখানে একটি
Personঅবজেক্ট তৈরি করা হয়েছে এবংGsonব্যবহার করে JSON-এ রূপান্তর করা হয়েছে। - পরে
assertTrueব্যবহার করে পরীক্ষা করা হয়েছে যে JSON স্ট্রিং-এJohnএবং30অন্তর্ভুক্ত রয়েছে কিনা।
- এখানে একটি
- testDeserialization():
- JSON স্ট্রিং থেকে
Personঅবজেক্টে রূপান্তর করা হয়েছে। - পরে
assertNotNullএবংassertEqualsব্যবহার করে নিশ্চিত করা হয়েছে যে অবজেক্টটি সঠিকভাবে ডেসিরিয়ালাইজ হয়েছে এবং এরnameএবংageপ্রপার্টি সঠিক।
- JSON স্ট্রিং থেকে
- testDeserializationInvalidJson():
- এখানে একটি ভুল JSON স্ট্রিং ব্যবহার করা হয়েছে, যেখানে
"age"প্রপার্টি একটি স্ট্রিং ভ্যালু রয়েছে, যা একটি ইন্টিজার হওয়া উচিত। gson.fromJson()এই JSON-কেPersonক্লাসে ডেসিরিয়ালাইজ করার চেষ্টা করবে, তবে এটি সফলভাবে কাজ করবে না এবংassertNull(person)দিয়ে নিশ্চিত করা হয়েছে যে ডেসিরিয়ালাইজেশন ব্যর্থ হয়েছে।
- এখানে একটি ভুল JSON স্ট্রিং ব্যবহার করা হয়েছে, যেখানে
4. Running the Tests
JUnit 5 টেস্ট চালানোর জন্য আপনি আপনার IDE বা Maven/Gradle ব্যবহার করতে পারেন।
Maven:
mvn test
Gradle:
gradle test
IDE এর মাধ্যমে, যেমন IntelliJ IDEA বা Eclipse, আপনি সরাসরি টেস্ট রান করতে পারবেন।
5. Output
যদি সবকিছু সঠিকভাবে কাজ করে, আপনাকে নিচের মত কিছু আউটপুট দেখতে হবে:
Tests passed: 3
এবং যদি কোনো সমস্যা থাকে (যেমন JSON এর ফরম্যাট ভুল), তবে JUnit আপনার টেস্টগুলির ফলাফল দেখাবে এবং ত্রুটির বার্তা প্রদান করবে।
JUnit ব্যবহার করে Gson এর সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কার্যকারিতা পরীক্ষা করা খুবই সহজ। আপনি JSON ডেটা এবং Java অবজেক্টের মধ্যে রূপান্তর পরীক্ষা করতে পারেন এবং এর মান যাচাই করতে পারেন। এর মাধ্যমে আপনি নিশ্চিত করতে পারেন যে আপনার JSON প্রক্রিয়াগুলি সঠিকভাবে কাজ করছে এবং আপনার অ্যাপ্লিকেশনটি প্রত্যাশিতভাবে ডেটা পরিচালনা করছে।
Gson এ Custom Serializer এবং Custom Deserializer এর জন্য Unit Test তৈরি করার জন্য, আমরা সাধারণত JUnit এবং Mockito ফ্রেমওয়ার্ক ব্যবহার করি। এই টেস্টে আমরা Gson এর কাস্টম সিরিয়ালাইজার এবং ডিজিরিয়ালাইজারের কার্যকারিতা যাচাই করব।
এখানে একটি উদাহরণ দেওয়া হবে যেখানে আমরা Person ক্লাসের জন্য Custom Serializer এবং Custom Deserializer তৈরি করব এবং তাদের ইউনিট টেস্ট করব।
Step 1: Custom Serializer এবং Deserializer তৈরি করা
Person Model Class:
public class Person {
private String name;
private int age;
// Constructors, Getters, and Setters
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Custom Serializer:
import com.google.gson.*;
import java.lang.reflect.Type;
public class PersonSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("full_name", person.getName()); // Custom field name
jsonObject.addProperty("age_in_years", person.getAge()); // Custom field name
return jsonObject;
}
}
Custom Deserializer:
import com.google.gson.*;
import java.lang.reflect.Type;
public class PersonDeserializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("full_name").getAsString(); // Custom field name
int age = jsonObject.get("age_in_years").getAsInt(); // Custom field name
return new Person(name, age);
}
}
Step 2: Gson Configuration with Custom Serializer and Deserializer
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GsonConfig {
@Bean
public Gson gson() {
return new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonSerializer()) // Register custom serializer
.registerTypeAdapter(Person.class, new PersonDeserializer()) // Register custom deserializer
.create();
}
}
Step 3: Unit Test for Custom Serializer and Deserializer
আমরা JUnit ব্যবহার করে Gson এর কাস্টম সিরিয়ালাইজার এবং ডিজিরিয়ালাইজারের জন্য ইউনিট টেস্ট লিখব।
JUnit Test:
import com.google.gson.Gson;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PersonSerializerDeserializerTest {
private Gson gson;
@BeforeEach
public void setUp() {
gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonSerializer()) // Register custom serializer
.registerTypeAdapter(Person.class, new PersonDeserializer()) // Register custom deserializer
.create();
}
@Test
public void testPersonSerialization() {
// Create a Person object
Person person = new Person("John Doe", 30);
// Serialize the Person object to JSON
String json = gson.toJson(person);
// Expected JSON output
String expectedJson = "{\"full_name\":\"John Doe\",\"age_in_years\":30}";
// Assert that the serialized JSON is correct
assertEquals(expectedJson, json);
}
@Test
public void testPersonDeserialization() {
// JSON string to be deserialized
String json = "{\"full_name\":\"Jane Doe\",\"age_in_years\":25}";
// Deserialize the JSON to a Person object
Person person = gson.fromJson(json, Person.class);
// Assert that the deserialized object is correct
assertEquals("Jane Doe", person.getName());
assertEquals(25, person.getAge());
}
}
Explanation of the Unit Test:
- Test Setup (
@BeforeEach):setUp()মেথডে আমরা Gson এরPersonSerializerএবংPersonDeserializerরেজিস্টার করেছি।
- Serialization Test:
testPersonSerialization()মেথডে একটিPersonঅবজেক্ট তৈরি করে সেটিকেGsonএর মাধ্যমে JSON ফরম্যাটে সিরিয়ালাইজ করা হয়েছে। তারপর, এটি পরীক্ষা করা হয় যে JSON আউটপুটটি কাস্টম ফিল্ড নামের সাথে সঠিকভাবে তৈরি হয়েছে কিনা।
- Deserialization Test:
testPersonDeserialization()মেথডে JSON স্ট্রিং থেকে Person অবজেক্ট তৈরি করা হয় এবং তারপর যাচাই করা হয় যে নাম এবং বয়স সঠিকভাবে ডেসিরিয়ালাইজ হয়েছে কিনা।
Step 4: Run the Tests
আপনি JUnit টেস্টগুলি রান করে দেখতে পারেন যে, Gson এর কাস্টম সিরিয়ালাইজার এবং ডিজিরিয়ালাইজার সঠিকভাবে কাজ করছে কিনা। টেস্টের সফলতার জন্য, সঠিকভাবে কাস্টম ফিল্ড নাম (যেমন full_name, age_in_years) সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হবে।
Expected Output of Tests:
Test passed.
এখানে, দুটি টেস্ট সফলভাবে পাস করার জন্য প্রত্যাশিত আউটপুট:
testPersonSerialization()টেস্টটি নিশ্চিত করবে যে Person অবজেক্টটি সঠিকভাবে JSON এ সিরিয়ালাইজ হয়েছে এবং কাস্টম ফিল্ড নাম ব্যবহার করেছে।testPersonDeserialization()টেস্টটি JSON থেকে Person অবজেক্টে ডেসিরিয়ালাইজেশন পরীক্ষা করবে এবং সঠিক মানগুলি ফিরিয়ে আনবে।
Gson এর Custom Serializer এবং Deserializer এর জন্য Unit Test তৈরি করা খুবই সহজ এবং এতে আপনার কাস্টম সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন লজিক যাচাই করা যায়। JUnit এবং Gson ব্যবহার করে আপনি Gson এর কার্যকারিতা এবং কাস্টম লজিক পরীক্ষা করতে পারবেন, যা ডেভেলপমেন্টে গুরুত্বপূর্ণ একটি অংশ।
Gson-এর সাহায্যে JSON ডেটা প্রক্রিয়াকরণের জন্য unit testing এবং integration testing খুবই গুরুত্বপূর্ণ, যাতে আপনি নিশ্চিত হতে পারেন যে আপনার কোড সঠিকভাবে কাজ করছে এবং JSON পার্সিং, সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন ঠিকমতো হচ্ছে। Test Coverage এবং Integration Testing আপনার কোডের গুণগত মান বৃদ্ধি করতে সহায়ক।
এখানে, Test Coverage এবং Integration Testing সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে, যা Gson এর মাধ্যমে JSON ডেটা ম্যানিপুলেট করতে ব্যবহার করা যায়।
1. Test Coverage:
Test Coverage বলতে বুঝায়, আপনার কোডের কতটা অংশ (lines, branches, functions, ইত্যাদি) টেস্টের আওতায় এসেছে। এটি আপনাকে একটি পরিসংখ্যান দেয় যে আপনার কোডের কতটা পরীক্ষা করা হয়েছে এবং কোন অংশটি টেস্ট করা হয়নি।
Gson-এর সাথে Test Coverage উন্নত করার জন্য আপনাকে JSON ডেটার সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন ফাংশনগুলোর জন্য unit tests লিখতে হবে। JUnit এবং Mockito সহ Java testing টুলস Gson এর সাথে খুব ভালোভাবে কাজ করে।
Test Coverage টেস্ট লেখার জন্য উপাদানসমূহ:
- Unit Test: একটি নির্দিষ্ট ফাংশন বা মেথডের সঠিকতা পরীক্ষা করার জন্য।
- Mocking: উপাদান বা নির্ভরশীলতা (dependencies) মক (mock) করা, যেমন ডেটাবেস কল বা ওয়েব সার্ভিস।
- Code Coverage Tools: যেমন JaCoCo অথবা Cobertura ব্যবহার করে আপনার কোডের কত অংশ টেস্ট হচ্ছে তা পরিমাপ করা।
Gson এর জন্য Unit Test উদাহরণ (JUnit):
ধরা যাক, আপনার একটি User ক্লাস রয়েছে এবং আপনি Gson দিয়ে তাকে সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করছেন।
Java Class:
class User {
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
JUnit Test Case (Unit Test):
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class GsonTest {
@Test
public void testSerialization() {
User user = new User("Rahim", 30);
Gson gson = new Gson();
// Serialize User object to JSON
String json = gson.toJson(user);
// Assert that the JSON string contains expected fields
assertTrue(json.contains("Rahim"));
assertTrue(json.contains("30"));
}
@Test
public void testDeserialization() {
String json = "{\"name\":\"Rahim\",\"age\":30}";
Gson gson = new Gson();
// Deserialize JSON back to User object
User user = gson.fromJson(json, User.class);
// Assert that the user object has the expected properties
assertEquals("Rahim", user.name);
assertEquals(30, user.age);
}
}
এখানে, দুটি unit test তৈরি করা হয়েছে:
- testSerialization():
Userঅবজেক্টকে JSON-এ রূপান্তরিত করা হচ্ছে এবং টেস্ট করা হচ্ছে যে JSON স্ট্রিংয়ে সঠিক মান আছে। - testDeserialization(): JSON স্ট্রিং থেকে
Userঅবজেক্টে রূপান্তরিত করা হচ্ছে এবং টেস্ট করা হচ্ছে যে অবজেক্টের প্রপার্টি সঠিকভাবে ডেসেরিয়ালাইজ হয়েছে।
Code Coverage Tools: যেমন JaCoCo ব্যবহার করে আপনি দেখতে পারেন যে কতটা কোড টেস্ট করা হয়েছে:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
2. Integration Testing:
Integration Testing হলো একাধিক সিস্টেম কম্পোনেন্ট একত্রে কাজ করছে কিনা তা পরীক্ষা করা। Gson-এর ক্ষেত্রে, এটি বিশেষত গুরুত্বপূর্ণ যখন আপনি বিভিন্ন সিস্টেম বা সার্ভিসের মধ্যে JSON ডেটা ট্রান্সফার করছেন। উদাহরণস্বরূপ, আপনি যখন একটি REST API তৈরি করেন, এবং সেখানে JSON ডেটা পাঠানো ও গ্রহণ করা হয়, তখন Gson ব্যবহার করে ইন্টিগ্রেশন টেস্ট লেখা হয় যাতে সঠিক JSON রূপান্তর নিশ্চিত করা যায়।
Integration Testing বিভিন্ন উপাদান এবং সার্ভিসের মধ্যে কাজ পরীক্ষা করে। এর মধ্যে থাকতে পারে:
- একাধিক অবজেক্ট বা সার্ভিসের মধ্যে JSON ডেটা পাঠানো এবং গ্রহণ করা।
- API কলের মাধ্যমে JSON ডেটার সিরিয়ালাইজেশন ও ডেসেরিয়ালাইজেশন পরীক্ষা করা।
- ডেটাবেস বা অন্য সার্ভিসে JSON ডেটা পাঠানো এবং যাচাই করা।
Integration Test উদাহরণ (Spring Boot API):
ধরা যাক, আপনি একটি Spring Boot অ্যাপ্লিকেশন তৈরি করেছেন যেখানে একটি REST API ব্যবহার করা হচ্ছে, এবং JSON ডেটার মাধ্যমে একটি User অবজেক্ট পোস্ট করা হচ্ছে।
Spring Boot Controller (User Controller):
@RestController
public class UserController {
@PostMapping("/user")
public ResponseEntity<User> createUser(@RequestBody User user) {
// Here, we simply return the user as is
return ResponseEntity.ok(user);
}
}
Integration Test for the Controller (JUnit + Spring Boot Test):
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testCreateUser() {
User user = new User("Rahim", 30);
Gson gson = new Gson();
String json = gson.toJson(user);
// Make a POST request
HttpEntity<String> entity = new HttpEntity<>(json);
ResponseEntity<String> response = restTemplate.exchange("/user", HttpMethod.POST, entity, String.class);
// Assert that the response status is OK and the content matches
assertEquals(200, response.getStatusCodeValue());
assertTrue(response.getBody().contains("Rahim"));
assertTrue(response.getBody().contains("30"));
}
}
এখানে, Spring Boot Test ব্যবহার করে POST /user API-এর জন্য ইনটিগ্রেশন টেস্ট তৈরি করা হয়েছে। এখানে:
- TestRestTemplate ব্যবহার করে API কল করা হয়েছে।
- Gson দিয়ে JSON স্ট্রিং তৈরি করা হয়েছে।
HttpEntityব্যবহার করে JSON ডেটা API-তে পাঠানো হয়েছে।- টেস্ট করা হয়েছে যে, সঠিক HTTP status এবং JSON রেসপন্স ফিরে এসেছে কিনা।
3. Test Coverage এবং Integration Testing এর গুরুত্ব:
- Test Coverage: নিশ্চিত করে যে আপনার কোডের অধিকাংশ অংশ সঠিকভাবে টেস্ট করা হয়েছে এবং কোনো ভুল বা সমস্যা রয়ে যায়নি। এটি উন্নত কোড গুণমান এবং রক্ষণাবেক্ষণের জন্য খুবই গুরুত্বপূর্ণ।
- Integration Testing: JSON প্রসেসিংয়ের ক্ষেত্রে ইন্টিগ্রেশন টেস্টing এর মাধ্যমে আপনি নিশ্চিত হতে পারেন যে, JSON ডেটা সঠিকভাবে বিভিন্ন সার্ভিস এবং ক্লাসে আদান-প্রদান হচ্ছে এবং এটি সঠিকভাবে পার্স এবং সিরিয়ালাইজ হচ্ছে।
সারাংশ:
- Test Coverage নিশ্চিত করে যে আপনার Gson কোড সঠিকভাবে কাজ করছে এবং JSON প্রক্রিয়া যেমন সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন সঠিকভাবে হচ্ছে।
- Integration Testing আপনার JSON ডেটার আদান-প্রদান পরীক্ষার মাধ্যমে বিভিন্ন কম্পোনেন্ট এবং সার্ভিসের মধ্যে সঠিক ইন্টিগ্রেশন নিশ্চিত করে।
- JUnit, Mockito, এবং Spring Boot-এর মতো টুলস ব্যবহার করে Gson এর জন্য টেস্ট কোড লেখা এবং টেস্ট কভারেজ পরিমাপ করা সহজ।
Read more