0Pricing
AI Agents · บทเรียน

การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน

การทดสอบตั้งแต่ต้นจนจบกับบริการจริงในสภาพแวดล้อมทดสอบที่แยกออกมา

การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

การทดสอบการผสานรวมสำหรับเอเจนต์คืออะไร

การทดสอบหน่วยตรวจสอบแต่ละองค์ประกอบแยกจากกัน ส่วนการทดสอบการผสานรวมตรวจสอบว่าองค์ประกอบหลายอย่างทำงานร่วมกันได้อย่างถูกต้องในสภาพแวดล้อมจริงหรือใกล้เคียงจริง

สำหรับเอเจนต์ หมายถึงการเรียกใช้กระบวนการทำงานทั้งหมด — การเรียกใช้ LLM การดำเนินการเครื่องมือ และการจัดเก็บข้อมูล — กับบริการจริงหรือบริการในแซนด์บ็อกซ์

โครงสร้างการทดสอบตั้งแต่ต้นจนจบ

การทดสอบเอเจนต์ตั้งแต่ต้นจนจบจะส่งคำค้นหาจริงผ่านกระบวนการทำงานทั้งหมดและตรวจสอบผลลัพธ์สุดท้าย ให้เรียกใช้การทดสอบเหล่านี้ในสภาพแวดล้อมแบบแซนด์บ็อกซ์ — ห้ามทดสอบกับฐานข้อมูลระบบจริงหรือข้อมูลผู้ใช้ที่ใช้งานจริง

import pytest

# Mark as integration test — skipped in fast unit test runs
@pytest.mark.integration
def test_research_agent_full_pipeline():
    from myagent import ResearchAgent

    agent = ResearchAgent(
        openai_api_key='YOUR_TEST_KEY',
        search_api_key='YOUR_TEST_KEY'
    )

    result = agent.run('What is the population of Tokyo?')

    # Structural assertions — not exact string matching
    assert isinstance(result, dict)
    assert result['status'] == 'completed'
    assert 'tokyo' in result['answer'].lower() or 'japan' in result['answer'].lower()
    assert len(result['sources']) >= 1

การแยกข้อมูลการทดสอบ

การทดสอบการผสานรวมต้องไม่ทำให้ข้อมูลที่ใช้ร่วมกันปนเปื้อน ให้ใช้ฐานข้อมูลเฉพาะสำหรับการทดสอบ เนมสเปซที่แยกจากกัน หรือข้อมูลชั่วคราวที่ถูกล้างหลังการทดสอบ ห้ามเขียนข้อมูลการทดสอบลงในตารางของระบบจริง

import os
import pytest

# Use a separate test database URL
@pytest.fixture(scope='session')
def test_db():
    test_db_url = os.environ.get(
        'TEST_DATABASE_URL',
        'postgresql://localhost/myagent_test'  # separate test DB
    )
    # Set up test schema
    from myagent.database import create_tables
    create_tables(test_db_url)
    yield test_db_url
    # Tear down after all tests in the session
    from myagent.database import drop_tables
    drop_tables(test_db_url)

การล้างข้อมูลหลังการทดสอบแต่ละครั้ง

การทดสอบการผสานรวมแต่ละครั้งควรล้างข้อมูลที่สร้างขึ้น ใช้รูปแบบฟิกซ์เจอร์ yield ของ pytest โดยตั้งค่าก่อน yield และล้างข้อมูลหลังจากนั้น วิธีนี้ทำให้แน่ใจว่าการทดสอบเป็นอิสระต่อกันและเรียกใช้ในลำดับใดก็ได้

import pytest

@pytest.fixture
def clean_agent_memory(test_db):
    # No setup needed — DB starts empty
    yield
    # Cleanup: delete any records created during this test
    from myagent.database import clear_conversation_history
    clear_conversation_history(test_db)

@pytest.mark.integration
def test_agent_stores_conversation(clean_agent_memory, test_db):
    from myagent import Agent
    agent = Agent(db_url=test_db)

    agent.run('Remember that my name is Alex')
    history = agent.get_history()

    assert len(history) > 0
    assert any('Alex' in str(msg) for msg in history)
    # clean_agent_memory fixture deletes these after the test

บริการแบบแซนด์บ็อกซ์: คีย์ API สำหรับการทดสอบ

ใช้คีย์ API สำหรับการทดสอบโดยเฉพาะ ซึ่งมีสิทธิ์และโควตาจำกัดสำหรับการทดสอบการผสานรวม ห้ามใช้คีย์ของระบบจริงใน CI จัดเก็บคีย์สำหรับการทดสอบเป็นตัวแปรสภาพแวดล้อมของ CI ไม่ใช่ไว้ในโค้ด

import os
import pytest

# Skip integration tests if test keys are not configured
def requires_integration_keys():
    return pytest.mark.skipif(
        not os.environ.get('OPENAI_TEST_KEY'),
        reason='Integration test keys not configured'
    )

@requires_integration_keys()
@pytest.mark.integration
def test_live_weather_tool():
    from myagent.tools import get_weather
    result = get_weather(city='London', unit='celsius')

    assert result['success'] is True
    assert 'temperature' in result
    assert isinstance(result['temperature'], (int, float))

การใช้ Docker สำหรับฐานข้อมูลแบบแซนด์บ็อกซ์

สำหรับการทดสอบการผสานรวมที่ต้องใช้ฐานข้อมูลจริง ให้เริ่มคอนเทนเนอร์ Docker สำหรับเซสชันการทดสอบ วิธีนี้รับประกันว่าจะได้ฐานข้อมูลที่สะอาดและแยกเป็นอิสระทุกครั้ง และหลีกเลี่ยงความขัดแย้งกับฐานข้อมูลสำหรับการพัฒนา

# conftest.py — docker-based test database
import subprocess
import pytest

@pytest.fixture(scope='session')
def docker_postgres():
    container_id = subprocess.check_output([
        'docker', 'run', '-d',
        '-e', 'POSTGRES_PASSWORD=test',
        '-e', 'POSTGRES_DB=agent_test',
        '-p', '5434:5432',  # use non-standard port to avoid conflicts
        'postgres:15'
    ]).decode().strip()

    import time
    time.sleep(2)  # wait for Postgres to start

    yield 'postgresql://postgres:test@localhost:5434/agent_test'

    subprocess.run(['docker', 'stop', container_id])
    subprocess.run(['docker', 'rm', container_id])

การกำหนดค่าการทดสอบเฉพาะสภาพแวดล้อม

การทดสอบการผสานรวมต้องใช้การกำหนดค่าที่แตกต่างกันสำหรับสภาพแวดล้อมภายในเครื่อง CI และการจัดเตรียมระบบ ให้ใช้ตัวแปรสภาพแวดล้อมและตัวช่วยกำหนดค่าเพื่อเลือกการตั้งค่าที่ถูกต้องโดยอัตโนมัติ

import os

def get_test_config() -> dict:
    env = os.environ.get('TEST_ENV', 'local')

    configs = {
        'local': {
            'db_url': 'postgresql://localhost/agent_test',
            'openai_key': os.environ.get('OPENAI_TEST_KEY', ''),
            'use_real_llm': False  # use mocks locally
        },
        'ci': {
            'db_url': os.environ.get('CI_DATABASE_URL', ''),
            'openai_key': os.environ.get('CI_OPENAI_KEY', ''),
            'use_real_llm': True  # use real LLM in CI integration tests
        },
        'staging': {
            'db_url': os.environ.get('STAGING_DATABASE_URL', ''),
            'openai_key': os.environ.get('STAGING_OPENAI_KEY', ''),
            'use_real_llm': True
        }
    }
    return configs[env]

config = get_test_config()

print(f"TEST_ENV not set -> using '{os.environ.get('TEST_ENV', 'local')}' config")
print(f"DB URL       : {config['db_url']}")
print(f"Use real LLM : {config['use_real_llm']}")

เครื่องหมาย pytest สำหรับเลือกการทดสอบ

ใช้เครื่องหมาย pytest แบบกำหนดเองเพื่อจัดหมวดหมู่การทดสอบและเรียกใช้เฉพาะกลุ่มย่อยที่เกี่ยวข้อง กำหนดเครื่องหมายใน pytest.ini และใช้ -m ในบรรทัดคำสั่งเพื่อเลือกเครื่องหมาย

# pytest.ini
# [pytest]
# markers =
#     unit: Fast unit tests with mocked dependencies
#     integration: Slower tests with real or sandboxed services
#     expensive: Tests that make real LLM calls and cost money

# Run only unit tests (fast CI check):
# pytest -m unit

# Run only integration tests:
# pytest -m integration

# Run everything except expensive tests:
# pytest -m 'not expensive'

# In test files:
import pytest

@pytest.mark.unit
def test_tool_format():
    pass  # fast, no external calls

@pytest.mark.integration
@pytest.mark.expensive
def test_with_real_llm():
    pass  # slow, costs tokens

การเรียกใช้การทดสอบการผสานรวมใน CI

กำหนดค่ากระบวนการ CI ของคุณ (GitHub Actions, GitLab CI) ให้เรียกใช้การทดสอบหน่วยทุกครั้งที่พุช และเรียกใช้การทดสอบการผสานรวมตามกำหนดเวลาหรือก่อนเผยแพร่ วิธีนี้ช่วยสร้างสมดุลระหว่างความเร็วและความครอบคลุม

