GraphQL Testing এবং Debugging

গ্রাফকিউএল (GraphQL) - Web Development

262

গ্রাফকিউএল (GraphQL) API তৈরি এবং পরিচালনা করার সময় Testing এবং Debugging অত্যন্ত গুরুত্বপূর্ণ। এটি নিশ্চিত করে যে আপনার কুয়েরি এবং মিউটেশনগুলি সঠিকভাবে কাজ করছে, এবং কোনও ত্রুটি বা ব্যতিক্রম সনাক্ত করা সহজ হয়। এখানে গ্রাফকিউএল API-এর Testing এবং Debugging প্রক্রিয়া সম্পর্কে বিস্তারিত আলোচনা করা হলো।


GraphQL Testing (গ্রাফকিউএল টেস্টিং)

গ্রাফকিউএল টেস্টিং মূলত API-এর কার্যকারিতা যাচাই করতে ব্যবহৃত হয়। এতে বিভিন্ন কুয়েরি, মিউটেশন, এবং সাবস্ক্রিপশনের পরীক্ষামূলক কার্যক্রম অন্তর্ভুক্ত থাকে।

1. Testing Frameworks for GraphQL

গ্রাফকিউএল এর জন্য বেশ কিছু জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক এবং লাইব্রেরি রয়েছে, যেমন:

  • Jest: এটি একটি বিস্তৃত টেস্টিং ফ্রেমওয়ার্ক যা গ্রাফকিউএল API টেস্টিং এর জন্য খুবই জনপ্রিয়। এটি সহজে ইনস্টল করা যায় এবং অটো-মকিং, অ্যাসিনক্রোনাস টেস্টিং সহ বিভিন্ন ফিচার সরবরাহ করে।
  • Mocha + Chai: Mocha হল একটি টেস্টিং ফ্রেমওয়ার্ক, এবং Chai একটি assertion লাইব্রেরি যা গ্রাফকিউএল API এর টেস্টিং করতে সহায়ক।

2. Testing Queries and Mutations

গ্রাফকিউএল কুয়েরি এবং মিউটেশন টেস্ট করার জন্য, আমরা সাধারণত সার্ভারের রেসপন্স যাচাই করি। নিচে Jest ব্যবহার করে একটি সাধারণ কুয়েরি টেস্টের উদাহরণ দেওয়া হলো:

const { ApolloServer, gql } = require('apollo-server');
const axios = require('axios');

// Define a simple GraphQL schema
const typeDefs = gql`
  type Query {
    getUser(id: ID!): User
  }

  type User {
    id: ID!
    name: String!
    email: String!
  }
`;

const resolvers = {
  Query: {
    getUser: async (_, { id }) => {
      const response = await axios.get(`https://api.example.com/users/${id}`);
      return response.data;
    }
  }
};

// Create Apollo Server
const server = new ApolloServer({ typeDefs, resolvers });

// Test using Jest
describe('GraphQL API', () => {
  it('fetches user data', async () => {
    const result = await server.executeOperation({
      query: gql`
        query GetUser($id: ID!) {
          getUser(id: $id) {
            id
            name
            email
          }
        }
      `,
      variables: { id: '123' }
    });

    expect(result.errors).toBeUndefined();
    expect(result.data.getUser).toEqual({
      id: '123',
      name: 'John Doe',
      email: 'john.doe@example.com'
    });
  });
});

এখানে:

  • server.executeOperation ব্যবহার করা হয়েছে কুয়েরি চালানোর জন্য।
  • expect ব্যবহার করে রেসপন্স পরীক্ষা করা হচ্ছে, যে এটি সঠিক ডেটা ফিরিয়ে দিয়েছে কিনা।

3. Testing Errors

আপনি যে সমস্ত পাথওয়ে বা কুয়েরির জন্য ভুল ডেটা পাঠাচ্ছেন, সেগুলি টেস্ট করতে পারেন। নিচে একটি মিউটেশন টেস্টিং উদাহরণ:

