pytest-skill – skill Lập trình cho agent AI
Tạo test pytest chuẩn production bằng Python, với fixtures, parametrize, markers, mocking và các mẫu conftest. Dùng khi người dùng nhắc đến \"pytest\", \"conftest\", \"@pytest.fixture\", \"@pytest.mark\", \"Python test\".
Cài skill pytest-skill bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/pytest-skill-ae395.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /pytest-skill – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/pytest-skill-ae395.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $pytest-skill – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/pytest-skill-ae395.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /pytest-skill – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/pytest-skill-ae395.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /pytest-skill – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
Pytest Testing Skill
When to Use
Use this skill when you need generates production-grade pytest tests in Python with fixtures, parametrize, markers, mocking, and conftest patterns. Use when user mentions "pytest", "conftest", "@pytest.fixture", "@pytest.mark", "Python test". Triggers on: "pytest", "conftest", "Python test", "parametrize", "Python fixtures".
Examples with Calculator, Database, APIClient or myapp functions require the project’s actual imports; they are patterns, not a bundled application. Inspect tests/conftest/plugins before running: collection imports code and tests can send email, mutate databases or call external APIs. Use synthetic fixtures and isolated targets; mock at the namespace where the code looks up a dependency. pytest-mock, pytest-asyncio, pytest-cov and pytest-xdist are optional plugins required by their specific examples.
Core Patterns
Basic Test
import pytest
def test_addition():
assert 2 + 3 == 5
def test_exception():
with pytest.raises(ValueError, match="invalid literal"):
int("not_a_number")
class TestCalculator:
def test_add(self):
calc = Calculator()
assert calc.add(2, 3) == 5
def test_divide_by_zero(self):
with pytest.raises(ZeroDivisionError):
Calculator().divide(10, 0)Fixtures
@pytest.fixture
def calculator():
return Calculator()
@pytest.fixture
def db_connection():
conn = Database.connect("test_db")
try:
yield conn
finally:
try:
conn.rollback()
finally:
conn.close()
@pytest.fixture(scope="module")
def api_client():
client = APIClient(base_url="http://localhost:8000")
yield client
client.logout()
# conftest.py - shared fixtures
@pytest.fixture(autouse=True)
def reset_state():
State.reset()
yield
State.cleanup()
# Usage
def test_add(calculator):
assert calculator.add(2, 3) == 5Parametrize
@pytest.mark.parametrize("input,expected", [
("hello", 5), ("", 0), ("pytest", 6),
])
def test_string_length(input, expected):
assert len(input) == expected
@pytest.mark.parametrize("a,b,expected", [
(2, 3, 5), (-1, 1, 0), (0, 0, 0),
])
def test_add(calculator, a, b, expected):
assert calculator.add(a, b) == expectedMarkers
@pytest.mark.slow
def test_large_dataset(): ...
@pytest.mark.skip(reason="Not implemented")
def test_future_feature(): ...
import sys
@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_permissions(): ...
@pytest.mark.xfail(reason="Known bug #123")
def test_known_bug(): ...Mocking
from unittest.mock import patch, MagicMock
def test_send_email(mocker):
mock_smtp = mocker.patch("myapp.email.smtplib.SMTP")
send_welcome_email("[email protected]")
mock_smtp.return_value.sendmail.assert_called_once()
def test_api_call(mocker):
mock_response = mocker.Mock()
mock_response.status_code = 200
mock_response.json.return_value = {"users": [{"name": "Alice"}]}
mocker.patch("myapp.service.requests.get", return_value=mock_response)
users = get_users()
assert len(users) == 1
@patch("myapp.service.database")
def test_save_user(mock_db):
mock_db.save.return_value = True
assert save_user({"name": "Alice"}) is True
mock_db.save.assert_called_once()Assertions
assert x == y
assert x != y
assert x in collection
assert isinstance(obj, MyClass)
assert 0.1 + 0.2 == pytest.approx(0.3)
with pytest.raises(ValueError) as exc_info:
raise ValueError("bad")
assert "bad" in str(exc_info.value)Anti-Patterns
| Bad | Good | Why |
|-----|------|-----|
| self.assertEqual() | assert x == y | pytest rewrites give better output |
| Setup in __init__ | @pytest.fixture | Lifecycle management |
| Global state | Fixture with yield | Proper cleanup |
| Huge test functions | Small focused tests | Easier debugging |
Quick Reference
| Task | Command |
|------|---------|
| Run all | pytest |
| Run file | pytest tests/test_login.py |
| Run specific | pytest tests/test_login.py::test_login_success |
| By marker | pytest -m slow |
| By keyword | pytest -k "login and not invalid" |
| Verbose | pytest -v |
| Stop first fail | pytest -x |
| Last failed | pytest --lf |
| Coverage | pytest --cov=myapp --cov-report=html |
| Parallel | pytest -n auto (pytest-xdist) |
pyproject.toml
[tool.pytest.ini_options]
testpaths = ["tests"]
markers = ["slow: slow tests", "integration: integration tests"]
addopts = "-v --tb=short"Deep Patterns
For production-grade patterns, see reference/playbook.md:
| Section | What's Inside |
|---------|--------------|
| §1 Config | pytest.ini + pyproject.toml with markers, coverage |
| §2 Fixtures | Scoping, factories, teardown, autouse, tmp_path |
| §3 Parametrize | Basic, with IDs, cartesian, indirect |
| §4 Mocking | pytest-mock, monkeypatch, spies, env vars |
| §5 Async | pytest-asyncio, async fixtures, async client |
| §6 Exceptions | pytest.raises(match=), warnings |
| §7 Markers & Plugins | Custom markers, collection hooks |
| §8 Class-Based | Nested classes, autouse setup |
| §9 CI/CD | GitHub Actions matrix, coverage gates |
| §10 Debugging Table | 10 common problems with fixes |
| §11 Best Practices | 15-item production checklist |
Limitations
- Use this skill only when the task clearly matches its upstream source and local project context.
- Verify commands, generated code, dependencies, credentials, and external service behavior before applying changes.
- Do not treat examples as a substitute for environment-specific tests, security review, or user approval for destructive or costly actions.
Skill liên quan
- python – Hướng dẫn super-code theo ngôn ngữ cho Python.
- python-development – Bạn là chuyên gia kiến trúc dự án Python, chuyên khởi tạo ứng dụng Python sẵn sàng…
- python-development-python-scaffold – Bạn là chuyên gia kiến trúc dự án Python, chuyên khởi tạo ứng dụng Python sẵn sàng…
- python-fastapi-development – Phát triển backend Python FastAPI với mẫu async, SQLAlchemy, Pydantic, xác thực và các…
- python-packaging – Hướng dẫn toàn diện cách tạo, cấu trúc và phân phối package Python bằng công cụ đóng gói…
- python-patterns – Nguyên tắc phát triển Python và cách ra quyết định. Chọn framework, mẫu async, type…
- python-performance-optimization – Profile và tối ưu code Python bằng cProfile, công cụ đo bộ nhớ và best practice về hiệu…
- python-pro – Thành thạo Python 3.12+ với tính năng hiện đại, async, tối ưu hiệu năng và thực hành sẵn…