تست برنامه‌های LangChain4j

March 2, 2026 · View on GitHub

فهرست مطالب

این راهنما شما را با تست‌هایی آشنا می‌کند که نشان می‌دهند چگونه برنامه‌های هوش مصنوعی را بدون نیاز به کلیدهای API یا سرویس‌های خارجی تست کنید.

شروع سریع

تمام تست‌ها را با یک دستور اجرا کنید:

Bash:

mvn test

PowerShell:

mvn --% test

وقتی همه تست‌ها با موفقیت اجرا شدند، باید خروجی مانند تصویر زیر ببینید — تست‌ها بدون خطا اجرا شده‌اند.

Successful Test Results

اجرای موفق تست‌ها که همه تست‌ها را بدون خطا نشان می‌دهد

موضوعات پوشش داده شده در تست‌ها

این دوره بر تست‌های واحد که به صورت محلی اجرا می‌شوند تمرکز دارد. هر تست یک مفهوم خاص از LangChain4j را به صورت جداگانه نشان می‌دهد. هرم تست زیر محل قرارگیری تست‌های واحد را نشان می‌دهد — آنها پایه‌ای سریع و قابل اعتماد هستند که بقیه استراتژی تست شما بر اساس آن ساخته می‌شود.

Testing Pyramid

هرم تست که تعادل بین تست‌های واحد (سریع، جداگانه)، تست‌های یکپارچه‌سازی (کامپوننت‌های واقعی) و تست‌های انتها-به-انتها را نشان می‌دهد. این آموزش بر تست واحد متمرکز است.

ماژولتست‌هامحور تمرکزفایل‌های کلیدی
00 - شروع سریع6قالب‌های پرسش و جایگزینی متغیرهاSimpleQuickStartTest.java
01 - معرفی8حافظه مکالمه و چت حالت‌مندSimpleConversationTest.java
02 - مهندسی پرسش12الگوهای GPT-5.2، سطوح اشتیاق، خروجی ساختاریافتهSimpleGpt5PromptTest.java
03 - RAG10دریافت اسناد، تعبیه‌ها، جستجوی مشابهتDocumentServiceTest.java
04 - ابزارها12فراخوانی تابع و زنجیره‌سازی ابزارهاSimpleToolsTest.java
05 - MCP8پروتکل زمینه مدل با انتقال stdioSimpleMcpTest.java

اجرای تست‌ها

اجرای همه تست‌ها از ریشه:

Bash:

mvn test

PowerShell:

mvn --% test

اجرای تست‌های یک ماژول خاص:

Bash:

cd 01-introduction && mvn test
# یا از ریشه
mvn test -pl 01-introduction

PowerShell:

cd 01-introduction; mvn --% test
# یا از ریشه
mvn --% test -pl 01-introduction

اجرای یک کلاس تست خاص:

Bash:

mvn test -Dtest=SimpleConversationTest

PowerShell:

mvn --% test -Dtest=SimpleConversationTest

اجرای یک متد تست مشخص:

Bash:

mvn test -Dtest=SimpleConversationTest#باید سابقه مکالمه را حفظ کند

PowerShell:

mvn --% test -Dtest=SimpleConversationTest#آیا باید سابقه گفتگو حفظ شود؟

اجرای تست‌ها در VS Code

اگر از Visual Studio Code استفاده می‌کنید، Test Explorer یک رابط گرافیکی برای اجرای تست‌ها و اشکال‌زدایی ارائه می‌دهد.

VS Code Test Explorer

Test Explorer در VS Code درخت تست‌ها را با همه کلاس‌های تست جاوا و متدهای تست جداگانه نشان می‌دهد

برای اجرای تست‌ها در VS Code:

  1. تست اکسپلورر را با کلیک بر روی آیکون ارلن آزمایش در نوار فعالیت باز کنید
  2. درخت تست را گسترش دهید تا همه ماژول‌ها و کلاس‌های تست را ببینید
  3. روی دکمه پخش کنار هر تست کلیک کنید تا به صورت جداگانه اجرا شود
  4. روی "Run All Tests" کلیک کنید تا کل مجموعه اجرا شود
  5. روی هر تست راست‌کلیک کنید و "Debug Test" را انتخاب کنید تا نقاط قطع تنظیم و کد مرحله‌به‌مرحله اجرا شود

Test Explorer تیک‌های سبز برای تست‌های موفق نشان می‌دهد و پیام‌های خطای دقیق را در زمان شکست تست‌ها ارائه می‌دهد.

الگوهای تست

الگو ۱: تست قالب پرسش‌ها

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

Prompt Template Testing

تست قالب‌های پرسش که جریان جایگزینی متغیرها را نشان می‌دهد: قالب با مکان‌نماها → مقادیر اعمال شده → خروجی فرمت شده تأیید شده

@Test
@DisplayName("Should format prompt template with variables")
void testPromptTemplateFormatting() {
    PromptTemplate template = PromptTemplate.from(
        "Best time to visit {{destination}} for {{activity}}?"
    );
    
    Prompt prompt = template.apply(Map.of(
        "destination", "Paris",
        "activity", "sightseeing"
    ));
    
    assertThat(prompt.text()).isEqualTo("Best time to visit Paris for sightseeing?");
}