describe('GraphQL Mutation', () => {
  it('throws error when user ID is missing', async () => {
    const result = await server.executeOperation({
      query: gql`
        mutation CreateUser($name: String!, $email: String!) {
          createUser(name: $name, email: $email) {
            id
            name
            email
          }
        }
      `,
      variables: { name: 'Alice', email: 'alice@example.com' }
    });

    expect(result.errors).toBeDefined();
    expect(result.errors[0].message).toBe('User ID is required');
  });
});

এখানে:

  • result.errors চেক করা হচ্ছে যে মিউটেশনটি ত্রুটি সৃষ্টি করেছে কিনা।

GraphQL Debugging (গ্রাফকিউএল ডিবাগিং)

গ্রাফকিউএল ডিবাগিং সিস্টেমের ত্রুটি সনাক্ত এবং সমস্যা সমাধানে সহায়ক। আপনি বিভিন্ন উপায়ে গ্রাফকিউএল API ডিবাগ করতে পারেন।

1. Enabling Debugging in Apollo Server

Apollo Server তে ডিবাগging সক্ষম করার জন্য logging এবং error formatting ফিচারগুলো ব্যবহার করা যেতে পারে। Apollo Server এর debug মোড ব্যবহার করে আপনি রিকোয়েস্ট এবং রেসপন্সের তথ্য দেখতে পারেন।

const server = new ApolloServer({
  typeDefs,
  resolvers,
  formatError: (err) => {
    console.error(err);
    return err;
  },
  introspection: true, // Allows introspection of schema
  playground: true // GraphQL Playground for querying directly
});

এখানে:

  • formatError ব্যবহৃত হচ্ছে, যা সার্ভারের ত্রুটিগুলিকে লগ করতে সহায়ক।
  • playground সক্রিয় করা হয়েছে, যাতে আপনি সরাসরি গ্রাফকিউএল কুয়েরি পাঠাতে পারেন এবং তার ফলাফল দেখতে পারেন।

2. Error Logging

যখন কোনও ত্রুটি ঘটে, আপনি console.error বা একটি লগিং লাইব্রেরি ব্যবহার করে ডিবাগিং তথ্য পেতে পারেন। এটি সার্ভারে ত্রুটি সনাক্ত করতে সহায়ক হবে।

const { ApolloServer, gql } = require('apollo-server');
const { AuthenticationError } = require('apollo-server');

// Example of error handling with logging
const typeDefs = gql`
  type Query {
    getUser(id: ID!): User
  }

  type User {
    id: ID!
    name: String!
    email: String!
  }
`;

const resolvers = {
  Query: {
    getUser: async (_, { id }) => {
      try {
        const user = await fetchUserById(id); // Hypothetical function to fetch user
        if (!user) {
          throw new AuthenticationError('User not found');
        }
        return user;
      } catch (error) {
        console.error('Error fetching user:', error);
        throw error;
      }
    }
  }
};

const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

এখানে:

  • AuthenticationError ব্যবহার করা হয়েছে, যখন ইউজারের তথ্য পাওয়া যায় না।
  • console.error দ্বারা ত্রুটির তথ্য লগ করা হচ্ছে।

3. Apollo Studio for Debugging

Apollo Studio একটি শক্তিশালী টুল যা গ্রাফকিউএল API-এর query performance, errors, এবং tracing সম্পর্কে বিস্তারিত ডেটা প্রদান করে। এটি আপনাকে সার্ভারের পারফরম্যান্স পরীক্ষা করতে এবং প্রয়োজনে অপটিমাইজেশন করতে সহায়ক।


4. Using GraphQL Playground or GraphiQL

GraphQL Playground বা GraphiQL গ্রাফকিউএল কুয়েরি লেখার এবং ত্রুটি পরীক্ষা করার জন্য একটি ইন্টারেকটিভ প্ল্যাটফর্ম। এই প্ল্যাটফর্মগুলো ডেভেলপারদের কুয়েরি পাঠাতে, ফলাফল দেখতে এবং ত্রুটির বার্তা বুঝতে সাহায্য করে।

GraphQL Playground:

  • এটি সরাসরি সার্ভার থেকে কুয়েরি করতে সহায়ক এবং রিয়েল-টাইম ফলাফল প্রদান করে।
  • ত্রুটি এবং সফল কুয়েরি ফলাফল সরাসরি UI-তে দেখায়, যা ডিবাগিং এবং টেস্টিংকে সহজ করে তোলে।

