Contract Testing একটি ধরনের সফটওয়্যার টেস্টিং যা দুটি সিস্টেমের মধ্যে যোগাযোগের চুক্তি (contract) যাচাই করতে ব্যবহৃত হয়। এই চুক্তি সাধারণত একটি API-এর ধরণ এবং আচরণ (behavior) সংক্রান্ত শর্তাবলী। Contract Testing এর মাধ্যমে আমরা নিশ্চিত করতে পারি যে, সার্ভিসের ক্লায়েন্ট এবং সার্ভার উভয়ই একটি সাধারণ চুক্তি মেনে চলছে এবং যোগাযোগের ক্ষেত্রে কোন সমস্যা তৈরি হচ্ছে না।
Contract বলতে বুঝানো হয় দুটি সিস্টেমের মধ্যে API-র কাঠামো (request, response, data type) এবং আচরণ। যদি এই চুক্তি পূর্ণ হয়, তবে সার্ভিসগুলোর মধ্যে নির্ভরযোগ্য এবং কার্যকর কমিউনিকেশন সম্ভব হয়। Contract Testing সাধারণত Consumer-Driven Contract Testing এবং Provider-Driven Contract Testing এই দুটি প্রধান পদ্ধতির মাধ্যমে সম্পাদিত হয়।
Contract Testing এর প্রয়োজনীয়তা
- মাইক্রোসার্ভিস আর্কিটেকচারে API-এর নির্ভরযোগ্যতা নিশ্চিত করা:
- মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক সার্ভিস একে অপরের উপর নির্ভরশীল থাকে এবং সার্ভিসগুলো একে অপরকে API-র মাধ্যমে কল করে। একে অপরের মধ্যে সঠিকভাবে ডেটা আদান-প্রদান হচ্ছে কিনা তা নিশ্চিত করতে Contract Testing গুরুত্বপূর্ণ। এটি API-এর ধরণ এবং আচরণ সঠিকভাবে কাজ করছে কি না তা পরীক্ষা করে।
- চুক্তি অনুসরণকারী সার্ভিস ডেভেলপমেন্ট:
- Contract Testing এর মাধ্যমে এটি নিশ্চিত করা যায় যে একটি সার্ভিসের কনজিউমার বা ক্লায়েন্ট তার প্রত্যাশিত API স্ট্রাকচার এবং আচরণ মেনে কাজ করছে। সার্ভিসের প্রোভাইডার এবং কনজিউমার উভয়ের জন্য একটি চুক্তি তৈরি করা হয়, যাতে কেউই কোনো ধরনের পরিবর্তন করলে সেটি অটোমেটিক্যালি পরীক্ষা করা যাবে।
- রিলায়েবিলিটি এবং কম্প্যাটিবিলিটি নিশ্চিতকরণ:
- যখন API বা সার্ভিসে কোনো পরিবর্তন আনা হয়, Contract Testing নিশ্চিত করে যে পূর্বের ক্লায়েন্ট এবং সার্ভিসের মধ্যে যোগাযোগ এবং ডেটা স্ট্রাকচার অক্ষুণ্ণ থাকবে এবং নতুন পরিবর্তনের কারণে কোনো সমস্যা হবে না।
- API ইন্টিগ্রেশন পরীক্ষা সহজ করা:
- Contract Testing API-র মাধ্যমে সার্ভিস ইন্টিগ্রেশন পরীক্ষা করা সহজ করে তোলে। API-এর ভ্যালিডেশন এবং যেকোনো ধরনের ব্রেকিং চেঞ্জ সনাক্ত করা দ্রুত হয়।
- ফাস্ট এবং কমপ্যাক্ট টেস্টিং:
- এটি সাধারণত দ্রুত, কমপ্যাক্ট এবং ইনক্রিমেন্টাল টেস্টিং সিস্টেম তৈরি করতে সাহায্য করে, যা মাইক্রোসার্ভিস আর্কিটেকচারে গুরুত্বপূর্ণ।
Contract Testing প্রক্রিয়া
Contract Testing সাধারণত Consumer-Driven Contract Testing এবং Provider-Driven Contract Testing পদ্ধতির মাধ্যমে সম্পাদিত হয়।
1. Consumer-Driven Contract Testing:
- এই পদ্ধতিতে, Consumer (ক্লায়েন্ট) তাদের প্রত্যাশিত API চুক্তি তৈরি করে এবং এটি Provider (সার্ভিস) দ্বারা যাচাই করা হয়। এখানে Consumer প্রথমে তাদের প্রয়োজনীয় API চুক্তি তৈরি করে এবং পরে Provider সার্ভিসে এই চুক্তি পরীক্ষা করা হয়, যাতে নিশ্চিত করা যায় যে API-টি ঠিকভাবে কাজ করছে।
উদাহরণ:
- একটি চ্যাট অ্যাপ্লিকেশনে ব্যবহারকারী যদি একটি নতুন মেসেজ পাঠানোর জন্য একটি POST রিকোয়েস্ট পাঠায়, তাহলে সেই API-এর স্ট্রাকচার এবং রেসপন্সের চুক্তি Consumer-Driven Contract Testing-এর মাধ্যমে নিশ্চিত করা হবে।
2. Provider-Driven Contract Testing:
- এই পদ্ধতিতে, Provider (সার্ভিস) API-র চুক্তি তৈরি করে এবং পরে Consumer (ক্লায়েন্ট) এটি যাচাই করে। এখানে Provider সার্ভিস API-এর আচরণ এবং কাঠামো নির্ধারণ করে, এবং Consumer এই চুক্তি অনুযায়ী কাজ করে।
উদাহরণ:
- একটি পেমেন্ট গেটওয়ে সার্ভিস একটি পেমেন্ট করার জন্য API প্রদান করে এবং সেই API এর চুক্তি Consumer দ্বারা পরীক্ষা করা হয়, যা নির্ধারণ করবে ক্লায়েন্ট কীভাবে পেমেন্ট প্রক্রিয়া করবে।
Spring Cloud Contract Testing
Spring Cloud Contract হলো Spring Framework এর একটি অংশ যা API কন্ট্রাক্ট টেস্টিং সহজ করে তোলে। এটি Consumer-Driven Contract Testing এবং Provider-Driven Contract Testing উভয়কেই সমর্থন করে। Spring Cloud Contract-এর মাধ্যমে মাইক্রোসার্ভিসের মধ্যে API ইন্টিগ্রেশন টেস্টিং সহজ এবং কার্যকরভাবে সম্পাদিত হয়।
Spring Cloud Contract সরঞ্জাম দিয়ে, আপনি কনট্রাক্ট তৈরি এবং যাচাই করতে পারবেন যা ক্লায়েন্ট এবং সার্ভিসের মধ্যে সম্পর্ক স্থাপন করবে।
Spring Cloud Contract এর প্রধান বৈশিষ্ট্যসমূহ:
- Consumer-Driven Contracts:
- Consumer API কন্ট্রাক্ট তৈরি করতে পারে এবং Provider ওই কন্ট্রাক্টের সাথে মিল রেখে তাদের API ডিজাইন করে।
- Groovy DSL বা YAML কনফিগারেশন:
- Spring Cloud Contract Groovy DSL অথবা YAML কনফিগারেশন ব্যবহার করে API কন্ট্রাক্ট এবং টেস্ট কেস তৈরি করতে সাহায্য করে।
- Auto-generated Tests:
- Spring Cloud Contract স্বয়ংক্রিয়ভাবে কন্ট্রাক্ট টেস্ট তৈরি করে এবং API চুক্তির ভিত্তিতে সার্ভিসের কার্যকারিতা যাচাই করে।
- Maven/Gradle ইন্টিগ্রেশন:
- এটি Maven বা Gradle টুলসের মাধ্যমে সহজে ইন্টিগ্রেট করা যায়, যা CI/CD পাইনলাইন এর অংশ হিসেবে টেস্টিং করতে সাহায্য করে।
Spring Cloud Contract Testing উদাহরণ
1. Spring Cloud Contract Consumer-Driven Contract Example
Maven Dependency for Spring Cloud Contract Consumer:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
Consumer Test Example (JUnit Test):
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureStubRunner(ids = "com.example:payment-service:+:stubs:8080", stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class PaymentServiceTest {
@Autowired
private RestTemplate restTemplate;
@Test
public void testPaymentRequest() {
String url = "http://localhost:8080/payment";
PaymentRequest paymentRequest = new PaymentRequest("John", 100);
ResponseEntity<String> response = restTemplate.postForEntity(url, paymentRequest, String.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
}
}
Contract File Example (Groovy DSL):
org.springframework.cloud.contract.spec.Contract.make {
description "Should create a new payment"
request {
method 'POST'
url '/payment'
body([
"name": "John",
"amount": 100
])
headers {
contentType(applicationJson())
}
}
response {
status 200
body([
"status": "success"
])
}
}
2. Spring Cloud Contract Provider-Driven Contract Example
Maven Dependency for Spring Cloud Contract Provider:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
<version>3.1.0</version>
</dependency>
Provider Application Code Example:
@RestController
public class PaymentController {
@PostMapping("/payment")
public ResponseEntity<PaymentResponse> createPayment(@RequestBody PaymentRequest paymentRequest) {
PaymentResponse response = new PaymentResponse("success");
return ResponseEntity.ok(response);
}
}
Contract Test Verification:
Spring Cloud Contract automatically generates tests that verify the PaymentController implementation against the contract.
উপসংহার
Contract Testing একটি অত্যন্ত গুরুত্বপূর্ণ টেস্টিং পদ্ধতি, যা মাইক্রোসার্ভিসের মধ্যে API চুক্তি নিশ্চিত করতে ব্যবহৃত হয়। এটি API-র আচরণ এবং কাঠামোর সাথে সার্ভিসের সঠিকতা নিশ্চিত করে, যার মাধ্যমে সার্ভিসগুলোর মধ্যে নিরাপদ এবং নির্ভরযোগ্য যোগাযোগ সম্ভব হয়। Spring Cloud Contract এই প্রক্রিয়াটি সরল এবং কার্যকর করে তোলে, যা মাইক্রোসার্ভিসে API ইন্টিগ্রেশন টেস্টিং সহজে এবং স্বয়ংক্রিয়ভাবে সম্পাদিত করতে সহায়তা করে।
Read more