গ্রাফকিউএল (GraphQL) এর জন্য Unit Test এবং Integration Test অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি আপনার GraphQL API-এর ফাংশনালিটি, রেজোলভার, স্কিমা এবং সার্ভারের অন্যান্য অংশ সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে সাহায্য করে। এই টেস্টগুলির মাধ্যমে আপনি কোডের মান, স্থায়িত্ব এবং নিরাপত্তা নিশ্চিত করতে পারেন। GraphQL-এর জন্য টেস্ট লেখার সময়, সাধারণভাবে Apollo Server, Jest, এবং Supertest ব্যবহার করা হয়।
Unit Testing in GraphQL
Unit Testing এমন একটি টেস্টিং পদ্ধতি যেখানে কোডের একটি নির্দিষ্ট অংশ (ফাংশন বা মেথড) এককভাবে পরীক্ষা করা হয়। এটি সাধারণত কেবলমাত্র একটি ছোট ইউনিট, যেমন একটি রেজোলভার, একটি ফাংশন, বা একটি মডেল পরীক্ষা করে।
Unit Test Setup for GraphQL
- Jest: একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা JavaScript কোডের ইউনিট টেস্টিং করতে ব্যবহৃত হয়।
- Apollo Server Testing: Apollo Server-এ সরাসরি রেজোলভার টেস্ট করার জন্য
ApolloServerইনস্ট্যান্স এবংgqlব্যবহার করা হয়।
Unit Test Example for a GraphQL Resolver
ধরা যাক, আপনি একটি User রেজোলভার পরীক্ষা করতে চান, যা ইউজারদের তথ্য ফেরত দেয়। এখানে একটি ইউনিট টেস্টের উদাহরণ দেওয়া হলো:
- প্রথমে, Jest এবং Apollo Server ইনস্টল করুন:
npm install jest apollo-server graphql
- এবার resolver তৈরি করুন, যা
usersনামক একটি কুয়েরি পরিচালনা করবে:
// resolvers.js
const users = [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Smith' }
];
const resolvers = {
Query: {
users: () => users,
},
};
module.exports = resolvers;
- এখন, Unit Test তৈরি করুন:
// resolvers.test.js
const { ApolloServer, gql } = require('apollo-server');
const resolvers = require('./resolvers');
// Create an Apollo Server instance for testing
const server = new ApolloServer({
typeDefs: gql`
type Query {
users: [User]
}
type User {
id: ID
name: String
}
`,
resolvers,
});
describe('GraphQL Resolvers', () => {
it('fetches users correctly', async () => {
const response = await server.executeOperation({
query: gql`
query {
users {
id
name
}
}
`,
});
expect(response.errors).toBeUndefined();
expect(response.data.users).toHaveLength(2);
expect(response.data.users[0].name).toBe('John Doe');
expect(response.data.users[1].name).toBe('Jane Smith');
});
});
এখানে:
- ApolloServer এবং Jest ব্যবহার করে একটি ইউনিট টেস্ট তৈরি করা হয়েছে, যেখানে
usersকুয়েরি সঠিকভাবে কাজ করছে কিনা তা যাচাই করা হচ্ছে। - executeOperation ব্যবহার করে কুয়েরি চালানো হয়েছে এবং তারপর
expectদিয়ে ফলাফল যাচাই করা হচ্ছে।
Integration Testing in GraphQL
Integration Testing হল একাধিক সিস্টেম বা উপাদান একসাথে কাজ করছে কিনা তা পরীক্ষা করা। গ্রাফকিউএল-এর জন্য এটি সাধারণত সার্ভারের সাথে পুরো এক্সেস করার মাধ্যমে করা হয়, যেখানে API-এর রেজোলভার, স্কিমা এবং ডেটাবেস সঠিকভাবে ইন্টিগ্রেটেড কিনা তা পরীক্ষা করা হয়।
Integration Test Example for GraphQL
ধরা যাক, আপনার GraphQL সার্ভার একটি ডেটাবেসের সাথে সংযুক্ত, এবং আপনি একটি createUser মিউটেশন টেস্ট করতে চান যা একটি নতুন ইউজার তৈরি করবে।
- Database Mocking: আপনার ডেটাবেস কলের জন্য একটি মক তৈরি করুন যাতে টেস্টটি সঠিকভাবে কাজ করে। আপনি mongoose বা অন্য কোনো ORM ব্যবহার করছেন বলে ধরে নিচ্ছি।
- Integration Test Setup:
npm install jest apollo-server graphql mongoose
- Integration Test Example:
// server.js
const { ApolloServer, gql } = require('apollo-server');
const mongoose = require('mongoose');
const typeDefs = gql`
type Query {
users: [User]
}
type Mutation {
createUser(name: String!): User
}
type User {
id: ID
name: String
}
`;
const User = mongoose.model('User', new mongoose.Schema({
name: String,
}));
const resolvers = {
Query: {
users: () => User.find(),
},
Mutation: {
createUser: (_, { name }) => {
const newUser = new User({ name });
return newUser.save();
},
},
};
// Apollo Server instance
const server = new ApolloServer({ typeDefs, resolvers });
module.exports = server;
- Testing the Integration:
// server.test.js
const { ApolloServer, gql } = require('apollo-server');
const mongoose = require('mongoose');
const server = require('./server');
beforeAll(async () => {
await mongoose.connect('mongodb://localhost/testdb', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
});
afterAll(async () => {
await mongoose.connection.close();
});
describe('GraphQL Integration Tests', () => {
it('creates a new user', async () => {
const createUserMutation = gql`
mutation {
createUser(name: "John Doe") {
id
name
}
}
`;
const response = await server.executeOperation({ query: createUserMutation });
expect(response.errors).toBeUndefined();
expect(response.data.createUser.name).toBe('John Doe');
expect(response.data.createUser.id).toBeDefined();
// Verify that the user was added to the database
const user = await mongoose.model('User').findById(response.data.createUser.id);
expect(user).toBeDefined();
expect(user.name).toBe('John Doe');
});
});
এখানে:
- একটি MongoDB ডেটাবেস মক তৈরি করা হয়েছে যা mongoose এর মাধ্যমে সংযুক্ত।
- Integration Test একটি নতুন ইউজার তৈরি করার জন্য
createUserমিউটেশন পরীক্ষা করছে এবং ডেটাবেসে ডেটা সঠিকভাবে সংরক্ষিত হচ্ছে কিনা তা যাচাই করছে।
Testing Best Practices for GraphQL
- Mocking External Services: আপনি যখন গ্রাফকিউএল সার্ভারে বাইরের সেবা বা ডেটাবেস ব্যবহার করেন, তখন এক্সটার্নাল সার্ভিসগুলি মক করতে পারেন, যেমন মক ডেটাবেস কল বা থার্ড-পার্টি API কল। এটি পরীক্ষার কার্যকারিতা বাড়ায় এবং নির্ভরশীলতা কমায়।
- Test Resolvers in Isolation: রেজোলভারগুলিকে একে একে টেস্ট করা উচিত, যাতে কোনো নির্দিষ্ট রেজোলভার বা কুয়েরি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়।
- Use Test Environments: টেস্টিংয়ের জন্য একটি আলাদা পরিবেশ (যেমন একটি ডেটাবেস বা সার্ভার) ব্যবহার করুন যাতে প্রোডাকশন পরিবেশের সাথে কোনো সমস্যা না হয়।
- Edge Cases: সব ধরনের ইনপুট এবং এর্রর কন্ডিশন পরীক্ষা করুন, যেমন ভুল ইনপুট, নাল ডেটা, এবং মিসিং প্যারামিটার।
সারাংশ
গ্রাফকিউএল এর জন্য Unit Testing এবং Integration Testing নিশ্চিত করে যে আপনার API এবং সার্ভারের প্রতিটি অংশ সঠিকভাবে কাজ করছে। Unit Testing রেজোলভার বা ফাংশনগুলিকে পৃথকভাবে পরীক্ষা করে, এবং Integration Testing পুরো সার্ভার এবং ডেটাবেস ইন্টিগ্রেশন যাচাই করে। Jest, Apollo Server, এবং Supertest-এর মাধ্যমে এই টেস্টিং পদ্ধতি কার্যকরভাবে বাস্তবায়ন করা যায়।
Read more