สวัสดีครับ ผมเป็นนักพัฒนาซอฟต์แวร์ที่ทำงานกับ AI API มาหลายปี ในบทความนี้ผมจะมาแบ่งปันประสบการณ์ตรงเกี่ยวกับการเขียนเทสต์สำหรับ MCP Tool ที่ใช้ LLM ซึ่งเป็นเทคนิคที่จะช่วยให้คุณทดสอบโค้ดได้เร็วขึ้นและประหยัดค่าใช้จ่ายได้มากเลยทีเดียว
MCP คืออะไร และทำไมต้องทดสอบ
MCP ย่อมาจาก Model Context Protocol เป็นมาตรฐานการเชื่อมต่อโมเดล AI กับแหล่งข้อมูลและเครื่องมือต่างๆ หลายคนอาจสงสัยว่าทำไมต้องทดสอบด้วย ในเมื่อเราก็เรียก API ได้เลย คำตอบคือการจำลองการเรียก LLM หรือที่เรียกว่า Mocking นั้นช่วยให้เราทดสอบได้โดยไม่ต้องเสียค่าใช้จ่ายจริง และทดสอบได้เร็วมากเพราะไม่ต้องรอการตอบกลับจากเซิร์ฟเวอร์
เริ่มต้นเตรียมโปรเจกต์
ก่อนอื่นให้สร้างโฟลเดอร์สำหรับโปรเจกต์ของเรา เปิด Terminal แล้วพิมพ์คำสั่งตามนี้
mkdir mcp-testing
cd mcp-testing
npm init -y
จากนั้นติดตั้งไลบรารีที่จำเป็นสำหรับการทดสอบ
npm install jest @holysheep-ai/sdk --save-dev
เขียนโค้ด MCP Tool พื้นฐาน
ให้สร้างไฟล์ชื่อ weatherTool.js ทำหน้าที่ดึงข้อมูลอากาศผ่าน LLM โดยใช้ HolySheep AI เป็น API หลัก ซึ่งมีความเร็วตอบกลับน้อยกว่า 50 มิลลิวินาที ทำให้การทดสอบรวดเร็วมาก
// weatherTool.js
const HolySheepAI = require('@holysheep-ai/sdk');
class WeatherTool {
constructor(apiKey) {
this.client = new HolySheepAI({
baseURL: 'https://api.holysheep.ai/v1',
apiKey: apiKey
});
}
async getWeather(city) {
const response = await this.client.chat.completions.create({
model: 'gpt-4.1',
messages: [
{
role: 'system',
content: 'คุณเป็นผู้ช่วยพยากรณ์อากาศ ตอบเป็น JSON รูปแบบ: {temp: อุณหภูมิ, condition: สภาพอากาศ}'
},
{
role: 'user',
content: พยากรณ์อากาศของ ${city} วันนี้เป็นอย่างไร
}
],
temperature: 0.3
});
const result = response.choices[0].message.content;
return JSON.parse(result);
}
}
module.exports = WeatherTool;
การจำลองการเรียก LLM ด้วย Jest
ตอนนี้มาสร้างไฟล์เทสต์กันครับ ให้สร้างไฟล์ชื่อ weatherTool.test.js โดยใช้เทคนิค Mocking ที่จะจำลองการตอบกลับจาก LLM แทนการเรียกจริง
// weatherTool.test.js
const WeatherTool = require('./weatherTool');
// Mock HolySheep AI SDK
jest.mock('@holysheep-ai/sdk', () => {
return jest.fn().mockImplementation(() => ({
chat: {
completions: {
create: jest.fn()
}
}
}));
});
describe('WeatherTool Tests', () => {
let weatherTool;
let mockClient;
beforeEach(() => {
jest.clearAllMocks();
weatherTool = new WeatherTool('test-api-key');
mockClient = weatherTool.client;
});
test('ควรแปลงข้อมูลอากาศเป็นรูปแบบที่ถูกต้อง', async () => {
// จำลองการตอบกลับจาก LLM
mockClient.chat.completions.create.mockResolvedValue({
choices: [{
message: {
content: '{"temp": 28, "condition": "แดดร้อน"}'
}
}]
});
const result = await weatherTool.getWeather('กรุงเทพ');
expect(result).toEqual({
temp: 28,
condition: 'แดดร้อน'
});
expect(mockClient.chat.completions.create).toHaveBeenCalledWith(
expect.objectContaining({
model: 'gpt-4.1'
})
);
});
test('ควรส่งชื่อเมืองไปยัง LLM อย่างถูกต้อง', async () => {
mockClient.chat.completions.create.mockResolvedValue({
choices: [{
message: {
content: '{"temp": 25, "condition": "ฝนตก"}'
}
}]
});
await weatherTool.getWeather('เชียงใหม่');
expect(mockClient.chat.completions.create).toHaveBeenCalledWith(
expect.objectContaining({
messages: expect.arrayContaining([
expect.objectContaining({
content: expect.stringContaining('เชียงใหม่')
})
])
})
);
});
});
การตั้งค่า Jest Configuration
สร้างไฟล์ jest.config.js เพื่อกำหนดค่าการทดสอบ
// jest.config.js
module.exports = {
testEnvironment: 'node',
testMatch: ['**/*.test.js'],
collectCoverage: true,
coverageDirectory: 'coverage',
verbose: true
};
รันเทสต์ด้วยคำสั่ง
npm test
เมื่อรันเทสต์สำเร็จ คุณจะเห็นผลลัพธ์สีเขียวแสดงว่าเทสต์ผ่านทั้งหมด
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
กรณีที่ 1: ข้อผิดพลาด "Cannot find module @holysheep-ai/sdk"
สาเหตุ: ยังไม่ได้ติดตั้ง SDK หรือติดตั้งผิดชื่อ
วิธีแก้: ตรวจสอบว่าติดตั้ง SDK ถูกต้องแล้ว
npm install @holysheep-ai/sdk
กรณีที่ 2: ข้อผิดพลาด "Mock function was not called"
สาเหตุ: Mock ไม่ทำงานเพราะ import ผิดวิธี
วิธีแก้: ต้องใช้ jest.mock ก่อน require เสมอ
// ลำดับที่ถูกต้อง
jest.mock('@holysheep-ai/sdk', () => {
return jest.fn().mockImplementation(() => ({
chat: { completions: { create: jest.fn() } }
}));
});
const WeatherTool = require('./weatherTool');
กรณีที่ 3: ข้อผิดพลาด "timeout of 5000ms exceeded"
สาเหตุ: Mock ไม่ได้คืนค่า Promise ทำให้ async function รอนานเกินไป
วิธีแก้: ต้องใช้ mockResolvedValue เสมอสำหรับ async function
// ผิด
mockClient.chat.completions.create.mockReturnValue({ data: 'test' });
// ถูก
mockClient.chat.completions.create.mockResolvedValue({
choices: [{ message: { content: '{"test": true}' } }]
});
สรุป
การทดสอบ MCP Tool ด้วยการจำลอง LLM เป็นเทคนิคที่ทรงพลังมาก ช่วยให้เราพัฒนาและทดสอบได้อย่างมีประสิทธิภาพ โดยไม่ต้องกังวลเรื่องค่าใช้จ่ายหรือความเร็วของเครือข่าย จากประสบการณ์ของผม การใช้ HolySheep AI ร่วมกับการ Mocking ช่วยประหยัดค่าใช้จ่ายได้มากกว่า 85% เมื่อเทียบกับการใช้ OpenAI โดยตรง
HolySheep AI มีราคาที่คุ้มค่ามาก เช่น DeepSeek V3.2 เพียง $0.42 ต่อล้านโทเค็น และ Gemini 2.5 Flash เพียง $2.50 ต่อล้านโทเค็น รองรับการชำระเงินผ่าน WeChat และ Alipay พร้อมความเร็วในการตอบกลับน้อยกว่า 50 มิลลิวินาที ซึ่งเร็วกว่าผู้ให้บริการอื่นมาก
หากต้องการทดสอบจริงกับ API หลังจากผ่านการทดสอบด้วย Mocking แล้ว สามารถใช้ API Key จริงได้เลย โดยไม่ต้องแก้ไขโค้ดเพราะโครงสร้างคล้ายกันมาก
👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน