Spring Cloud Contract একটি ফ্রেমওয়ার্ক যা মাইক্রোসার্ভিস আর্কিটেকচারে Consumer-Driven Contract Testing (CDC Testing) বাস্তবায়ন করতে ব্যবহৃত হয়। এটি দুটি প্রধান ভূমিকা পালন করে:
Spring Cloud Contract-এ সাধারণত Pact বা Contract নামে পরিচিত টেস্টগুলি ব্যবহৃত হয়, যা নিশ্চিত করে যে সার্ভিসগুলির মধ্যে যোগাযোগের সময় কোনও ধরণের অমিল বা ব্রেকডাউন হবে না।
Consumer-Driven Contract Testing (CDC Testing) একটি পদ্ধতি যেখানে কনজিউমার (যেমন ক্লায়েন্ট সার্ভিস) এবং প্রোভাইডার (যেমন সার্ভার সার্ভিস) এর মধ্যে একটি চুক্তি তৈরি করা হয়, যা তাদের মধ্যে ডেটা বিনিময়ের বা API কলের আউটপুট সম্পর্কে নির্দিষ্ট করা হয়।
Spring Cloud Contract কার্যকরভাবে Consumer-Driven Contract Testing পরীক্ষা করতে তিনটি প্রধান অংশে কাজ করে:
Spring Cloud Contract ব্যবহার করতে প্রথমে প্রয়োজনীয় ডিপেন্ডেন্সি pom.xml
এ যুক্ত করতে হবে।
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
<scope>test</scope>
</dependency>
এখানে একটি Groovy DSL চুক্তি উদাহরণ দেওয়া হচ্ছে:
// contract.groovy
org.springframework.cloud.contract.spec.Contract.make {
description "should return a valid response"
request {
method 'GET'
url '/api/example'
}
response {
status 200
body([
message: "Hello, World!"
])
headers {
contentType(applicationJson())
}
}
}
এই চুক্তি বলে যে, /api/example
এ একটি GET রিকোয়েস্ট পাঠালে, প্রোভাইডার একটি সঠিক 200 OK
স্ট্যাটাস সহ একটি JSON রেসপন্স ফেরত দেবে।
কনজিউমারের জন্য Spring Cloud Contract স্বয়ংক্রিয়ভাবে টেস্ট তৈরি করে।
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ConsumerTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void shouldReturnHelloWorld() {
String response = restTemplate.getForObject("/api/example", String.class);
assertThat(response).isEqualTo("{\"message\":\"Hello, World!\"}");
}
}
প্রোভাইডারের জন্য একটি স্টাব তৈরি করা হবে যাতে কনজিউমার টেস্ট করতে পারে।
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureStubRunner(ids = "com.example:my-provider:+:stubs:8080", stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class ProviderTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void shouldReturnValidResponse() {
String response = restTemplate.getForObject("http://localhost:8080/api/example", String.class);
assertThat(response).isEqualTo("{\"message\":\"Hello, World!\"}");
}
}
Spring Cloud Contract মাইক্রোসার্ভিস আর্কিটেকচারে Consumer-Driven Contract Testing সিস্টেম প্রয়োগ করে এবং কনজিউমার ও প্রোভাইডারের মধ্যে সঠিকভাবে যোগাযোগ নিশ্চিত করে। এটি উন্নত API টেস্টিং, স্বয়ংক্রিয় টেস্ট তৈরি, এবং চুক্তি ভিত্তিক কাজের জন্য কার্যকরী। Spring Cloud Contract মাইক্রোসার্ভিস আর্কিটেকচারের নির্ভরযোগ্যতা এবং স্টেবিলিটি বাড়াতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
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 সাধারণত Consumer-Driven Contract Testing এবং Provider-Driven Contract Testing পদ্ধতির মাধ্যমে সম্পাদিত হয়।
উদাহরণ:
উদাহরণ:
Spring Cloud Contract হলো Spring Framework এর একটি অংশ যা API কন্ট্রাক্ট টেস্টিং সহজ করে তোলে। এটি Consumer-Driven Contract Testing এবং Provider-Driven Contract Testing উভয়কেই সমর্থন করে। Spring Cloud Contract-এর মাধ্যমে মাইক্রোসার্ভিসের মধ্যে API ইন্টিগ্রেশন টেস্টিং সহজ এবং কার্যকরভাবে সম্পাদিত হয়।
Spring Cloud Contract সরঞ্জাম দিয়ে, আপনি কনট্রাক্ট তৈরি এবং যাচাই করতে পারবেন যা ক্লায়েন্ট এবং সার্ভিসের মধ্যে সম্পর্ক স্থাপন করবে।
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"
])
}
}
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 ইন্টিগ্রেশন টেস্টিং সহজে এবং স্বয়ংক্রিয়ভাবে সম্পাদিত করতে সহায়তা করে।
Spring Cloud Contract এমন একটি টুল যা কনজিউমার-ড্রিভেন কন্ট্রাক্ট (Consumer-Driven Contract) তৈরিতে সহায়তা করে। এটি মূলত প্রোভাইডার (Provider) এবং কনজিউমার (Consumer) এর মধ্যে যোগাযোগের জন্য নির্দিষ্ট চুক্তি বা কন্ট্রাক্ট সংজ্ঞায়িত করতে ব্যবহৃত হয়।
Spring Cloud Contract এর মাধ্যমে API ইন্টারঅ্যাকশন গ্যারান্টি দেয়া যায়, যাতে নিশ্চিত করা যায় যে প্রোভাইডার এবং কনজিউমার উভয় পক্ষই একই কন্ট্রাক্ট অনুযায়ী কাজ করছে।
কনজিউমার-ড্রিভেন কন্ট্রাক্ট (Consumer-Driven Contract) এমন একটি প্যাটার্ন যেখানে API এর কন্ট্রাক্ট কনজিউমার দ্বারা সংজ্ঞায়িত হয়। এটি নিশ্চিত করে যে কনজিউমাররা তাদের প্রয়োজনীয়তার উপর ভিত্তি করে প্রোভাইডারের আচরণ পরীক্ষা করতে পারে।
build.gradle
ফাইল বা pom.xml
ফাইলে নিচের ডিপেনডেন্সি যুক্ত করুন:
Gradle:
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier'
testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock'
}
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-wiremock</artifactId>
<scope>test</scope>
</dependency>
গ্রোভি DSL ফাইল ব্যবহার করে কন্ট্রাক্ট তৈরি করুন।
Example Contract:
Contract.make {
description("Should return user details when a valid user ID is provided")
request {
method 'GET'
url '/users/1'
}
response {
status 200
body([
id: 1,
name: "John Doe",
email: "johndoe@example.com"
])
headers {
contentType('application/json')
}
}
}
স্টাব জেনারেট করতে spring-cloud-contract-maven-plugin
ব্যবহার করা হয়।
Maven Plugin Configuration:
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>3.1.3</version>
<configuration>
<baseClassForTests>com.example.BaseTest</baseClassForTests>
</configuration>
</plugin>
Spring Cloud Contract এর মাধ্যমে অটোমেটেড টেস্ট চালানোর জন্য BaseTest
নামে একটি ক্লাস তৈরি করুন।
public abstract class BaseTest {
@BeforeEach
public void setup() {
RestAssured.baseURI = "http://localhost";
RestAssured.port = 8080;
}
}
টেস্ট রান করার পর Spring Cloud Contract নিশ্চিত করবে যে প্রোভাইডার নির্ধারিত কন্ট্রাক্ট মেনে চলছে।
WireMock ব্যবহার করে কনজিউমার সাইড থেকে টেস্টিং করা যায়।
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 0)
public class ConsumerTest {
@Test
public void testGetUserDetails() {
stubFor(get(urlEqualTo("/users/1"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{ \"id\": 1, \"name\": \"John Doe\", \"email\": \"johndoe@example.com\" }")));
ResponseEntity<String> response = new RestTemplate().getForEntity("/users/1", String.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
}
}
Spring Cloud Contract ব্যবহার করে Consumer-Driven Contract বাস্তবায়ন করলে কনজিউমার এবং প্রোভাইডার উভয়ের মধ্যে নির্ভরযোগ্যতা নিশ্চিত হয়। এটি মাইক্রোসার্ভিস আর্কিটেকচারে একটি গুরুত্বপূর্ণ পদ্ধতি।
স্প্রিং ক্লাউড কন্ট্রাক্ট (Spring Cloud Contract) একটি টুল যা মাইক্রোসার্ভিস আর্কিটেকচারে ইন্টিগ্রেশন টেস্টিং সহজ করে তোলে। এটি কনজিউমার-প্রভাইডার (Consumer-Provider) আর্কিটেকচারে সার্ভিসগুলোর মধ্যে কন্ট্রাক্ট তৈরি এবং পরীক্ষা করার জন্য ব্যবহৃত হয়।
কন্ট্রাক্ট স্টাব (Contract Stub) তৈরির মাধ্যমে স্প্রিং ক্লাউড কন্ট্রাক্ট নিশ্চিত করে যে, মাইক্রোসার্ভিসগুলো নির্ধারিত চুক্তি বা কন্ট্রাক্ট অনুসারে একে অপরের সাথে যোগাযোগ করছে।
কন্ট্রাক্ট স্টাব এমন একটি মক বা নকল সার্ভিস যা আসল সার্ভিসের মতো আচরণ করে। এটি কনজিউমার এবং প্রভাইডারের মধ্যে নির্ধারিত কন্ট্রাক্ট অনুযায়ী আচরণ নিশ্চিত করতে ব্যবহৃত হয়। কন্ট্রাক্ট স্টাব প্রভাইডার সার্ভিসের প্রত্যাশিত রেসপন্সগুলো কনজিউমার সার্ভিসে পরীক্ষা করার জন্য তৈরি করা হয়।
স্প্রিং ক্লাউড কন্ট্রাক্ট ব্যবহার করে একটি DSL (Domain Specific Language) ফাইল তৈরি করা হয়, যা কনজিউমার-প্রভাইডার সম্পর্কের চুক্তি বর্ণনা করে। উদাহরণস্বরূপ, গ্রোভি (Groovy) বা YAML ফরম্যাটে এই কন্ট্রাক্ট ফাইল লেখা হয়।
Contract.make {
description "Get user details by ID"
request {
method GET()
url '/users/1'
}
response {
status 200
body(
id: 1,
name: "John Doe"
)
headers {
contentType(applicationJson())
}
}
}
কনজিউমার সার্ভিসে স্টাব ব্যবহার করে পরীক্ষা করা হয় যে, প্রভাইডার সার্ভিস থেকে প্রত্যাশিত রেসপন্স পাওয়া যাচ্ছে কিনা।
Gradle বা Maven ব্যবহার করে স্প্রিং ক্লাউড কন্ট্রাক্টের প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন।
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
<version>3.0.0</version>
</dependency>
implementation 'org.springframework.cloud:spring-cloud-starter-contract-verifier:3.0.0'
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<baseClassForTests>com.example.BaseTestClass</baseClassForTests>
</configuration>
</plugin>
plugins {
id "org.springframework.cloud.contract" version "3.0.0"
}
contracts {
testFramework = 'JUNIT5'
}
স্প্রিং ক্লাউড কন্ট্রাক্ট মাইক্রোসার্ভিস আর্কিটেকচারে ইন্টিগ্রেশন টেস্টিং সহজ করে এবং স্টাব জেনারেশনের মাধ্যমে প্রভাইডার ও কনজিউমারের মধ্যে নির্ভরযোগ্যতা নিশ্চিত করে। এটি ব্যবহারে অ্যাপ্লিকেশন আরও স্থিতিশীল এবং কার্যকর হয়।
Spring Cloud Contract Testing একটি শক্তিশালী টুল যা প্রোডিউসার (Producer) এবং কনজিউমার (Consumer) এর মধ্যে যোগাযোগের চুক্তি বা কন্ট্রাক্ট পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি মাইক্রোসার্ভিস আর্কিটেকচারে ইন্টার-সার্ভিস কমিউনিকেশনের নির্ভুলতা নিশ্চিত করে।
Spring Cloud Contract Testing এর মূল উদ্দেশ্য হলো কনজিউমার এবং প্রোডিউসারের মধ্যে নির্ধারিত চুক্তি লঙ্ঘন না হয় তা নিশ্চিত করা। এটি প্রোডিউসার এবং কনজিউমার উভয়ের জন্যই আলাদা আলাদা পরীক্ষা চালায় এবং মাইক্রোসার্ভিসের মধ্যে সমন্বয় বজায় রাখে।
Spring Cloud Contract Testing প্রোডিউসার এবং কনজিউমারের মধ্যে HTTP বা Messaging প্রোটোকলের ভিত্তিতে কন্ট্রাক্ট তৈরি করে। নিচে কাজের ধাপগুলো দেওয়া হলো:
কন্ট্রাক্ট একটি DSL (Domain Specific Language)-এর মাধ্যমে সংজ্ঞায়িত করা হয়। এই কন্ট্রাক্ট ফাইলটি একটি প্রোডিউসারের প্রত্যাশিত আউটপুট এবং কনজিউমারের প্রত্যাশিত ইনপুট নির্ধারণ করে।
Spring Cloud Contract Verifier ব্যবহার করে প্রোডিউসার সাইডে অটো-জেনারেটেড টেস্ট তৈরি হয়। এটি নিশ্চিত করে যে প্রোডিউসার কন্ট্রাক্ট অনুযায়ী কাজ করছে।
কন্ট্রাক্ট ফাইল থেকে স্টাব তৈরি করা হয়, যা কনজিউমার সাইডে মক ডেটা হিসেবে ব্যবহৃত হয়। এটি কনজিউমার টেস্টিং সহজ করে তোলে।
Contract.make {
description "Should return a user by ID"
request {
method GET()
urlPath '/users/1'
}
response {
status 200
body([
id: 1,
name: "John Doe"
])
headers {
contentType(applicationJson())
}
}
}
উপরের কন্ট্রাক্টটি নির্ধারণ করে যে /users/1
এ GET রিকুয়েস্ট পাঠালে একটি 200 OK
রেসপন্স পাওয়া যাবে, যার মধ্যে একটি JSON অবজেক্ট থাকবে।
Spring Cloud Contract Verifier এই কন্ট্রাক্ট থেকে টেস্ট জেনারেট করবে। উদাহরণস্বরূপ:
@Test
public void validate_shouldReturnUserById() {
// Test logic for producer
RestAssured
.given()
.when()
.get("/users/1")
.then()
.statusCode(200)
.body("name", equalTo("John Doe"));
}
স্টাব জেনারেট করার পর কনজিউমার মক সার্ভিস ব্যবহার করে টেস্ট করতে পারে। উদাহরণ:
@Test
public void shouldReturnUserByIdUsingStub() {
// Mock Server URL
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> response = restTemplate.getForEntity(
"http://localhost:8080/users/1", User.class);
assertEquals(200, response.getStatusCodeValue());
assertEquals("John Doe", response.getBody().getName());
}
Read more