این تست در 00-quick-start/src/test/java/com/example/langchain4j/quickstart/SimpleQuickStartTest.java قرار دارد.

برای اجرا:

Bash:

cd 00-quick-start && mvn test -Dtest=SimpleQuickStartTest#قالب‌بندی الگوی درخواست آزمایشی

PowerShell:

cd 00-quick-start; mvn --% test -Dtest=SimpleQuickStartTest#قالب‌بندی آزمون الگوخواسته

الگو ۲: شبیه‌سازی مدل‌های زبانی

در تست منطق مکالمه، از Mockito برای ساخت مدل‌های جعلی استفاده کنید که پاسخ‌های از پیش تعیین‌شده برمی‌گردانند. این موجب سرعت، رایگان بودن و قطعی بودن تست‌ها می‌شود.

Mock vs Real API Comparison

مقایسه‌ای که نشان می‌دهد چرا شبیه‌سازی‌ها برای تست ترجیح داده می‌شوند: سریع، رایگان، قطعی و بدون نیاز به کلیدهای API هستند

@ExtendWith(MockitoExtension.class)
class SimpleConversationTest {
    
    private ConversationService conversationService;
    
    @Mock
    private OpenAiOfficialChatModel mockChatModel;
    
    @BeforeEach
    void setUp() {
        ChatResponse mockResponse = ChatResponse.builder()
            .aiMessage(AiMessage.from("This is a test response"))
            .build();
        when(mockChatModel.chat(anyList())).thenReturn(mockResponse);
        
        conversationService = new ConversationService(mockChatModel);
    }
    
    @Test
    void shouldMaintainConversationHistory() {
        String conversationId = conversationService.startConversation();
        
        ChatResponse mockResponse1 = ChatResponse.builder()
            .aiMessage(AiMessage.from("Response 1"))
            .build();
        ChatResponse mockResponse2 = ChatResponse.builder()
            .aiMessage(AiMessage.from("Response 2"))
            .build();
        ChatResponse mockResponse3 = ChatResponse.builder()
            .aiMessage(AiMessage.from("Response 3"))
            .build();
        
        when(mockChatModel.chat(anyList()))
            .thenReturn(mockResponse1)
            .thenReturn(mockResponse2)
            .thenReturn(mockResponse3);

        conversationService.chat(conversationId, "First message");
        conversationService.chat(conversationId, "Second message");
        conversationService.chat(conversationId, "Third message");

        List<ChatMessage> history = conversationService.getHistory(conversationId);
        assertThat(history).hasSize(6); // ۳ پیام کاربر + ۳ پیام هوش مصنوعی
    }
}

این الگو در 01-introduction/src/test/java/com/example/langchain4j/service/SimpleConversationTest.java ظاهر می‌شود. شبیه‌سازی رفتار یکسان را تضمین می‌کند تا بتوانید مدیریت حافظه را به درستی تأیید کنید.

الگو ۳: تست جداسازی مکالمه

حافظه مکالمه باید کاربران مختلف را جدا نگه دارد. این تست تأیید می‌کند که مکالمات زمینه‌ها را مخلوط نمی‌کنند.

Conversation Isolation

تست جداسازی مکالمه که فروشگاه‌های حافظه جداگانه برای کاربران مختلف برای جلوگیری از مخلوط شدن زمینه‌ها را نشان می‌دهد

@Test
void shouldIsolateConversationsByid() {
    String conv1 = conversationService.startConversation();
    String conv2 = conversationService.startConversation();
    
    ChatResponse mockResponse = ChatResponse.builder()
        .aiMessage(AiMessage.from("Response"))
        .build();
    when(mockChatModel.chat(anyList())).thenReturn(mockResponse);

    conversationService.chat(conv1, "Message for conversation 1");
    conversationService.chat(conv2, "Message for conversation 2");

    List<ChatMessage> history1 = conversationService.getHistory(conv1);
    List<ChatMessage> history2 = conversationService.getHistory(conv2);
    
    assertThat(history1).hasSize(2);
    assertThat(history2).hasSize(2);
}

هر مکالمه تاریخچه مستقل خود را حفظ می‌کند. در سیستم‌های تولید، این جداسازی برای برنامه‌های چند کاربره حیاتی است.

الگو ۴: تست ابزارها به صورت مستقل

ابزارها توابعی هستند که هوش مصنوعی می‌تواند فراخوانی کند. آنها را به صورت مستقیم تست کنید تا مطمئن شوید فارغ از تصمیمات هوش مصنوعی درست کار می‌کنند.

Tools Testing

تست ابزارها به صورت مستقل که اجرای ابزارهای شبیه‌سازی‌شده بدون فراخوانی هوش مصنوعی را برای تأیید منطق کسب‌وکار نشان می‌دهد

@Test
void shouldConvertCelsiusToFahrenheit() {
    TemperatureTool tempTool = new TemperatureTool();
    String result = tempTool.celsiusToFahrenheit(25.0);
    assertThat(result).containsPattern("77[.,]0°F");
}

