Spring Batch অ্যাপ্লিকেশনে টেস্টিং একটি গুরুত্বপূর্ণ বিষয়, কারণ এটি বড় আকারের ডেটাসেট প্রসেসিংয়ের জন্য ব্যবহৃত হয়। Spring Batch এর টেস্টিং সাধারণত Step এবং Job এর উপর ভিত্তি করে করা হয়। Spring Batch Test সমর্থন করে JUnit, Mockito, এবং Spring Test ফ্রেমওয়ার্কগুলো, যা আপনাকে ব্যাচ জব এবং স্টেপের কার্যকারিতা পরীক্ষা করতে সহায়তা করে।
Spring Batch Testing এর মূল উদ্দেশ্য হলো:
- Step-level testing: পৃথক পৃথক স্টেপ গুলোর কার্যকারিতা পরীক্ষা করা।
- Job-level testing: পুরো ব্যাচ জবটি পরীক্ষা করা।
- Integration testing: Spring Batch এবং অন্যান্য সিস্টেম (যেমন ডাটাবেস বা ফাইল সিস্টেম) এর মধ্যে ইন্টিগ্রেশন পরীক্ষা করা।
এখানে, আমরা JUnit এবং Spring Test ব্যবহার করে Spring Batch এর টেস্টিং কিভাবে করা হয় তার একটি উদাহরণ দেখাবো।
Spring Batch Testing এর উপাদান
১. JUnit ব্যবহার করে Step Testing
Spring Batch এ Step এর কার্যকারিতা পরীক্ষা করার জন্য আমরা JUnit ব্যবহার করতে পারি।
উদাহরণ: Step Testing
ধরা যাক, আমাদের একটি ItemProcessor আছে যা একটি Person অবজেক্টকে প্রসেস করে, এবং আমরা এই প্রসেসিংয়ের কার্যকারিতা পরীক্ষা করতে চাই।
@RunWith(SpringRunner.class)
@SpringBootTest
public class StepTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private Step step1;
@Test
public void testItemProcessor() throws Exception {
// Step execution
StepExecution stepExecution = jobLauncherTestUtils.launchStep("step1");
// Step status verification
assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus());
}
}
এখানে, আমরা @SpringBootTest অ্যানোটেশন ব্যবহার করে Spring Batch Step এর কার্যকারিতা পরীক্ষা করছি। jobLauncherTestUtils.launchStep("step1") ব্যবহার করে স্টেপ এক্সিকিউট করা হয় এবং তারপর StepExecution এর স্ট্যাটাস চেক করা হয়।
২. Job Testing
Spring Batch এর মধ্যে Job সাধারণত একাধিক Step নিয়ে গঠিত। Job এর Testing করতে গেলে, সব স্টেপগুলি সঠিকভাবে সম্পন্ন হচ্ছে কিনা তা পরীক্ষা করা হয়।
উদাহরণ: Job Testing
@RunWith(SpringRunner.class)
@SpringBootTest
public class JobTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private Job job;
@Test
public void testJob() throws Exception {
// Job execution
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
// Job status verification
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
}
}
এখানে, আমরা @SpringBootTest এবং JobLauncherTestUtils ব্যবহার করে একটি পুরো Job চালাচ্ছি এবং তার status চেক করছি। এটি নিশ্চিত করতে সাহায্য করে যে সমস্ত Step সঠিকভাবে এক্সিকিউট হয়েছে এবং Job সফলভাবে সম্পন্ন হয়েছে।
৩. Mockito ব্যবহার করে ItemReader, ItemProcessor, এবং ItemWriter Testing
Spring Batch Testing এর মধ্যে Mockito ব্যবহার করে ItemReader, ItemProcessor, এবং ItemWriter এর mock অডজেক্ট তৈরি করা হয়, যাতে তাদের কার্যকারিতা সঠিকভাবে পরীক্ষিত হয়।
উদাহরণ: ItemReader, ItemProcessor, এবং ItemWriter Mocking
@RunWith(MockitoJUnitRunner.class)
public class BatchComponentsTest {
@Mock
private ItemReader<String> itemReader;
@Mock
private ItemProcessor<String, String> itemProcessor;
@Mock
private ItemWriter<String> itemWriter;
@InjectMocks
private Step step;
@Test
public void testBatchStep() throws Exception {
// Mocking ItemReader, ItemProcessor, and ItemWriter
when(itemReader.read()).thenReturn("Item1", "Item2", null);
when(itemProcessor.process("Item1")).thenReturn("ProcessedItem1");
when(itemProcessor.process("Item2")).thenReturn("ProcessedItem2");
// Create a simple chunk
List<String> items = new ArrayList<>();
items.add("Item1");
items.add("Item2");
// Call the writer and verify
itemWriter.write(items);
verify(itemWriter).write(items);
// Simulate Step execution
StepExecution stepExecution = step.execute(new StepExecution("step1", new JobExecution(1L)));
assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus());
}
}
এখানে, Mockito ব্যবহার করে আমরা ItemReader, ItemProcessor, এবং ItemWriter এর mock তৈরি করেছি এবং তাদের কার্যকারিতা পরীক্ষা করেছি। when() এবং verify() ব্যবহার করে বিভিন্ন কার্যক্রম নিশ্চিত করা হয়েছে।
৪. Integration Testing: Spring Batch with Database
Spring Batch এর টেস্টিংয়ে Integration Testing করা প্রয়োজন, যেখানে ব্যাচ জবটি আসল ডাটাবেসের সাথে ইন্টিগ্রেট হয়ে কাজ করে। @DataJpaTest এবং @SpringBootTest ব্যবহৃত হয় ডাটাবেস ইন্টিগ্রেশন পরীক্ষার জন্য।
উদাহরণ: Spring Batch Job and Database Integration Test
@RunWith(SpringRunner.class)
@SpringBootTest
@DataJpaTest
public class BatchJobDatabaseIntegrationTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private Job job;
@Autowired
private PersonRepository personRepository;
@Test
public void testJobWithDatabaseIntegration() throws Exception {
// Before execution: Check database state
long initialCount = personRepository.count();
assertTrue(initialCount == 0); // Assuming no records are initially in DB
// Execute the job
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
// After execution: Check database state
long finalCount = personRepository.count();
assertTrue(finalCount > 0); // The job should insert data into the DB
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
}
}
ব্যাখ্যা:
@DataJpaTest: ডাটাবেস সম্পর্কিত টেস্টিংয়ের জন্য ব্যবহৃত হয়, যেখানে ইন-মেমরি ডাটাবেস বা ডাটাবেসের সাথে কার্যকরী টেস্টিং করা হয়।personRepository.count(): ডাটাবেসে রেকর্ডের সংখ্যা পরীক্ষা করে যাতে নিশ্চিত হওয়া যায় যে ব্যাচ জব সফলভাবে ডাটাবেসে ডেটা ইনসার্ট করেছে।
সারাংশ
Spring Batch Testing ব্যাচ প্রক্রিয়ার কার্যকারিতা পরীক্ষা করার জন্য বিভিন্ন কৌশল ব্যবহৃত হয়। JUnit এবং Mockito ব্যবহার করে Step এবং Job এর টেস্টিং করা হয়, যেখানে ItemReader, ItemProcessor, এবং ItemWriter এর mock তৈরি করে তাদের কার্যকারিতা পরীক্ষা করা হয়। এছাড়া Integration Testing এর মাধ্যমে ব্যাচ প্রক্রিয়া ডাটাবেসের সাথে ইন্টিগ্রেট হয়ে কার্যকরীভাবে কাজ করছে কিনা তা পরীক্ষা করা হয়। এই কৌশলগুলো ব্যাচ জব এবং স্টেপের কার্যকরীতা নিশ্চিত করতে সহায়তা করে এবং ব্যাচ অ্যাপ্লিকেশনকে উন্নতভাবে পরিচালনা করতে সাহায্য করে।
Read more