Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsBlogPro
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Authors
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges
  • Chrome Extension
  • Skill Manager

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

ProTermsPrivacyRefunds
Back to skills

Python Testing Pytest

ASecurity

当为 Python 项目搭建 pytest 测试体系、写单元/集成测试或 mock 外部依赖时使用;用 fixture/参数化/mock/monkeypatch 按 AAA 模式产出可执行测试、conftest 与覆盖率配置;不适用于非 Python 语言或拿测试替代环境验证与专家评审。触发词:pytest、fixture、参数化、mock、覆盖率

3 stars
0 votes
0 copies
1 views
Added 9/19/2026
ai-agentsjavascriptpythongojavabashsqlfastapidjangotestingapi

Works with

cursorcliapi

Security Analysis

A96/100
mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned 9/19/2026

$npx -y skills add findscripter/everything-skills --skill python-testing-pytest --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Python Testing Pytest?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Python Testing Pytest
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/findscripter-python-testing-pytest/badge)](https://www.skillsdirectory.com/skills/findscripter-python-testing-pytest)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
Files
SKILL.md
---
name: python-testing-pytest
title: Python pytest 测试模式
description: 当为 Python 项目搭建 pytest 测试体系、写单元/集成测试或 mock 外部依赖时使用;用 fixture/参数化/mock/monkeypatch 按 AAA 模式产出可执行测试、conftest 与覆盖率配置;不适用于非 Python 语言或拿测试替代环境验证与专家评审。触发词:pytest、fixture、参数化、mock、覆盖率
domain: 研发/testing
triggers: [写单元测试, 搭建 pytest 测试, fixture 夹具, 参数化测试, mock 依赖, monkeypatch, 测试覆盖率, pytest-cov, 测试异常, 异步测试 asyncio, 属性测试 hypothesis, conftest, tmp_path 临时文件, 测试数据库, TDD]
tags: [测试, python, pytest, fixture, mock, 参数化, 覆盖率, tdd, 单元测试, 集成测试]
level: 进阶
status: stable
agents: [claude-code, codex, cursor, gemini-cli]
tools: [python, pytest, pytest-cov, pytest-asyncio, pytest-mock, hypothesis]
requires: []
related: [javascript-testing-patterns, test-coverage-gap-finder, api-test-suite-builder, async-python-patterns]
combines_with: [fastapi-async-api, django-async-pro, test-coverage-gap-finder]
license: MIT
source: sickn33/agentic-awesome-skills
source_license: MIT
---
## 何时使用

- 为 Python 函数/类写单元测试,或搭建测试套件与测试基础设施。
- 实践 TDD(先写测试再实现),或为 API/服务写集成测试。
- 需要 mock 外部依赖(HTTP、环境变量、对象属性),测试异步代码、数据库操作。
- 引入参数化降低重复,或用属性测试(hypothesis)覆盖更大输入空间。
- 配置 CI/CD 持续测试与覆盖率门槛,排查失败用例。

不该用:

- 任务与 Python 测试无关,或目标语言是 JS/TS(改用 `javascript-testing-patterns`)等其他栈。
- 把通过测试当成环境特定验证、上线验收或专家评审的替代品——测试只覆盖你断言到的路径。
- 缺少明确的被测目标、成功判据或所需输入时,先澄清再动手。

## 步骤 / 指令

1. 选测试类型:单元(隔离测函数/类)/ 集成(测组件交互)/ 端到端 / 性能。优先单元,金字塔下宽上窄。
2. 单测按 **AAA** 写:Arrange 准备数据与前置 → Act 执行被测代码 → Assert 验证结果。命名描述「行为」:`test_login_fails_with_invalid_password`,别用 `test_1`。
3. 重复的 setup/teardown 抽成 `@pytest.fixture`(用 `yield` 分隔 setup/teardown),按需设 `scope`(function/module/session);跨文件共享放 `conftest.py`。
4. 同逻辑多输入用 `@pytest.mark.parametrize`,特殊用例用 `pytest.param(..., id=...)` 命名。
5. 隔离外部副作用:HTTP/SDK 用 `unittest.mock`(`patch`/`Mock`/`side_effect`);环境变量与对象属性用内置 `monkeypatch`(`setenv`/`delenv`/`setattr`);临时文件用 `tmp_path`。
6. 异常路径用 `pytest.raises(Exc, match="...")`,需要细节时 `as exc_info` 取 `exc_info.value`。
7. 异步代码用 `pytest-asyncio`:测试与 fixture 加 `@pytest.mark.asyncio`,并发用 `asyncio.gather`。
8. 用 `marks`(slow/integration/...)分类,`pytest.ini` 里 `--strict-markers` 防拼错;跑 `pytest -m "not slow"` 等筛选。
9. 接 `pytest-cov` 量覆盖率,CI 上 `--cov-fail-under=80` 卡门槛,关注质量而非纯百分比。
10. 保持测试**独立**:无共享状态、各自清理;测试先行或与代码同步写。

## 示例

最小用例 + fixture + 参数化 + mock + 异常:

```python
# test_demo.py
import pytest
from unittest.mock import patch, Mock
import requests

class Calculator:
    def add(self, a, b): return a + b
    def divide(self, a, b):
        if b == 0: raise ValueError("Cannot divide by zero")
        return a / b

@pytest.fixture
def calc():            # setup → yield → teardown
    c = Calculator()
    yield c

@pytest.mark.parametrize("a,b,expected", [(2, 3, 5), (-1, 1, 0), (0, 0, 0)])
def test_add(calc, a, b, expected):       # AAA + 参数化
    assert calc.add(a, b) == expected

def test_divide_by_zero(calc):            # 测异常
    with pytest.raises(ValueError, match="Cannot divide by zero"):
        calc.divide(5, 0)

def test_http_mock():                     # mock 外部依赖
    resp = Mock()
    resp.json.return_value = {"id": 1}
    resp.raise_for_status.return_value = None
    with patch("requests.get", return_value=resp) as m:
        assert requests.get("http://x/users/1").json()["id"] == 1
        m.assert_called_once_with("http://x/users/1")
```

环境变量 / 临时文件 / 异步:

```python
def test_env(monkeypatch):
    monkeypatch.setenv("DATABASE_URL", "postgresql://localhost/test")
    monkeypatch.delenv("CACHE", raising=False)

def test_file(tmp_path):
    f = tmp_path / "a.txt"; f.write_text("hi")
    assert f.read_text() == "hi"

@pytest.mark.asyncio
async def test_async():
    import asyncio
    results = await asyncio.gather(*(asyncio.sleep(0, r) for r in (1, 2, 3)))
    assert results == [1, 2, 3]
```

属性测试(hypothesis):

```python
from hypothesis import given, strategies as st

@given(st.text())
def test_reverse_twice(s):
    assert s[::-1][::-1] == s
```

覆盖率与配置:

```bash
pip install pytest-cov
pytest --cov=myapp --cov-report=term-missing --cov-fail-under=80 tests/
```

```ini
# pytest.ini
[pytest]
testpaths = tests
python_files = test_*.py
addopts = -v --strict-markers --tb=short --cov=myapp --cov-report=term-missing
markers =
    slow: marks tests as slow
    integration: marks integration tests
```

## 注意事项

- **隔离优先**:测试间不共享可变状态,每个用例自清理;fixture 用 `yield` 而非 setup/teardown 函数,确保异常时也能清理。
- **mock 打在使用处**:`patch` 的目标是「被测模块引用该符号的路径」,不是定义处(例如被测代码 `import requests` 后用 `requests.get`,则 patch `requests.get`)。
- 断言尽量**一个用例一个行为**;多断言时确保它们描述同一行为,否则拆开。
- `--strict-markers` 防止 marker 拼写错误被静默忽略;新 marker 要在配置里登记。
- 覆盖率是手段不是目的:80% 绿了不代表逻辑对,重点补「未测的分支与错误路径」。
- 异步测试需装 `pytest-asyncio` 且函数/fixture 都打 `@pytest.mark.asyncio`,否则协程不会被 await。
- 测试不能替代环境特定验证;缺前置条件、权限或成功判据时停下来澄清。

## 互见

- related:`async-python-patterns` —— 异步代码的测试常配合此栈的 asyncio 写法。
- related:`javascript-testing-patterns` —— 同源姊妹篇,JS/TS 侧的等价测试模式。
- combines_with:`test-coverage-gap-finder` —— 找出未覆盖路径后回到本技能补齐用例。
- combines_with:`ci-cd-pipeline-builder` —— 把 pytest + 覆盖率门槛接入 CI/CD 持续运行。
- combines_with:`systematic-debugger` —— 用例失败时用系统化排错定位根因。

---
采编自 sickn33/antigravity-awesome-skills(MIT)。

Attribution

findscripterfindscripter
View sourceSee grades on GitHubMore from findscripter →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Caveman

Terse caveman voice: answer first, fluff gone, every technical fact kept. Use for /caveman, "caveman mode", "talk like caveman", "be brief", "less tokens". Stays on until "stop caveman" or "normal mode".

1100021 votes

Hyperplan

Adversarial multi-agent planning skill. Self-orchestrates 5 hostile category members (unspecified-low, unspecified-high, deep, ultrabrain, artistry) via team-mode for ruthless cross-critique debate, distills only the defensible insights, then MANDATORILY hands the distilled insight bundle to the `plan` agent for executable plan formalization. Use when planning needs maximum rigor and surfacing of weak assumptions, blind spots, and over-engineering. Triggers: 'hyperplan', 'hpp', '/hyperplan', ...

698621 votes

Writing Skills

Create and manage Claude Code skills in HASH repository following Anthropic best practices. Use when creating new skills, modifying skill-rules.json, understanding trigger patterns, working with hooks, debugging skill activation, or implementing progressive disclosure. Covers skill structure, YAML frontmatter, trigger types (keywords, intent patterns), UserPromptSubmit hook, and the 500-line rule. Includes validation and debugging with SKILL_DEBUG. Examples include rust-error-stack, cargo-dep...

3931 votes

Mcp Code Execution

Routes multi-tool workflows through MCP servers for large datasets and pipelines. Use when Bash tool overhead is limiting throughput on data-heavy tasks.

3421 votes

catchup

Recovers the conversation and failed tool calls of a previous Codex, Amp, Claude Code, Antigravity, Cline, Copilot CLI, Cursor, DeepSeek Harness, Grok Build, Kimi, OpenCode, Pi Agent, or ZCode session. Use when the user says "catch up", "what did the last session do", "get me up to speed", "I switched agents", asks to recover/summarize a previous session before continuing, or asks to diagnose or report a catchup failure. Do NOT use for the current conversation, git history, or any non-agent log.

741 votes
View all in ai-agents →