সারাংশ

গ্রাফকিউএল API-এর Testing এবং Debugging দুটি অত্যন্ত গুরুত্বপূর্ণ প্রক্রিয়া যা সঠিকভাবে কাজ নিশ্চিত করতে সাহায্য করে। Jest এবং Mocha এর মতো টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে আপনি কুয়েরি এবং মিউটেশনগুলি পরীক্ষা করতে পারেন, এবং Apollo Server তে ডিবাগিং টুলস (যেমন error logging, Apollo Studio) ব্যবহার করে ত্রুটি সনাক্ত এবং সমাধান করতে পারেন। GraphQL Playground বা GraphiQL ব্যবহার করলে ইন্টারেক্টিভ ডিবাগিং এবং কুয়েরি টেস্টিং আরও সহজ হয়ে ওঠে।

Content added By

গ্রাফকিউএল (GraphQL) এর জন্য Unit Test এবং Integration Test অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি আপনার GraphQL API-এর ফাংশনালিটি, রেজোলভার, স্কিমা এবং সার্ভারের অন্যান্য অংশ সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে সাহায্য করে। এই টেস্টগুলির মাধ্যমে আপনি কোডের মান, স্থায়িত্ব এবং নিরাপত্তা নিশ্চিত করতে পারেন। GraphQL-এর জন্য টেস্ট লেখার সময়, সাধারণভাবে Apollo Server, Jest, এবং Supertest ব্যবহার করা হয়।


Unit Testing in GraphQL

Unit Testing এমন একটি টেস্টিং পদ্ধতি যেখানে কোডের একটি নির্দিষ্ট অংশ (ফাংশন বা মেথড) এককভাবে পরীক্ষা করা হয়। এটি সাধারণত কেবলমাত্র একটি ছোট ইউনিট, যেমন একটি রেজোলভার, একটি ফাংশন, বা একটি মডেল পরীক্ষা করে।

Unit Test Setup for GraphQL

  1. Jest: একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা JavaScript কোডের ইউনিট টেস্টিং করতে ব্যবহৃত হয়।
  2. Apollo Server Testing: Apollo Server-এ সরাসরি রেজোলভার টেস্ট করার জন্য ApolloServer ইনস্ট্যান্স এবং gql ব্যবহার করা হয়।

Unit Test Example for a GraphQL Resolver

ধরা যাক, আপনি একটি User রেজোলভার পরীক্ষা করতে চান, যা ইউজারদের তথ্য ফেরত দেয়। এখানে একটি ইউনিট টেস্টের উদাহরণ দেওয়া হলো:

  1. প্রথমে, Jest এবং Apollo Server ইনস্টল করুন:
npm install jest apollo-server graphql
  1. এবার resolver তৈরি করুন, যা users নামক একটি কুয়েরি পরিচালনা করবে:
// resolvers.js
const users = [
  { id: 1, name: 'John Doe' },
  { id: 2, name: 'Jane Smith' }
];

const resolvers = {
  Query: {
    users: () => users,
  },
};

module.exports = resolvers;
  1. এখন, 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 মিউটেশন টেস্ট করতে চান যা একটি নতুন ইউজার তৈরি করবে।

  1. Database Mocking: আপনার ডেটাবেস কলের জন্য একটি মক তৈরি করুন যাতে টেস্টটি সঠিকভাবে কাজ করে। আপনি mongoose বা অন্য কোনো ORM ব্যবহার করছেন বলে ধরে নিচ্ছি।
  2. Integration Test Setup:
