গ্রাফকিউএল (GraphQL) অ্যাপ্লিকেশনের automated testing এবং mocking techniques ব্যবহার করে আপনি আপনার API কুয়েরি এবং মিউটেশনগুলির কার্যকারিতা পরীক্ষা করতে পারেন এবং নিশ্চিত করতে পারেন যে অ্যাপ্লিকেশনটি সঠিকভাবে কাজ করছে। এটি আপনার কোডের মান উন্নত করতে এবং প্রোডাকশনে আসার আগে বাগ সনাক্ত করতে সহায়ক। গ্রাফকিউএল টেস্টিংয়ের জন্য সাধারণভাবে ব্যবহৃত দুটি ধরনের টেস্ট হল Unit Test এবং Integration Test।
এছাড়া, mocking techniques ব্যবহার করে আপনি সার্ভারের সাথে সরাসরি যোগাযোগ না করেই কুয়েরি বা মিউটেশন পরীক্ষা করতে পারেন, যা টেস্টের গতি এবং নির্ভরযোগ্যতা বাড়ায়।
GraphQL এর জন্য Automated Testing
গ্রাফকিউএল অ্যাপ্লিকেশনের জন্য automated testing করার জন্য Jest এবং Apollo Server Testing এর মতো টেস্টিং লাইব্রেরি ব্যবহার করা যেতে পারে।
Unit Test
Unit Testing হল একটি ছোট সেকশন বা ইউনিট (যেমন একটি ফাংশন বা মেথড) আলাদাভাবে পরীক্ষা করা, যাতে তার কার্যকারিতা সঠিকভাবে কাজ করছে কিনা নিশ্চিত করা যায়।
গ্রাফকিউএল অ্যাপ্লিকেশনে, আমরা সাধারণত Resolvers এবং Schema ইউনিট টেস্ট করি।
Unit Test উদাহরণ (Jest ও Apollo Server)
- প্রথমে, Jest ইন্সটল করুন:
npm install --save-dev jest
npm install apollo-server graphql
- Resolver Unit Test উদাহরণ:
ধরা যাক, আমাদের একটি কুয়েরি getUser আছে যা ডেটাবেস থেকে ইউজার তথ্য ফেচ করে। আমরা এটি ইউনিট টেস্ট করতে চাই।
// userResolver.js
const userResolver = {
Query: {
getUser: async (_, { id }) => {
return { id, name: 'John Doe', email: 'john.doe@example.com' };
},
},
};
module.exports = userResolver;
Unit Test (Jest) জন্য:
// userResolver.test.js
const { getUser } = require('./userResolver');
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = require('./userResolver');
const server = new ApolloServer({ typeDefs, resolvers });
describe('getUser resolver', () => {
it('should return a user with correct data', async () => {
const response = await server.executeOperation({
query: `query {
getUser(id: "1") {
id
name
email
}
}`,
});
expect(response.errors).toBeUndefined();
expect(response.data.getUser).toEqual({
id: "1",
name: "John Doe",
email: "john.doe@example.com",
});
});
});
এখানে:
- server.executeOperation ব্যবহার করা হয়েছে গ্রাফকিউএল কুয়েরি এক্সিকিউট করার জন্য।
- আমরা নিশ্চিত করছি যে getUser কুয়েরি সঠিক ডেটা ফিরিয়ে দিচ্ছে।
Integration Test
Integration Testing হল বিভিন্ন সিস্টেম বা কম্পোনেন্ট একসাথে পরীক্ষা করা, যাতে তারা সঠিকভাবে একে অপরের সাথে কাজ করছে কিনা নিশ্চিত করা যায়। গ্রাফকিউএল অ্যাপ্লিকেশনগুলোতে সাধারণত রেজোলভার এবং ডেটাবেস ইন্টিগ্রেশন পরীক্ষা করা হয়।
Integration Test উদাহরণ (Jest ও Apollo Server)
- ডেটাবেস কানেকশন ইন্টিগ্রেশন টেস্ট:
ধরা যাক, আপনি MongoDB বা অন্য কোনো ডেটাবেসের সাথে যুক্ত এবং কুয়েরির মাধ্যমে ডেটা রিটার্ন করছেন। এখন আপনি পুরো ইন্টিগ্রেশন পরীক্ষা করতে চান।
// userResolver.integration.test.js
const { ApolloServer, gql } = require('apollo-server');
const mongoose = require('mongoose');
const { User } = require('./models/user'); // Mongoose Model
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = {
Query: {
getUser: async (_, { id }) => {
return await User.findById(id);
},
},
};
describe('getUser integration test', () => {
beforeAll(async () => {
await mongoose.connect('mongodb://localhost:27017/testdb');
});
afterAll(async () => {
await mongoose.disconnect();
});
it('should fetch user from database', async () => {
const testUser = new User({ name: 'Jane Doe', email: 'jane@example.com' });
await testUser.save();
const server = new ApolloServer({ typeDefs, resolvers });
const response = await server.executeOperation({
query: `query {
getUser(id: "${testUser.id}") {
id
name
email
}
}`,
});
expect(response.errors).toBeUndefined();
expect(response.data.getUser).toEqual({
id: testUser.id,
name: 'Jane Doe',
email: 'jane@example.com',
});
});
});
এখানে:
- MongoDB ইন্টিগ্রেশন টেস্ট করা হচ্ছে। আমরা একটি ইউজার তৈরি করছি এবং তারপরে গ্রাফকিউএল কুয়েরির মাধ্যমে সেই ডেটা যাচাই করছি।
Mocking Techniques in GraphQL Testing
Mocking একটি শক্তিশালী পদ্ধতি যা টেস্টিংয়ের জন্য বাইরের নির্ভরতা (যেমন ডেটাবেস বা তৃতীয় পক্ষের API) অঙ্গীকার না করে কেবল নির্দিষ্ট ফাংশন বা রেজোলভার পরীক্ষা করতে সহায়ক।
Mocking উদাহরণ:
- GraphQL Resolver Mocking:
// userResolver.test.js
const { ApolloServer, gql } = require('apollo-server');
const { User } = require('./models/user');
// Mocking the User model
jest.mock('./models/user');
const mockedUser = { id: "1", name: "John Doe", email: "john.doe@example.com" };
User.findById = jest.fn().mockResolvedValue(mockedUser);
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = {
Query: {
getUser: async (_, { id }) => {
return await User.findById(id);
},
},
};
const server = new ApolloServer({ typeDefs, resolvers });
describe('getUser resolver with Mocking', () => {
it('should return mocked user data', async () => {
const response = await server.executeOperation({
query: `query {
getUser(id: "1") {
id
name
email
}
}`,
});
expect(response.errors).toBeUndefined();
expect(response.data.getUser).toEqual(mockedUser);
});
});
এখানে:
- jest.mock ব্যবহার করে
User.findByIdমক করা হয়েছে, যা ডেটাবেসের সাথে যোগাযোগ না করেই মক ডেটা ফেরত দেবে।
- Mocking External API in GraphQL
যখন আপনার গ্রাফকিউএল API একটি বাহ্যিক API থেকে ডেটা ফেচ করে, তখন আপনি সেই API কে মক করতে পারেন।
// mocking an external API in resolver
const axios = require('axios');
jest.mock('axios');
const resolver = {
Query: {
getExternalData: async () => {
const response = await axios.get('https://api.example.com/data');
return response.data;
},
},
};
এখানে:
- axios মক করা হয়েছে যাতে বাহ্যিক API কলকে হ্যান্ডল না করে, এক্ষেত্রে শুধুমাত্র মক ডেটা ফেরত দেয়।
সারাংশ
Automated Testing এবং Mocking Techniques গ্রাফকিউএল অ্যাপ্লিকেশনে কোডের বিশ্বাসযোগ্যতা এবং মান নিশ্চিত করতে অপরিহার্য। Unit Test এবং Integration Test গ্রাফকিউএল রেজোলভার এবং স্কিমা পরীক্ষা করতে ব্যবহৃত হয়, এবং Mocking বাইরের নির্ভরশীলতাকে মক করে দ্রুত এবং নির্ভরযোগ্য টেস্টিং করতে সাহায্য করে। Jest, Apollo Server এবং graphql-upload এর মতো টুলগুলি ব্যবহার করে আপনি গ্রাফকিউএল অ্যাপ্লিকেশনটির পরীক্ষা সহজ এবং কার্যকরভাবে পরিচালনা করতে পারেন।
Read more