Python Testing
affaan-m/ECC
Python testing strategies using pytest, TDD methodology, fixtures, mocking, parametrization, and coverage requirements.
使用 pytest、TDD 方法论、固件(Fixtures)、模拟(Mocking)、参数化及覆盖率要求的 Python 测试策略。
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install xu-xiang/everything-claude-code-zh python-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .claude/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .claude/skills/python-testing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .claude/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install xu-xiang/everything-claude-code-zh python-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .agents/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .agents/skills/python-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .agents/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install xu-xiang/everything-claude-code-zh python-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .cursor/skills/python-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .cursor/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/xu-xiang/everything-claude-code-zh.git --path docs/ja-JP/skills/python-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install xu-xiang/everything-claude-code-zh python-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .gemini/skills/python-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .gemini/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install xu-xiang/everything-claude-code-zh python-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .github/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .github/skills/python-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .github/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install xu-xiang/everything-claude-code-zh python-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/docs/ja-JP/skills/python-testing .opencode/skills/python-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "python-testing" agent skill from https://github.com/xu-xiang/everything-claude-code-zh/tree/main/docs/ja-JP/skills/python-testing into .opencode/skills/python-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "python-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
python-testing使用 pytest、TDD 方法论、固件(Fixtures)、模拟(Mocking)、参数化及覆盖率要求的 Python 测试策略。
Python Testing is an agent skill from xu-xiang/everything-claude-code-zh. 使用 pytest、TDD 方法论、固件(Fixtures)、模拟(Mocking)、参数化及覆盖率要求的 Python 测试策略。
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Unit testing and Test-driven development. It works with Python and pytest. The repository describes itself as: everything-claude-code 中文翻译项目:完整的 Claude Code 配置集合(agents, skills, hooks, commands, rules, MCPs)。源自 Anthropic 黑客松获胜者的实战配置,助力中文工程师高效理解与使用 Claude Code。 The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit dfbf946. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pytestFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Python Testing loads about 3.9k tokens when it runs. Until then it costs about 20 tokens; SKILL.md has 211 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from xu-xiang/everything-claude-code-zh at commit dfbf946, republished under its MIT licence (© xu-xiang). 211 words, ~3,890 tokens.
.claude/skills/python-testing/SKILL.md (or your agent's skills folder).使用 pytest、TDD 方法论和最佳实践的 Python 应用程序全面测试策略。
始终遵循 TDD 循环。
# 步骤 1: 编写失败的测试 (RED)
def test_add_numbers():
result = add(2, 3)
assert result == 5
# 步骤 2: 编写最简单的实现 (GREEN)
def add(a, b):
return a + b
# 步骤 3: 必要时进行重构 (REFACTOR)pytest --cov 测量覆盖率pytest --cov=mypackage --cov-report=term-missing --cov-report=htmlimport pytest
def test_addition():
"""测试基本加法。"""
assert 2 + 2 == 4
def test_string_uppercase():
"""测试字符串大写转换。"""
text = "hello"
assert text.upper() == "HELLO"
def test_list_append():
"""测试列表追加。"""
items = [1, 2, 3]
items.append(4)
assert 4 in items
assert len(items) == 4# 相等
assert result == expected
# 不等
assert result != unexpected
# 真值
assert result # Truthy
assert not result # Falsy
assert result is True # 严格为 True
assert result is False # 严格为 False
assert result is None # 严格为 None
# 成员资格
assert item in collection
assert item not in collection
# 比较
assert result > 0
assert 0 <= result <= 100
# 类型检查
assert isinstance(result, str)
# 异常测试 (推荐方式)
with pytest.raises(ValueError):
raise ValueError("error message")
# 检查异常消息
with pytest.raises(ValueError, match="invalid input"):
raise ValueError("invalid input provided")
# 检查异常属性
with pytest.raises(ValueError) as exc_info:
raise ValueError("error message")
assert str(exc_info.value) == "error message"import pytest
@pytest.fixture
def sample_data():
"""提供示例数据的固件。"""
return {"name": "Alice", "age": 30}
def test_sample_data(sample_data):
"""使用固件进行测试。"""
assert sample_data["name"] == "Alice"
assert sample_data["age"] == 30@pytest.fixture
def database():
"""带有设置和拆卸功能的固件。"""
# 设置 (Setup)
db = Database(":memory:")
db.create_tables()
db.insert_test_data()
yield db # 提供给测试使用
# 拆卸 (Teardown)
db.close()
def test_database_query(database):
"""测试数据库操作。"""
result = database.query("SELECT * FROM users")
assert len(result) > 0# 函数作用域 (默认) - 每个测试运行一次
@pytest.fixture
def temp_file():
with open("temp.txt", "w") as f:
yield f
os.remove("temp.txt")
# 模块作用域 - 每个模块运行一次
@pytest.fixture(scope="module")
def module_db():
db = Database(":memory:")
db.create_tables()
yield db
db.close()
# 会话作用域 - 整个测试会话运行一次
@pytest.fixture(scope="session")
def shared_resource():
resource = ExpensiveResource()
yield resource
resource.cleanup()@pytest.fixture(params=[1, 2, 3])
def number(request):
"""参数化固件。"""
return request.param
def test_numbers(number):
"""测试运行 3 次,每个参数一次。"""
assert number > 0@pytest.fixture
def user():
return User(id=1, name="Alice")
@pytest.fixture
def admin():
return User(id=2, name="Admin", role="admin")
def test_user_admin_interaction(user, admin):
"""测试使用多个固件。"""
assert admin.can_manage(user)@pytest.fixture(autouse=True)
def reset_config():
"""在每个测试之前自动运行。"""
Config.reset()
yield
Config.cleanup()
def test_without_fixture_call():
# reset_config 自动运行
assert Config.get_setting("debug") is False# tests/conftest.py
import pytest
@pytest.fixture
def client():
"""所有测试共享的固件。"""
app = create_app(testing=True)
with app.test_client() as client:
yield client
@pytest.fixture
def auth_headers(client):
"""为 API 测试生成身份验证头。"""
response = client.post("/api/login", json={
"username": "test",
"password": "test"
})
token = response.json["token"]
return {"Authorization": f"Bearer {token}"}@pytest.mark.parametrize("input,expected", [
("hello", "HELLO"),
("world", "WORLD"),
("PyThOn", "PYTHON"),
])
def test_uppercase(input, expected):
"""使用不同的输入运行 3 次测试。"""
assert input.upper() == expected@pytest.mark.parametrize("a,b,expected", [
(2, 3, 5),
(0, 0, 0),
(-1, 1, 0),
(100, 200, 300),
])
def test_add(a, b, expected):
"""使用多个输入测试加法。"""
assert add(a, b) == expected@pytest.mark.parametrize("input,expected", [
("valid@email.com", True),
("invalid", False),
("@no-domain.com", False),
], ids=["valid-email", "missing-at", "missing-domain"])
def test_email_validation(input, expected):
"""使用可读的测试 ID 进行电子邮件验证测试。"""
assert is_valid_email(input) is expected@pytest.fixture(params=["sqlite", "postgresql", "mysql"])
def db(request):
"""针对多个数据库后端进行测试。"""
if request.param == "sqlite":
return Database(":memory:")
elif request.param == "postgresql":
return Database("postgresql://localhost/test")
elif request.param == "mysql":
return Database("mysql://localhost/test")
def test_database_operations(db):
"""测试运行 3 次,每个数据库一次。"""
result = db.query("SELECT 1")
assert result is not None# 标记耗时较长的测试
@pytest.mark.slow
def test_slow_operation():
time.sleep(5)
# 标记集成测试
@pytest.mark.integration
def test_api_integration():
response = requests.get("https://api.example.com")
assert response.status_code == 200
# 标记单元测试
@pytest.mark.unit
def test_unit_logic():
assert calculate(2, 3) == 5# 仅运行快速测试
pytest -m "not slow"
# 仅运行集成测试
pytest -m integration
# 运行集成测试或耗时测试
pytest -m "integration or slow"
# 运行标记为单元测试但不耗时的测试
pytest -m "unit and not slow"[pytest]
markers =
slow: 标记耗时较长的测试
integration: 标记集成测试
unit: 标记单元测试
django: 标记需要 Django 的测试from unittest.mock import patch, Mock
@patch("mypackage.external_api_call")
def test_with_mock(api_call_mock):
"""使用模拟的外部 API 进行测试。"""
api_call_mock.return_value = {"status": "success"}
result = my_function()
api_call_mock.assert_called_once()
assert result["status"] == "success"@patch("mypackage.Database.connect")
def test_database_connection(connect_mock):
"""使用模拟的数据库连接进行测试。"""
connect_mock.return_value = MockConnection()
db = Database()
db.connect()
connect_mock.assert_called_once_with("localhost")@patch("mypackage.api_call")
def test_api_error_handling(api_call_mock):
"""使用模拟的异常进行错误处理测试。"""
api_call_mock.side_effect = ConnectionError("Network error")
with pytest.raises(ConnectionError):
api_call()
api_call_mock.assert_called_once()@patch("builtins.open", new_callable=mock_open)
def test_file_reading(mock_file):
"""使用模拟的 open 进行文件读取测试。"""
mock_file.return_value.read.return_value = "file content"
result = read_file("test.txt")
mock_file.assert_called_once_with("test.txt", "r")
assert result == "file content"@patch("mypackage.DBConnection", autospec=True)
def test_autospec(db_mock):
"""使用 autospec 捕获 API 误用。"""
db = db_mock.return_value
db.query("SELECT * FROM users")
# 如果 DBConnection 没有 query 方法,此处将失败
db_mock.assert_called_once()class TestUserService:
@patch("mypackage.UserRepository")
def test_create_user(self, repo_mock):
"""使用模拟的仓库测试用户创建。"""
repo_mock.return_value.save.return_value = User(id=1, name="Alice")
service = UserService(repo_mock.return_value)
user = service.create_user(name="Alice")
assert user.name == "Alice"
repo_mock.return_value.save.assert_called_once()@pytest.fixture
def mock_config():
"""创建一个带有属性的模拟对象。"""
config = Mock()
type(config).debug = PropertyMock(return_value=True)
type(config).api_key = PropertyMock(return_value="test-key")
return config
def test_with_mock_config(mock_config):
"""测试模拟的配置属性。"""
assert mock_config.debug is True
assert mock_config.api_key == "test-key"import pytest
@pytest.mark.asyncio
async def test_async_function():
"""测试异步函数。"""
result = await async_add(2, 3)
assert result == 5
@pytest.mark.asyncio
async def test_async_with_fixture(async_client):
"""使用异步固件进行异步测试。"""
response = await async_client.get("/api/users")
assert response.status_code == 200@pytest.fixture
async def async_client():
"""提供异步测试客户端的异步固件。"""
app = create_app()
async with app.test_client() as client:
yield client
@pytest.mark.asyncio
async def test_api_endpoint(async_client):
"""测试使用异步固件。"""
response = await async_client.get("/api/data")
assert response.status_code == 200@pytest.mark.asyncio
@patch("mypackage.async_api_call")
async def test_async_mock(api_call_mock):
"""使用模拟对象测试异步函数。"""
api_call_mock.return_value = {"status": "ok"}
result = await my_async_function()
api_call_mock.assert_awaited_once()
assert result["status"] == "ok"def test_divide_by_zero():
"""测试除以零是否引发 ZeroDivisionError。"""
with pytest.raises(ZeroDivisionError):
divide(10, 0)
def test_custom_exception():
"""测试带有消息的自定义异常。"""
with pytest.raises(ValueError, match="invalid input"):
validate_input("invalid")def test_exception_with_details():
"""测试带有自定义属性的异常。"""
with pytest.raises(CustomError) as exc_info:
raise CustomError("error", code=400)
assert exc_info.value.code == 400
assert "error" in str(exc_info.value)import tempfile
import os
def test_file_processing():
"""使用临时文件测试文件处理。"""
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as f:
f.write("test content")
temp_path = f.name
try:
result = process_file(temp_path)
assert result == "processed: test content"
finally:
os.unlink(temp_path)def test_with_tmp_path(tmp_path):
"""使用 pytest 内置的临时路径固件进行测试。"""
test_file = tmp_path / "test.txt"
test_file.write_text("hello world")
result = process_file(str(test_file))
assert result == "hello world"
# tmp_path 会自动清理def test_with_tmpdir(tmpdir):
"""使用 pytest 的 tmpdir 固件进行测试。"""
test_file = tmpdir.join("test.txt")
test_file.write("data")
result = process_file(str(test_file))
assert result == "data"tests/
├── conftest.py # 共享固件
├── __init__.py
├── unit/ # 单元测试
│ ├── __init__.py
│ ├── test_models.py
│ ├── test_utils.py
│ └── test_services.py
├── integration/ # 集成测试
│ ├── __init__.py
│ ├── test_api.py
│ └── test_database.py
└── e2e/ # 端到端测试
├── __init__.py
└── test_user_flow.pyclass TestUserService:
"""在类中组织相关的测试。"""
@pytest.fixture(autouse=True)
def setup(self):
"""在此类的每个测试之前运行设置。"""
self.service = UserService()
def test_create_user(self):
"""测试用户创建。"""
user = self.service.create_user("Alice")
assert user.name == "Alice"
def test_delete_user(self):
"""测试用户删除。"""
user = User(id=1, name="Bob")
self.service.delete_user(user)
assert not self.service.user_exists(1)test_user_login_with_invalid_credentials_failspytest.raises@pytest.fixture
def client():
app = create_app(testing=True)
return app.test_client()
def test_get_user(client):
response = client.get("/api/users/1")
assert response.status_code == 200
assert response.json["id"] == 1
def test_create_user(client):
response = client.post("/api/users", json={
"name": "Alice",
"email": "alice@example.com"
})
assert response.status_code == 201
assert response.json["name"] == "Alice"@pytest.fixture
def db_session():
"""创建测试数据库会话。"""
session = Session(bind=engine)
session.begin_nested()
yield session
session.rollback()
session.close()
def test_create_user(db_session):
user = User(name="Alice", email="alice@example.com")
db_session.add(user)
db_session.commit()
retrieved = db_session.query(User).filter_by(name="Alice").first()
assert retrieved.email == "alice@example.com"class TestCalculator:
@pytest.fixture
def calculator(self):
return Calculator()
def test_add(self, calculator):
assert calculator.add(2, 3) == 5
def test_divide_by_zero(self, calculator):
with pytest.raises(ZeroDivisionError):
calculator.divide(10, 0)[pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
addopts =
--strict-markers
--disable-warnings
--cov=mypackage
--cov-report=term-missing
--cov-report=html
markers =
slow: 标记耗时较长的测试
integration: 标记集成测试
unit: 标记单元测试[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
"--strict-markers",
"--cov=mypackage",
"--cov-report=term-missing",
"--cov-report=html",
]
markers = [
"slow: 标记耗时较长的测试",
"integration: 标记集成测试",
"unit: 标记单元测试",
]# 运行所有测试
pytest
# 运行特定文件
pytest tests/test_utils.py
# 运行特定测试项
pytest tests/test_utils.py::test_function
# 运行并显示详细输出
pytest -v
# 运行并检查覆盖率
pytest --cov=mypackage --cov-report=html
# 仅运行快速测试
pytest -m "not slow"
# 遇到第一个失败即停止
pytest -x
# 遇到 N 个失败后停止
pytest --maxfail=3
# 运行上次失败的测试
pytest --lf
# 按模式匹配运行测试
pytest -k "test_user"
# 失败时启动调试器
pytest --pdb| 模式 | 用法 |
|---|---|
pytest.raises() | 测试预期异常 |
@pytest.fixture() | 创建可重用的测试固件 |
@pytest.mark.parametrize() | 使用多组输入运行测试 |
@pytest.mark.slow | 标记耗时较长的测试 |
pytest -m "not slow" | 跳过耗时测试 |
@patch() | 模拟函数和类 |
tmp_path 固件 | 自动生成的临时目录 |
pytest --cov | 生成覆盖率报告 |
assert | 简单易读的断言 |
请记住: 测试也是代码。请保持它们整洁、易读且可维护。好的测试能发现 Bug,而优秀的测试能预防 Bug。
© xu-xiang, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in docs/ja-JP/skills/python-testing of xu-xiang/everything-claude-code-zh.
Open the folder on GitHubat commit dfbf946
Python Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Python Testing this skillxu-xiang/everything-claude-code-zh | 2k | — | ~3.9k | Automated safety check: Pass | MIT | |
| Python Testingaffaan-m/ECC | 274k | 6 repos | ~4.7k | Automated safety check: Pass | MIT | |
| Python Testingaffaan-m/ECC | 274k | 3 repos | ~4.2k | Automated safety check: Pass | MIT | |
| Agent-Core Python TestingopenJiuwen-ai/agent-core | 441 | — | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| Python Testing Patternsjh941213/my-cc-harness | 126 | 16 repos | ~5.4k | Automated safety check: Pass | None | |
| Python Testingaffaan-m/ECC | 274k | 2 repos | ~4.3k | Automated safety check: Pass | MIT |
affaan-m/ECC
Python testing strategies using pytest, TDD methodology, fixtures, mocking, parametrization, and coverage requirements.
affaan-m/ECC
使用pytest的Python测试策略,包括TDD方法、夹具、模拟、参数化和覆盖率要求. An agent skill from affaan-m/ECC.
openJiuwen-ai/agent-core
Pytest patterns for the agent-core codebase: a red-green-refactor workflow, conftest fixtures, custom marks, monkeypatch and patch mocking, and async tests.
jh941213/my-cc-harness
Implement comprehensive testing strategies with pytest, fixtures, mocking, and test-driven development.
affaan-m/ECC
pytest、TDD手法、フィクスチャ、モック、パラメータ化、カバレッジ要件を使用したPythonテスト戦略. An agent skill from affaan-m/ECC.
affaan-m/ECC
pytest, TDD metodolojisi, fixture'lar, mocking, parametrizasyon ve coverage gereksinimleri kullanarak Python test stratejileri.
xu-xiang/everything-claude-code-zh
Everything Claude Code 的交互式安装程序 — 引导用户选择并安装技能和规则到用户级或项目级目录,验证路径,并可选择优化已安装文件。
xu-xiang/everything-claude-code-zh
基于本能(Instinct)的学习系统,通过钩子(hooks)观察会话,创建带有置信度评分的原子本能,并将其演化为技能(Skills)、命令(Commands)或智能体(Agents)。v2.1 版本增加了项目作用域(project-scoped)的本能,以防止跨项目污染。
xu-xiang/everything-claude-code-zh
生产级 API 的 REST API 设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和速率限制. An agent skill from xu-xiang/everything-claude-code-zh.
xu-xiang/everything-claude-code-zh
后端架构模式、API 设计、数据库优化以及适用于 Node.js、Express 和 Next.js API 路由的服务端最佳实践。
xu-xiang/everything-claude-code-zh
后端架构模式、API 设计、数据库优化以及 Node.js、Express 和 Next.js API 路由的服务端最佳实践。
xu-xiang/everything-claude-code-zh
后端架构模式、API 设计、数据库优化以及针对 Node.js、Express 和 Next.js API 路由的服务端最佳实践。
Categories
使用 pytest、TDD 方法论、固件(Fixtures)、模拟(Mocking)、参数化及覆盖率要求的 Python 测试策略。. Python Testing is an agent skill from xu-xiang/everything-claude-code-zh.
Python Testing fits situations like: tasks that involve Unit testing; tasks that involve Test-driven development.
Run `npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a claude-code`. Or copy the skill folder (docs/ja-JP/skills/python-testing in xu-xiang/everything-claude-code-zh) into .claude/skills/python-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a codex`. Or copy the skill folder (docs/ja-JP/skills/python-testing in xu-xiang/everything-claude-code-zh) into .agents/skills/python-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add xu-xiang/everything-claude-code-zh --skill python-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/python-testing, .gemini/skills/python-testing, .github/skills/python-testing and .opencode/skills/python-testing in your project.
Going by SKILL.md and its folder, Python Testing needs the command-line tools its instructions call (pytest). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Python Testing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Python Testing: Python Testing (affaan-m/ECC, 274k stars), Python Testing (affaan-m/ECC, 274k stars), Agent-Core Python Testing (openJiuwen-ai/agent-core, 441 stars) and Python Testing Patterns (jh941213/my-cc-harness, 126 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
xu-xiang (a GitHub user) maintains it in xu-xiang/everything-claude-code-zh, which has 1,971 GitHub stars. The repository holds 78 skills in this directory. The repository was last updated on March 5, 2026.
Source: xu-xiang/everything-claude-code-zh on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.