npm install jest apollo-server graphql mongoose
  1. 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;
  1. 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

  1. Mocking External Services: আপনি যখন গ্রাফকিউএল সার্ভারে বাইরের সেবা বা ডেটাবেস ব্যবহার করেন, তখন এক্সটার্নাল সার্ভিসগুলি মক করতে পারেন, যেমন মক ডেটাবেস কল বা থার্ড-পার্টি API কল। এটি পরীক্ষার কার্যকারিতা বাড়ায় এবং নির্ভরশীলতা কমায়।
  2. Test Resolvers in Isolation: রেজোলভারগুলিকে একে একে টেস্ট করা উচিত, যাতে কোনো নির্দিষ্ট রেজোলভার বা কুয়েরি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়।
  3. Use Test Environments: টেস্টিংয়ের জন্য একটি আলাদা পরিবেশ (যেমন একটি ডেটাবেস বা সার্ভার) ব্যবহার করুন যাতে প্রোডাকশন পরিবেশের সাথে কোনো সমস্যা না হয়।
  4. Edge Cases: সব ধরনের ইনপুট এবং এর্রর কন্ডিশন পরীক্ষা করুন, যেমন ভুল ইনপুট, নাল ডেটা, এবং মিসিং প্যারামিটার।

সারাংশ

গ্রাফকিউএল এর জন্য Unit Testing এবং Integration Testing নিশ্চিত করে যে আপনার API এবং সার্ভারের প্রতিটি অংশ সঠিকভাবে কাজ করছে। Unit Testing রেজোলভার বা ফাংশনগুলিকে পৃথকভাবে পরীক্ষা করে, এবং Integration Testing পুরো সার্ভার এবং ডেটাবেস ইন্টিগ্রেশন যাচাই করে। Jest, Apollo Server, এবং Supertest-এর মাধ্যমে এই টেস্টিং পদ্ধতি কার্যকরভাবে বাস্তবায়ন করা যায়।

Content added By

GraphQL এবং Apollo Server এর জন্য Jest টেস্টিং ব্যবহারের মাধ্যমে আপনি আপনার সার্ভারের কনফিগারেশন, রেজোলভার ফাংশন, এবং গ্রাফকিউএল স্কিমার বিভিন্ন অংশের কাজ সঠিকভাবে হচ্ছে কিনা তা নিশ্চিত করতে পারেন। Jest হল একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা JavaScript অ্যাপ্লিকেশন এবং APIs টেস্ট করতে ব্যবহার করা হয়। Apollo Server এর সঙ্গে Jest ব্যবহার করে আপনি GraphQL কুয়েরি এবং মিউটেশন টেস্ট করতে পারেন।

এখানে Jest এবং Apollo Server ব্যবহার করে GraphQL API টেস্টিং করার প্রক্রিয়া ব্যাখ্যা করা হচ্ছে।


ধাপ ১: প্রয়োজনীয় প্যাকেজ ইনস্টল করা

প্রথমে, আপনি Jest, Apollo Server, এবং graphql-tools ইন্সটল করতে হবে।

npm install --save-dev jest apollo-server graphql @graphql-tools/mock

এখানে:

  • Jest: টেস্টিং ফ্রেমওয়ার্ক।
  • Apollo Server: গ্রাফকিউএল সার্ভার তৈরি করার জন্য।
  • graphql: গ্রাফকিউএল লাইব্রেরি।
  • @graphql-tools/mock: মক ডেটা তৈরি করার জন্য ব্যবহৃত হবে, যাতে আপনি টেস্টিংয়ের সময় ডেটা মক করতে পারেন।

ধাপ ২: Apollo Server সেটআপ করা

এখন, একটি সাধারণ Apollo Server এবং GraphQL স্কিমা তৈরি করি।

// src/index.js
const { ApolloServer, gql } = require('apollo-server');

// Define your GraphQL schema
const typeDefs = gql`
  type Query {
    hello: String
    getUser(id: ID!): User
  }

  type User {
    id: ID
    name: String
    email: String
  }
`;

// Sample resolver functions
const resolvers = {
  Query: {
    hello: () => "Hello, World!",
    getUser: (_, { id }) => {
      // Mock user data
      return { id, name: "John Doe", email: "john@example.com" };
    }
  }
};

// Create Apollo Server instance
const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

এখানে:

  • আমরা একটি সাধারণ GraphQL স্কিমা তৈরি করেছি যা দুটি কুয়েরি, hello এবং getUser প্রদান করছে।
  • getUser কুয়েরি একটি ইউজার আইডি নিয়ে ইউজারের তথ্য ফিরিয়ে দেয়।

