mcpField
P
pytest-skill

pytest-skill

github.com/lambdatestTesting & quality384420 installsUpdated 2w ago
Repository

About pytest-skill

pytest-skill is a reference skill for writing and running Python tests with pytest. It covers core testing patterns and points to a playbook for more advanced practices.

Key features

  1. 01Fixtures and teardown
  2. 02Parameterized tests and markers
  3. 03Mocking and assertion patterns
  4. 04Commands for test selection and coverage
  5. 05Advanced patterns in reference/playbook.md

Use cases

  1. 01Create reusable test setup and cleanup
  2. 02Test inputs and expected results in batches
  3. 03Mock external calls and check exceptions
  4. 04Run selected tests or measure coverage

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/lambdatest/agent-skills --skill pytest-skill

After installing, type/pytest-skillin Claude Code to confirm it loaded.

Bundled filesreference/advanced-patterns.mdreference/playbook.md

Details

From the project README

Pytest Testing Skill

Core Patterns

Basic Test
import pytest

def test_addition():
    assert 2 + 3 == 5

def test_exception():
    with pytest.raises(ValueError, match="invalid"):
        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")
    yield conn  # teardown after yield
    conn.rollback()
    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) == 5
Parametrize
@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) == expected
Markers
@pytest.mark.slow
def test_large_dataset(): ...

@pytest.mark.skip(reason="Not implemented")
def test_future_feature(): ...

@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
BadGoodWhy
self.assertEqual()assert x == ypytest rewrites give better output
Setup in __init__@pytest.fixtureLifecycle management
Global stateFixture with yieldProper cleanup
Huge test functionsSmall focused testsEasier debugging

Quick Reference

TaskCommand
Run allpytest
Run filepytest tests/test_login.py
Run specificpytest tests/test_login.py::test_login_success
By markerpytest -m slow
By keywordpytest -k "login and not invalid"
Verbosepytest -v
Stop first failpytest -x
Last failedpytest --lf
Coveragepytest --cov=myapp --cov-report=html
Parallelpytest -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:

SectionWhat's Inside
§1 Configpytest.ini + pyproject.toml with markers, coverage
§2 FixturesScoping, factories, teardown, autouse, tmp_path
§3 ParametrizeBasic, with IDs, cartesian, indirect
§4 Mockingpytest-mock, monkeypatch, spies, env vars
§5 Asyncpytest-asyncio, async fixtures, async client
§6 Exceptionspytest.raises(match=), warnings
§7 Markers & PluginsCustom markers, collection hooks
§8 Class-BasedNested classes, autouse setup
§9 CI/CDGitHub Actions matrix, coverage gates
§10 Debugging Table10 common problems with fixes
§11 Best Practices15-item production checklist

Comments

Markdown supported