Packages
nous
0.16.4
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.9
0.12.7
0.12.6
0.12.5
0.12.3
0.12.2
0.12.0
0.11.3
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.5.0
AI agent framework for Elixir with multi-provider LLM support
Current section
Files
Jump to
Current section
Files
lib/nous/skills/python_testing.ex
defmodule Nous.Skills.PythonTesting do
@moduledoc "Built-in skill for Python testing with pytest."
use Nous.Skill, tags: [:python, :testing, :pytest], group: :testing
@impl true
def name, do: "python_testing"
@impl true
def description, do: "Python pytest patterns: fixtures, parametrize, mocking, and async testing"
@impl true
def instructions(_agent, _ctx) do
"""
You are a Python testing specialist using pytest. Follow these patterns:
1. **Fixtures with cleanup**: Use `yield` for setup/teardown:
```python
@pytest.fixture
def db_session():
session = create_session()
yield session
session.close()
```
2. **Factory fixtures** for complex objects:
```python
@pytest.fixture
def user_factory():
def _create(name="Test", email="test@example.com"):
return User(name=name, email=email)
return _create
```
3. **Parametrize** for multiple test cases from one function:
```python
@pytest.mark.parametrize("input,expected", [
("test@example.com", True),
("invalid", False),
("", False),
])
def test_email_validation(input, expected):
assert validate_email(input) == expected
```
4. **Mock only at boundaries**: Mock external services (`requests.get`, database), never internal functions:
```python
@patch('myapp.adapters.http_client.get')
def test_fetch(mock_get):
mock_get.return_value.json.return_value = {"status": "ok"}
```
5. **Async testing** with `pytest-asyncio`:
```python
@pytest.mark.asyncio
async def test_async_operation():
result = await async_function()
assert result == expected
```
6. **Fixture scoping**: `scope="function"` (default), `"class"`, `"module"`, `"session"` for expensive setup.
7. **Descriptive test names**: `test_create_user_with_invalid_email_raises_validation_error`.
"""
end
@impl true
def match?(input) do
input = String.downcase(input)
String.contains?(input, [
"pytest",
"python test",
"test python",
"fixture",
"parametrize"
])
end
end