ধাপ ৩: Apollo Server এর জন্য টেস্ট সেটআপ করা

Jest এর মাধ্যমে Apollo Server এর API টেস্ট করার জন্য আমরা apollo-server-testing প্যাকেজ ব্যবহার করব। এই প্যাকেজটি গ্রাফকিউএল কুয়েরি এবং মিউটেশন টেস্ট করতে সহায়ক।

npm install --save-dev apollo-server-testing

এখন, আপনি একটি test ফোল্ডার তৈরি করতে পারেন এবং তার মধ্যে একটি টেস্ট ফাইল তৈরি করতে পারেন।

// src/__tests__/server.test.js
const { ApolloServer, gql } = require('apollo-server');
const { createTestClient } = require('apollo-server-testing');
const { typeDefs, resolvers } = require('../index'); // Import your GraphQL schema and resolvers

// Create a new instance of ApolloServer for testing
const server = new ApolloServer({ typeDefs, resolvers });

// Use createTestClient to simulate GraphQL requests
const { query, mutate } = createTestClient(server);

describe('GraphQL API', () => {
  it('fetches a hello message', async () => {
    const res = await query({ query: gql`{ hello }` });
    expect(res.data.hello).toBe("Hello, World!");
  });

  it('fetches user data by ID', async () => {
    const res = await query({
      query: gql`
        query {
          getUser(id: "1") {
            id
            name
            email
          }
        }
      `
    });

    expect(res.data.getUser.id).toBe("1");
    expect(res.data.getUser.name).toBe("John Doe");
    expect(res.data.getUser.email).toBe("john@example.com");
  });

  it('handles missing user data', async () => {
    const res = await query({
      query: gql`
        query {
          getUser(id: "999") {
            id
            name
            email
          }
        }
      `
    });
    expect(res.errors).toBeDefined();
    expect(res.errors[0].message).toBe('User not found');
  });
});

কোড ব্যাখ্যা:

  1. ApolloServer এবং TestClient:
    • আমরা ApolloServer এর একটি ইনস্ট্যান্স তৈরি করেছি এবং createTestClient ব্যবহার করে গ্রাফকিউএল কুয়েরি বা মিউটেশন সিমুলেট করেছি। এটি টেস্টিং প্রক্রিয়া অনেক সহজ করে দেয়।
  2. Jest Test Cases:
    • it('fetches a hello message'): এখানে আমরা hello কুয়েরি টেস্ট করেছি।
    • it('fetches user data by ID'): এখানে আমরা getUser কুয়েরি টেস্ট করেছি এবং একটি ইউজারের ডেটা যাচাই করেছি।
    • it('handles missing user data'): এখানে আমরা একটি নিষ্ক্রিয় বা অনুপস্থিত ইউজার টেস্ট করেছি এবং নিশ্চিত করেছি যে এটি ত্রুটি ফেরত দেয়।

ধাপ ৪: টেস্ট চালানো

এখন, আপনার টেস্ট ফাইলগুলো রান করতে, নিচের কমান্ডটি ব্যবহার করুন:

npm test

Jest আপনার টেস্টগুলো চালাবে এবং টেস্ট কেসগুলির ফলাফল আপনাকে দেখাবে। যদি সমস্ত টেস্ট সফল হয়, তবে আপনি আপনার GraphQL API-এর কার্যকারিতা সঠিকভাবে যাচাই করতে পারবেন।


ফাইল মকিং এবং মক ডেটা (Mocking)

আপনি যদি কোনো ডেটাবেস বা বাহ্যিক API ব্যবহার না করেন, তবে @graphql-tools/mock প্যাকেজ ব্যবহার করে মক ডেটা তৈরি করতে পারেন, যা আপনাকে সরাসরি ডেটা ম্যানিপুলেশন করতে দেয়।

const { makeExecutableSchema } = require('@graphql-tools/schema');
const { mockServer } = require('@graphql-tools/mock');

// Mock server setup
const mockServer = mockServer(typeDefs);

describe('Mock Server Test', () => {
  it('should return mocked user data', async () => {
    const res = await mockServer.query({
      query: gql`
        query {
          getUser(id: "1") {
            id
            name
            email
          }
        }
      `
    });

    expect(res.data.getUser.id).toBeDefined();
    expect(res.data.getUser.name).toBeDefined();
    expect(res.data.getUser.email).toBeDefined();
  });
});

এখানে, আপনি mockServer ব্যবহার করে মক ডেটা ফেরত পাচ্ছেন যা ডেটাবেসের প্রয়োজনীয়তা ছাড়াই টেস্টিং কার্যকরী করে।


সারাংশ

Jest এবং Apollo Server ব্যবহার করে আপনি আপনার GraphQL API-র কুয়েরি, মিউটেশন এবং রেজোলভারগুলি সহজেই টেস্ট করতে পারেন। Apollo Server এবং graphql-upload প্যাকেজ ব্যবহারের মাধ্যমে আপনি ফাইল আপলোড টেস্টিংও করতে পারেন। Jest-এর সাথে mocking, error handling, এবং integration testing এর মাধ্যমে আপনার API-এর কার্যকারিতা সঠিকভাবে পরীক্ষা করা সম্ভব।

Content added By

গ্রাফকিউএল (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)

  1. প্রথমে, Jest ইন্সটল করুন:
npm install --save-dev jest
npm install apollo-server graphql
  1. 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)

  1. ডেটাবেস কানেকশন ইন্টিগ্রেশন টেস্ট:

ধরা যাক, আপনি 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 উদাহরণ:

  1. 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 মক করা হয়েছে, যা ডেটাবেসের সাথে যোগাযোগ না করেই মক ডেটা ফেরত দেবে।
  1. 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 এর মতো টুলগুলি ব্যবহার করে আপনি গ্রাফকিউএল অ্যাপ্লিকেশনটির পরীক্ষা সহজ এবং কার্যকরভাবে পরিচালনা করতে পারেন।

Content added By

গ্রাফকিউএল (GraphQL) একটি শক্তিশালী API ভাষা যা ডেটা ক্লায়েন্ট থেকে সার্ভারে পৌঁছানোর জন্য একটি সুনির্দিষ্ট এবং কাঠামোগত পদ্ধতি প্রদান করে। তবে, গ্রাফকিউএল কুয়েরি বা স্কিমা সঠিকভাবে কাজ করার জন্য কিছু validation প্রয়োজন, যা ডেটার সঠিকতা এবং সার্ভারের নিরাপত্তা নিশ্চিত করে। এই প্রবন্ধে আমরা গ্রাফকিউএল কুয়েরি এবং স্কিমার জন্য validation সম্পর্কিত ধারণা এবং টেকনিক্যাল পদ্ধতিগুলি আলোচনা করব।


GraphQL Query Validation

GraphQL Query Validation হল সেই প্রক্রিয়া, যার মাধ্যমে নিশ্চিত করা হয় যে ক্লায়েন্টের পাঠানো কুয়েরি সঠিকভাবে তৈরি হয়েছে এবং এটি গ্রাফকিউএল স্কিমার সাথে মেলে। সাধারণত, গ্রাফকিউএল সার্ভার নিজেই কুয়েরির syntax এবং structure যাচাই করে, তবে কিছু অতিরিক্ত কাস্টম ভ্যালিডেশন প্রয়োগ করা যেতে পারে যাতে ডেটার সঠিকতা নিশ্চিত করা যায়।

1. Built-in Query Validation

গ্রাফকিউএল সার্ভারের মধ্যে কিছু বিল্ট-ইন কুয়েরি ভ্যালিডেশন সুবিধা রয়েছে:

  • Syntax Validation: গ্রাফকিউএল সার্ভার কুয়েরি সিনট্যাক্স যাচাই করে। যদি কুয়েরি ভুল সিনট্যাক্সে থাকে, তবে এটি একটি ত্রুটি (error) প্রদান করবে।
  • Schema Validation: গ্রাফকিউএল স্কিমার বিরুদ্ধে কুয়েরি যাচাই করা হয়। সার্ভারটি শুধুমাত্র স্কিমায় সংজ্ঞায়িত ফিল্ড এবং টাইপগুলির সাথে মিল রেখে কুয়েরি পরিচালনা করতে সক্ষম হয়।

2. Custom Query Validation

কিছু সময়ে, গ্রাফকিউএল কুয়েরির জন্য অতিরিক্ত কাস্টম ভ্যালিডেশন প্রয়োজন হতে পারে। যেমন:

  • Permission Checks: ইউজার যদি কোনো রিসোর্স অ্যাক্সেস করতে চায়, তবে তার অনুমতি চেক করতে হবে।
  • Complex Query Detection: কিছু কুয়েরি অত্যন্ত জটিল হতে পারে, যা সার্ভারের ওপর অতিরিক্ত চাপ ফেলতে পারে। অতএব, এ ধরনের কুয়েরি প্রতিরোধ করার জন্য একটি কাস্টম ভ্যালিডেশন বাস্তবায়ন করা যেতে পারে।

3. Example: Validating Query Parameters

ধরা যাক, একটি কুয়েরি একটি User ডেটা ফেরত আনে, এবং এটি শুধুমাত্র userId অনুসারে ডেটা অ্যাক্সেস করতে পারে। এর জন্য একটি কাস্টম ভ্যালিডেশন ব্যবহার করা যেতে পারে:

const { GraphQLObjectType, GraphQLSchema, GraphQLString, GraphQLInt } = require('graphql');
const { AuthenticationError } = require('apollo-server');

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: GraphQLInt },
    name: { type: GraphQLString },
  },
});

const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: {
    user: {
      type: UserType,
      args: { id: { type: GraphQLInt } },
      resolve(parent, args) {
        if (!args.id) {
          throw new AuthenticationError('User ID is required');
        }
        // Fetch user data based on id
        return { id: args.id, name: 'John Doe' };
      },
    },
  },
});

const Mutation = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    updateUser: {
      type: UserType,
      args: {
        id: { type: GraphQLInt },
        name: { type: GraphQLString },
      },
      resolve(parent, args) {
        if (!args.name) {
          throw new Error('Name is required');
        }
        // Update user data
        return { id: args.id, name: args.name };
      },
    },
  },
});

const schema = new GraphQLSchema({
  query: RootQuery,
  mutation: Mutation,
});

module.exports = schema;

এখানে:

  • User Validation: user কুয়েরি চলানোর সময়, যদি userId না দেওয়া হয়, তবে একটি ত্রুটি সৃষ্ট হবে এবং গ্রাফকিউএল সার্ভার ইউজারকে সেই তথ্য দেবেনা।

GraphQL Schema Validation

GraphQL Schema Validation হল সেই প্রক্রিয়া, যেখানে সার্ভারের স্কিমা সঠিকভাবে সংজ্ঞায়িত হয়েছে কিনা তা নিশ্চিত করা হয়। স্কিমার মধ্যে ডেটার ধরণ, সম্পর্ক এবং কোয়েরি/মিউটেশন ফিল্ড সঠিকভাবে যুক্ত হয়েছে কিনা তা যাচাই করা হয়।

1. Built-in Schema Validation

গ্রাফকিউএল স্কিমা সঠিকভাবে লিখিত কিনা তা যাচাই করার জন্য গ্রাফকিউএল নিজে কিছু বিল্ট-ইন ভ্যালিডেশন প্রদান করে। যেমন:

  • Type Validation: গ্রাফকিউএল স্কিমায় প্রতিটি ফিল্ডের জন্য ডেটা টাইপ নির্ধারণ করা হয় (যেমন, String, Int, Float, Boolean), যা কুয়েরি চলানোর সময় যাচাই করা হয়।
  • Required Fields: গ্রাফকিউএল স্কিমাতে কিছু ফিল্ড non-nullable (অর্থাৎ, অবশ্যই মান থাকতে হবে) হিসেবে সংজ্ঞায়িত করা যায়। এই ধরনের ফিল্ডের জন্য কুয়েরি পাঠানোর সময় যদি মান না দেওয়া হয়, তবে গ্রাফকিউএল একটি ত্রুটি ফেরত দেবে।

2. Custom Schema Validation