@Test
void shouldDemonstrateToolChaining() {
    WeatherTool weatherTool = new WeatherTool();
    TemperatureTool tempTool = new TemperatureTool();

    String weatherResult = weatherTool.getCurrentWeather("Seattle");
    assertThat(weatherResult).containsPattern("\\d+°C");

    String conversionResult = tempTool.celsiusToFahrenheit(22.0);
    assertThat(conversionResult).containsPattern("71[.,]6°F");
}

این تست‌ها از 04-tools/src/test/java/com/example/langchain4j/agents/tools/SimpleToolsTest.java منطق ابزار را بدون دخالت هوش مصنوعی اعتبارسنجی می‌کنند. مثال زنجیره‌سازی نشان می‌دهد چگونه خروجی ابزار یک ورودی برای دیگری است.

الگو ۵: تست RAG در حافظه

سیستم‌های RAG معمولاً به پایگاه داده‌های برداری و سرویس‌های تعبیه نیاز دارند. الگوی درون حافظه اجازه می‌دهد کل خط لوله بدون وابستگی‌های خارجی تست شود.

In-Memory RAG Testing

روند تست RAG در حافظه که تجزیه سند، ذخیره تعبیه‌ها و جستجوی مشابهت را بدون نیاز به پایگاه داده نشان می‌دهد

@Test
void testProcessTextDocument() {
    String content = "This is a test document.\nIt has multiple lines.";
    InputStream inputStream = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
    
    DocumentService.ProcessedDocument result = 
        documentService.processDocument(inputStream, "test.txt");

    assertNotNull(result);
    assertTrue(result.segments().size() > 0);
    assertEquals("test.txt", result.segments().get(0).metadata().getString("filename"));
}

این تست از 03-rag/src/test/java/com/example/langchain4j/rag/service/DocumentServiceTest.java سندی را در حافظه ایجاد می‌کند و تجزیه بخش‌بندی و مدیریت متادیتا را تأیید می‌کند.

الگو ۶: تست یکپارچه‌سازی MCP

ماژول MCP تست پروتکل زمینه مدل را با استفاده از انتقال stdio انجام می‌دهد. این تست‌ها اطمینان می‌دهند که برنامه شما می‌تواند سرورهای MCP را به عنوان زیرفرآیند اجرا و با آنها ارتباط برقرار کند.

تست‌ها در 05-mcp/src/test/java/com/example/langchain4j/mcp/SimpleMcpTest.java رفتار کلاینت MCP را اعتبارسنجی می‌کنند.

برای اجرا:

Bash:

cd 05-mcp && mvn test

PowerShell:

cd 05-mcp; mvn --% test

فلسفه تست

کد خود را تست کنید، نه هوش مصنوعی را. تست‌های شما باید کدی را که می‌نویسید با بررسی نحوه ساخت پرسش‌ها، مدیریت حافظه و اجرای ابزارها اعتبارسنجی کنند. پاسخ‌های هوش مصنوعی متفاوت هستند و نباید بخشی از تأییدیه‌های تست باشند. از خود بپرسید آیا قالب پرسش شما متغیرها را به درستی جایگزین می‌کند، نه اینکه آیا هوش مصنوعی پاسخ درست می‌دهد.

از شبیه‌سازی‌ها برای مدل‌های زبانی استفاده کنید. آنها وابستگی‌های خارجی هستند که کند، گران و غیرقطعی هستند. شبیه‌سازی تست‌ها را سریع با میلی‌ثانیه به جای ثانیه، رایگان بدون هزینه API و قطعی با همان نتیجه در هر بار اجرا می‌کند.

تست‌ها را مستقل نگه دارید. هر تست باید داده‌های خودش را راه‌اندازی کند، به تست‌های دیگر وابسته نباشد و پس از اجرا پاکسازی کند. تست‌ها باید فارغ از ترتیب اجرا پذیرفته شوند.

موارد حاشیه‌ای فراتر از مسیر خوشحال را تست کنید. ورودی‌های خالی، خیلی بزرگ، کاراکترهای خاص، پارامترهای نامعتبر و شرایط مرزی را امتحان کنید. این موارد اغلب خطاهایی را نشان می‌دهند که استفاده عادی نشان نمی‌دهد.

از نام‌های توصیفی استفاده کنید. مقایسه کنید shouldMaintainConversationHistoryAcrossMultipleMessages() با test1(). اولی دقیقا می‌گوید چه چیزی تست می‌شود و عیب‌یابی خطاها را بسیار آسان می‌کند.

گام‌های بعدی

حالا که الگوهای تست را درک کردید، به صورت عمیق‌تر به هر ماژول بپردازید:

README هر ماژول توضیحات مفصل مفاهیم تست شده در اینجا را ارائه می‌دهد.


ناوبری: ← بازگشت به اصلی


توضیح مسئولیت:
این سند با استفاده از سرویس ترجمه ماشینی Co-op Translator ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نواقصی باشند. سند اصلی به زبان مادری آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای توسط انسان توصیه می‌شود. ما در قبال هر گونه سوءتفاهم یا تفسیر نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.