소스 정보
- 저장소
- Dev-Toolbelt/dev-team-agents
- 최근 소스 활동
- 2026년 8월 18일 16:59
- 감지된 SKILL.md 언어
- 영어
- 스타
- 4
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/Dev-Toolbelt/dev-team-agents --skill test-pyramid명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | test-pyramid |
| description | Test pyramid — unit, integration, E2E patterns and pitfall guidance. |
tests/
unit/
domain/
OrderTest
PricingServiceTest
utils/
DateHelperTest
// Good unit test — isolated, no I/O, fast
function test_calculateDiscount_vipCustomer_gets15Percent() {
// Arrange
$pricing = new PricingService();
$customer = new Customer(tier: CustomerTier::VIP);
// Act
$discount = $pricing->calculateDiscount($customer, amount: 100.00);
// Assert
assert($discount === 15.00);
}
A unit test never touches a real database, external API, filesystem, message queue, cache server, or any other out-of-process dependency — not even a test/staging instance of one. If the code under test depends on one of these, inject the dependency and replace it with a mock/stub/fake in the test. A test that needs a running database or network call to pass is an integration test by definition, no matter which folder it lives in — move it to tests/integration/ (see below).
Mocks must model the real contract, not just return canned values: mirror the dependency's actual method signatures, error types, and edge-case responses (not-found, timeout, validation failure) — a mock that only ever returns the happy path hides bugs the real dependency would surface. Prefer typed fakes or in-memory implementations of a repository/client interface over ad-hoc stub objects when the interaction has more than one or two call sites.
tests/
integration/
api/
CreateOrderTest
GetUserProfileTest
repositories/
OrderRepositoryTest
services/
PaymentServiceTest
// Integration test — real DB, real HTTP
function test_createOrder_endpoint_persists_and_returns_201() {
// Arrange
$user = User::factory()->create();
$payload = ['items' => [['product_id' => 'uuid', 'qty' => 2]]];
// Act
$response = $this->actingAs($user)->postJson('/api/orders', $payload);
// Assert
$response->assertStatus(201);
$this->assertDatabaseHas('orders', ['user_id' => $user->id]);
}
tests/
e2e/
auth/
LoginFlowTest
checkout/
CompleteOrderTest
smoke/
HealthCheckTest
// E2E test — browser/HTTP client, full stack
test('user can complete checkout', async ({ page }) => {
// Arrange
await page.goto('/products');
// Act
await page.click('[data-testid="add-to-cart"]');
await page.click('[data-testid="checkout"]');
await page.fill('[name="card_number"]', '4242424242424242');
await page.click('[data-testid="confirm-order"]');
// Assert
await expect(page.locator('[data-testid="order-confirmation"]')).toBeVisible();
});
sleep(2)) — use waitFor / assertions instead| Pattern | When to use |
|---|---|
| Factories | Creating model instances with sensible defaults |
| Fixtures | Static, reusable data sets (e.g., seed a country list) |
| Builders | Complex object graphs with many relationships |
| Fakes | In-memory implementations of repositories/services |
Principle: create the minimum data needed for the test. Each test owns its data setup.
--exclude-group slow)