কাস্টম স্কিমা ভ্যালিডেশন এমন কিছু কাস্টম চেক হতে পারে যা স্কিমার মধ্যে যুক্ত করার মাধ্যমে আপনি যাচাই করতে পারেন, যেমন:

  • Custom Directives: গ্রাফকিউএল স্কিমাতে custom directives ব্যবহার করে ভ্যালিডেশন যোগ করা যেতে পারে।
  • Validation on Mutation: মিউটেশনগুলিতে কাস্টম ভ্যালিডেশন চেক যোগ করা যেতে পারে, যেমন কিছু ফিল্ডের মান নির্দিষ্ট রেঞ্জের মধ্যে থাকতে হবে।

3. Example: Schema Validation Using Custom Directives

ধরা যাক, একটি কাস্টম ডিরেকটিভ তৈরি করা হচ্ছে, যা ইউজারের নামের জন্য নির্দিষ্ট দৈর্ঘ্য যাচাই করবে:

const { GraphQLDirective, GraphQLString } = require('graphql');

// Create a custom directive for validating user name length
const validateNameLengthDirective = new GraphQLDirective({
  name: 'validateNameLength',
  locations: ['FIELD_DEFINITION'],
  args: {
    minLength: { type: GraphQLInt },
  },
});

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: {
    name: {
      type: GraphQLString,
      directives: [
        {
          name: 'validateNameLength',
          args: { minLength: 3 },
        },
      ],
      resolve(parent, args, context, info) {
        if (parent.name.length < 3) {
          throw new Error('Name must be at least 3 characters');
        }
        return parent.name;
      },
    },
  },
});

const schema = new GraphQLSchema({
  query: RootQuery,
  mutation: Mutation,
  directives: [validateNameLengthDirective],
});

এখানে:

  • validateNameLength একটি কাস্টম ডিরেকটিভ যা ইউজারের নামের দৈর্ঘ্য চেক করে। যদি নাম ৩ অক্ষরের কম হয়, তবে ত্রুটি দেখানো হবে।

Best Practices for GraphQL Query and Schema Validation

  1. Input Validation: কুয়েরি বা মিউটেশনের ইনপুট যাচাই করা নিশ্চিত করে যে, সার্ভারের ওপর অতিরিক্ত চাপ পড়বে না। ক্লায়েন্টের সঠিক ডেটা পাঠানো প্রয়োজন।
  2. Error Handling: কুয়েরি বা মিউটেশন চলাকালীন ত্রুটি সঠিকভাবে হ্যান্ডেল করা গুরুত্বপূর্ণ। যেকোনো ভুল বা অস্বীকৃত ইনপুটের জন্য উপযুক্ত ত্রুটি বার্তা প্রদান করুন।
  3. Complex Query Limiting: অত্যন্ত জটিল বা nested কুয়েরি সার্ভারের পারফরম্যান্স কমিয়ে দিতে পারে, সুতরাং এই ধরনের কুয়েরি সীমাবদ্ধ করা উচিত।
  4. Rate Limiting and Throttling: অনেক কুয়েরি একযোগে পাঠানোর ফলে সার্ভারে চাপ পড়তে পারে। Rate limiting এবং throttling পদ্ধতি ব্যবহার করে এমন কুয়েরি প্রতিরোধ করা উচিত।

সারাংশ

GraphQL Query এবং Schema Validation গ্রাফকিউএল অ্যাপ্লিকেশনের গুরুত্বপূর্ণ অংশ যা ডেটা সঠিকভাবে এবং নিরাপদভাবে সঞ্চালিত হওয়া নিশ্চিত করে। কুয়েরি ভ্যালিডেশন ক্লায়েন্টের পাঠানো ডেটা যাচাই করে, এবং স্কিমা ভ্যালিডেশন সার্ভারের ডেটা ধরণ এবং ফিল্ড সঠিকভাবে সংজ্ঞায়িত করেছে কিনা তা যাচাই করে। অতিরিক্ত কাস্টম ভ্যালিডেশন পদ্ধতি গ্রাফকিউএল অ্যাপ্লিকেশনকে আরও নিরাপদ এবং দক্ষ করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...