ワンクリックで
test-aaa-structure
Apply Arrange-Act-Assert pattern for clear, maintainable tests with detailed guidance
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Apply Arrange-Act-Assert pattern for clear, maintainable tests with detailed guidance
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Run a genuinely-parallel multiagent implementation - plan, gate on environment, spawn subagents concurrently, aggregate
Run a genuinely-parallel multiagent implementation with detailed guidance - plan, gate on environment, spawn subagents concurrently, aggregate, and debug/retry
Detect anomalies in data
Detect anomalies in data
Harden APIs against attacks
Harden APIs against attacks
| name | test-aaa-structure |
| description | Apply Arrange-Act-Assert pattern for clear, maintainable tests with detailed guidance |
| languages | ["python","typescript","javascript","go","rust","java","csharp","php","ruby"] |
| subagents | ["test/unit","test/integration","code/feature"] |
| tools_needed | ["read","write"] |
Arrange-Act-Assert (AAA) is the gold standard for structuring tests. It makes tests:
Purpose: Prepare everything needed for the test.
What to do:
Example:
# Arrange
user = User(id="123", name="Alice", role="admin")
db.save(user)
mock_logger = Mock(Logger)
Purpose: Call the thing you're testing.
What to do:
Example:
# Act
result = get_user_by_id("123")
Common Mistake: ❌ Calling multiple functions in Act Correct: ✅ One function call - if you need multiple, you need multiple tests
Purpose: Check that the behavior is correct.
What to do:
Example:
# Assert
assert result.name == "Alice"
assert result.role == "admin"
assert mock_logger.log.called_once()
Each test should verify ONE behavior.
✅ Good:
def test_get_user_returns_correct_name():
user = User(id="1", name="Alice")
db.save(user)
result = get_user_by_id("1")
assert result.name == "Alice"
def test_get_user_returns_correct_role():
user = User(id="1", role="admin")
db.save(user)
result = get_user_by_id("1")
assert result.role == "admin"
❌ Bad:
def test_get_user(): # What does this test? Unclear!
user = User(id="1", name="Alice", role="admin")
db.save(user)
result = get_user_by_id("1")
assert result.name == "Alice" # Multiple unrelated assertions
assert result.role == "admin"
assert result.id == "1"
Exception: Multiple assertions are OK if testing a single concept:
def test_user_creation_sets_all_required_fields():
user = create_user(name="Alice", email="alice@example.com")
assert user.name == "Alice" # All part of "creation"
assert user.email == "alice@example.com"
assert user.created_at is not None
Test names should read like documentation.
Pattern: test_{what}_{does}_{when}_{condition}
✅ Good:
test_get_user_returns_user_when_foundtest_get_user_returns_none_when_not_foundtest_get_user_raises_error_when_database_unavailable❌ Bad:
test_get_user (what does it test?)test1, test2 (meaningless)test_success (success of what?)Separate AAA sections for readability.
✅ Option 1: Comments
def test_calculate_total_includes_tax():
# Arrange
cart = Cart()
cart.add_item(Item(price=100))
# Act
total = cart.calculate_total(tax_rate=0.1)
# Assert
assert total == 110
✅ Option 2: Blank lines
def test_calculate_total_includes_tax():
cart = Cart()
cart.add_item(Item(price=100))
total = cart.calculate_total(tax_rate=0.1)
assert total == 110
❌ Bad: No separation
def test_calculate_total_includes_tax():
cart = Cart()
cart.add_item(Item(price=100))
total = cart.calculate_total(tax_rate=0.1)
assert total == 110 # Hard to see structure
def test_divide_raises_error_when_divisor_is_zero():
# Arrange
calculator = Calculator()
# Act & Assert (combined for exceptions)
with pytest.raises(ZeroDivisionError):
calculator.divide(10, 0)
def test_save_user_writes_to_database():
# Arrange
user = User(id="123", name="Alice")
db = MockDatabase()
# Act
save_user(user, db)
# Assert
assert db.write_called_with(user)
async def test_fetch_user_calls_api():
# Arrange
mock_client = Mock(ApiClient)
mock_client.get.return_value = {"name": "Alice"}
# Act
result = await fetch_user("123", mock_client)
# Assert
assert result.name == "Alice"
assert mock_client.get.called_with("/users/123")
Bad:
def test_sort_uses_quicksort(): # Implementation detail!
result = my_sort([3, 1, 2])
assert used_quicksort_algorithm(result)
Good:
def test_sort_returns_sorted_list(): # Behavior!
result = my_sort([3, 1, 2])
assert result == [1, 2, 3]
Bad:
def test_user_login():
# Arrange (50 lines of setup!)
db = Database()
db.connect()
db.create_schema()
users_table = db.create_table("users")
# ... 40 more lines ...
Good:
def test_user_login():
# Arrange (use fixtures/factories)
user = create_test_user() # Helper function
# Act & Assert...
Bad:
def test_user_workflow():
user = create_user() # Act 1
login(user) # Act 2
result = get_profile(user) # Act 3
assert result.name == "Alice"
Good: Split into 3 tests (one per Act)
Arrange → Set up
Act → Execute
Assert → Verify
Remember: