برنامه نویسی

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

تصور کنید که شما یک سرور MCP دارید. این احتمال وجود دارد که بخواهید تست های واحد ایجاد کنید تا از عملکرد آن مطابق آنچه در نظر گرفته شده است اطمینان حاصل کنیدبشر

در این پست ، نحوه نوشتن تست های واحد برای سرورهای MCP را طی می کنم. ما یک سرور MCP موجود موجود در Smithery را آزمایش خواهیم کرد: سرور زمان MCPبشر

همانطور که نشان داده شده است ، شامل ابزارهای زیر است:

سرور زمان 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بشر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا