اختبارات التكامل لمسارات الوكلاء
اختبارات من البداية إلى النهاية مقابل خدمات حقيقية في بيئات اختبار معزولة
اختبارات التكامل لمسارات الوكلاء درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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)التنظيف بعد كل اختبار
ينبغي لكل اختبار تكامل أن ينظف أي بيانات أنشأها. استخدم نمط fixture الذي يعتمد على 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 وstaging. استخدم متغيرات البيئة ودالة مساعدة للإعدادات لاختيار الإعدادات الصحيحة تلقائيًا.
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) لتشغيل اختبارات الوحدات عند كل push، واختبارات التكامل وفق جدول زمني أو قبل الإصدارات. ويحقق ذلك توازنًا بين السرعة والتغطية.
# .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')ملخص أفضل ممارسات اختبارات التكامل
القواعد الأساسية لاختبارات تكامل موثوقة للوكلاء:
- استخدم دائمًا قواعد بيانات منفصلة للاختبار — وليس الإنتاج أبدًا
- نظّف بيانات الاختبار بعد كل اختبار باستخدام fixtures تعتمد على
yield - استخدم مفاتيح API مخصصة للاختبار ذات حصص محدودة
- استخدم علامات pytest للفصل بين اختبارات الوحدات السريعة واختبارات التكامل البطيئة
- شغّل اختبارات الوحدات عند كل push، واختبارات التكامل وفق جدول زمني
- استخدم Docker لبيئات قواعد البيانات النظيفة والقابلة للتخلص منها
اختبار المعرفة: اختبارات التكامل
اختبر مدى فهمك لاختبار التكامل لمسارات الوكلاء.
ملخص: اختبارات التكامل لمسارات الوكلاء
أصبحت لديك الآن المعرفة اللازمة لبناء مجموعة اختبارات تكامل متكاملة وموثوقة:
- استخدم
@pytest.mark.integrationلفصل الاختبارات البطيئة عن اختبارات الوحدات السريعة - اعزل بيانات الاختبار باستخدام قواعد بيانات مخصصة وfixtures للتنظيف
- استخدم Docker أو الخدمات المعزولة للحصول على بيئات نظيفة
- اضبط مفاتيح API الخاصة بالاختبار عبر متغيرات البيئة
- شغّل اختبارات الوحدات عند كل commit، واختبارات التكامل ليلًا في CI
- قِس التغطية باستخدام
pytest-covللعثور على المسارات غير المختبرة
يحافظ هرم الاختبار المنظم جيدًا على موثوقية وكيلك مع تطوره.
الأسئلة الشائعة
هل درس «اختبارات التكامل لمسارات الوكلاء» مجاني؟
نعم — نص درس «اختبارات التكامل لمسارات الوكلاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «اختبارات التكامل لمسارات الوكلاء»؟
اختبارات من البداية إلى النهاية مقابل خدمات حقيقية في بيئات اختبار معزولة تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «اختبارات التكامل لمسارات الوكلاء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا يختلف اختبار الوكلاء؟
- محاكاة استدعاءات LLM في الاختبارات
- اختبار الوكلاء القائم على التأكيدات
- اختبارات التكامل لمسارات الوكلاء