การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน
การทดสอบตั้งแต่ต้นจนจบกับบริการจริงในสภาพแวดล้อมทดสอบที่แยกออกมา
การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดการทดสอบตัวแทนจึงแตกต่าง
- การจำลองการเรียก LLM ในการทดสอบ
- การทดสอบตัวแทนโดยอิงการยืนยัน
- การทดสอบการผสานรวมสำหรับไปป์ไลน์ตัวแทน