تست واحد برای MCP! – جامعه dev

تصور کنید که شما یک سرور MCP دارید. این احتمال وجود دارد که بخواهید تست های واحد ایجاد کنید تا از عملکرد آن مطابق آنچه در نظر گرفته شده است اطمینان حاصل کنیدبشر
در این پست ، نحوه نوشتن تست های واحد برای سرورهای MCP را طی می کنم. ما یک سرور MCP موجود موجود در Smithery را آزمایش خواهیم کرد: سرور زمان MCPبشر
همانطور که نشان داده شده است ، شامل ابزارهای زیر است:
آزمون واحد را بنویسید
اول ، ما یک جدید ایجاد می کنیم xunit
پروژه و اضافه کردن skUnit
از Nuget.
در مرحله بعد ، مطابق اسناد Skunit ، تنها وظیفه ما پیکربندی آن در سازنده تست است.
public class TimeServerMcpTests
{
ScenarioAssert ScenarioAssert { get; set; }
IChatClient ChatClient { get; set; }
public TimeServerMcpTests(ITestOutputHelper output)
{
var configuration = new ConfigurationBuilder()
.AddUserSecrets<TimeServerMcpTests>()
.Build();
var apiKey = configuration["AzureOpenAI_ApiKey"];
var endpoint = configuration["AzureOpenAI_Endpoint"];
var deploymentName = configuration["AzureOpenAI_Deployment"];
ChatClient = new AzureOpenAIClient(
new Uri(endpoint),
new System.ClientModel.ApiKeyCredential(apiKey))
.GetChatClient(deploymentName)
.AsIChatClient();
ScenarioAssert = new ScenarioAssert(ChatClient, output.WriteLine);
}
[Fact]
public async Task Tools_MustWork()
{
// Our tests will be here...
}
}
بیایید با نوشتن بدن برای روش تست خود شروع کنیم. اولین قدم ایجاد اتصال به سرور MCP است.
var clientTransport = new StdioClientTransport(new StdioClientTransportOptions
{
Name = "Time MCP Server",
Command = "cmd",
Arguments = [
"/c",
"npx",
"-y",
"@smithery/cli@latest",
"run",
"@yokingma/time-mcp"
],
});
// Here's our MCP ready for testing.
await using var mcp = await McpClientFactory.CreateAsync(clientTransport);
اکنون ، ما ساختیم ChatClient
روی آن:
var tools = await mcp.ListToolsAsync();
var builder = new ChatClientBuilder(ChatClient)
.ConfigureOptions(options =>
{
options.Tools = tools.ToArray();
})
.UseFunctionInvocation();
var chatClient = builder.Build();
و سرانجام 3 خط ما کنگره برای آزمایش سناریو:
var scenarioText = await File.ReadAllTextAsync("TestScenario.md");
var scenario = ChatScenario.LoadFromText(scenarioText);
await ScenarioAssert.PassAsync(scenario, chatClient);
و درست مثل همین ، نتیجه اینجاست!
سناریوی تست
اما چگونه سناریوی آزمون را مشخص کردیم و چه چیزی در TestScenario.md
پرونده ای که ما به عنوان سناریوی خود بارگیری کردیم؟
همانطور که در این سناریو مشاهده می کنید ، انتظار داریم جواب “ساعت چند است؟” باید هر جمله یا پاراگراف باشد که این شرایط معنایی را داشته باشد:
شرایط معنایی: باید یک زمان را ذکر کند.
### CHECK SemanticCondition
It mentions a time.
ما همچنین انتظار داریم که از آن استفاده کند current_time
ابزار در MCP ، و با پیروی از ادعای ، ما این را تضمین می کنیم.
عملکرد تماس عملکرد: باید یک ابزار را صدا کند.
### CHECK FunctionCall
{
"function_name": "current_time",
}
سپس ، با پرسیدن “چند روز در ژانویه امسال؟” ، ما توانایی دیگر آن را آزمایش می کنیم ، و اطمینان حاصل می کنیم که آن را به درستی فراخوانی می کنیم days_in_month
بشر
## [USER]
How many days are in this year's january?
## [AGENT]
### CHECK SemanticCondition
It mentions 31 days.
### CHECK FunctionCall
{
"function_name": "days_in_month",
}
بالاخره
با استفاده از skUnit
، آزمایش بلوک های هوش مصنوعی مانند بسیار آسان است سرور MCPبا چلبا هسته، و بیشتر کد منبع کامل در GitHub من موجود است: demo.tddmcpبشر