# .github/workflows/test.yml (abbreviated)
# name: Tests
# on:
#   push:
#     branches: [main, develop]
#   schedule:
#     - cron: '0 2 * * *'  # nightly integration tests
#
# jobs:
#   unit-tests:
#     runs-on: ubuntu-latest
#     steps:
#       - uses: actions/checkout@v3
#       - run: pip install -r requirements.txt
#       - run: pytest -m unit --tb=short
#
#   integration-tests:
#     if: github.event_name == 'schedule'
#     env:
#       CI_OPENAI_KEY: ${{ secrets.CI_OPENAI_KEY }}
#       CI_DATABASE_URL: ${{ secrets.CI_DATABASE_URL }}
#     steps:
#       - run: pytest -m integration --tb=long

print('Unit tests on every push, integration tests nightly')

การวัดความครอบคลุมการทดสอบสำหรับเอเจนต์

ใช้ pytest-cov เพื่อวัดว่าการทดสอบครอบคลุมบรรทัดใดในโค้ดเอเจนต์บ้าง ควรให้ฟังก์ชันเครื่องมือและตรรกะการประสานงานของเอเจนต์มีความครอบคลุมสูง แม้จะจำลองการเรียกใช้ LLM ก็ตาม

# Install: pip install pytest-cov

# Run tests with coverage report:
# pytest --cov=myagent --cov-report=html -m unit

# This generates an HTML report showing which lines are untested
# Uncovered lines in the agent loop are high-risk areas

# Example coverage config in pyproject.toml:
# [tool.coverage.run]
# omit = ["tests/*", "scripts/*"]
#
# [tool.coverage.report]
# fail_under = 80  # fail if coverage drops below 80%

print('Coverage reports highlight untested code paths in your agent')

สรุปแนวทางปฏิบัติที่ดีสำหรับการทดสอบการผสานรวม

กฎสำคัญสำหรับการทดสอบการผสานรวมของเอเจนต์ที่เชื่อถือได้:

  • ใช้ฐานข้อมูลแยกสำหรับการทดสอบเสมอ — ห้ามใช้ฐานข้อมูลระบบจริง
  • ล้างข้อมูลการทดสอบหลังการทดสอบทุกครั้งด้วยฟิกซ์เจอร์ yield
  • ใช้คีย์ API สำหรับการทดสอบโดยเฉพาะที่มีโควตาจำกัด
  • ใช้เครื่องหมาย pytest เพื่อแยกการทดสอบหน่วยที่รวดเร็วออกจากการทดสอบการผสานรวมที่ช้า
  • เรียกใช้การทดสอบหน่วยทุกครั้งที่พุช และเรียกใช้การทดสอบการผสานรวมตามกำหนดเวลา
  • ใช้ Docker สำหรับสภาพแวดล้อมฐานข้อมูลที่สร้างใหม่และสะอาดแล้วทิ้งได้

ตรวจสอบความรู้: การทดสอบการผสานรวม

ทดสอบความเข้าใจเกี่ยวกับการทดสอบการผสานรวมสำหรับกระบวนการทำงานของเอเจนต์

ทบทวน: การทดสอบการผสานรวมสำหรับกระบวนการทำงานของเอเจนต์

ขณะนี้คุณมีความรู้ในการสร้างชุดการทดสอบการผสานรวมที่ครบถ้วนและเชื่อถือได้แล้ว:

  • ใช้ @pytest.mark.integration เพื่อแยกการทดสอบที่ช้าออกจากการทดสอบหน่วยที่รวดเร็ว
  • แยกข้อมูลการทดสอบด้วยฐานข้อมูลเฉพาะและฟิกซ์เจอร์สำหรับล้างข้อมูล
  • ใช้ Docker หรือบริการแบบแซนด์บ็อกซ์เพื่อสร้างสภาพแวดล้อมที่สะอาด
  • กำหนดค่าคีย์ API เฉพาะสำหรับการทดสอบผ่านตัวแปรสภาพแวดล้อม
  • เรียกใช้การทดสอบหน่วยทุกครั้งที่คอมมิต และเรียกใช้การทดสอบการผสานรวมทุกคืนใน CI
  • วัดความครอบคลุมด้วย pytest-cov เพื่อค้นหาเส้นทางที่ยังไม่ได้ทดสอบ

พีระมิดการทดสอบที่จัดระเบียบอย่างดีช่วยให้เอเจนต์เชื่อถือได้เมื่อมีการพัฒนาอย่างต่อเนื่อง

คำถามที่พบบ่อย

บทเรียน “การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน”

การทดสอบตั้งแต่ต้นจนจบกับบริการจริงในสภาพแวดล้อมทดสอบที่แยกออกมา คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดการทดสอบตัวแทนจึงแตกต่าง
  2. การจำลองการเรียก LLM ในการทดสอบ
  3. การทดสอบตัวแทนโดยอิงการยืนยัน
  4. การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน
← กลับไปที่ AI Agents