qa-interaction
1
总安装量
1
周安装量
#50119
全站排名
安装命令
npx skills add https://github.com/shaul1991/shaul-agents-plugin --skill qa-interaction
Skill 文档
QA Interaction Agent
ìí
ì¬ì©ì ì¸í°ëì ì ì¤ì¬ì¼ë¡ í ì¤í¸ë¥¼ ê³ííê³ , Playwright를 ì¬ì©íì¬ E2E í ì¤í¸ë¥¼ ìì±/ì¤íí©ëë¤.
ë´ë¹ ì 무
1. ì¬ì©ì ì¸í°ëì í ì¤í¸ ê³í
- UX/UI ëª ì¸ ê¸°ë° í ì¤í¸ ìë리ì¤
- ì¬ì©ì íë¡ì°ë³ í ì¤í¸ ì¼ì´ì¤
- ìí ì í í ì¤í¸
2. Playwright E2E í ì¤í¸ ìì±
- íì´ì§ ë¤ë¹ê²ì´ì í ì¤í¸
- í¼ ì ë ¥ ë° ì ì¶ í ì¤í¸
- ì¸í°ëì í ì¤í¸ (í´ë¦, í¸ë², ëëê·¸)
3. ì ê·¼ì± í ì¤í¸
- í¤ë³´ë ë¤ë¹ê²ì´ì
- ì¤í¬ë¦° 리ë í¸íì±
- WCAG ì¤ì íì¸
í ì¤í¸ ìëë¦¬ì¤ í í릿
ì¬ì©ì íë¡ì° í ì¤í¸
## í
ì¤í¸ ìë리ì¤: [íë¡ì°ëª
]
### ì ì ì¡°ê±´
- [ ] ì¬ì©ì ë¡ê·¸ì¸ ìí
- [ ] íìí ë°ì´í° ì¤ë¹
### í
ì¤í¸ ë¨ê³
| # | ëì | ìì ê²°ê³¼ | ê²ì¦ ë°©ë² |
|---|------|----------|----------|
| 1 | íì´ì§ ì ê·¼ | íì´ì§ ë¡ë ìë£ | URL, ì 목 íì¸ |
| 2 | ë²í¼ í´ë¦ | ëª¨ë¬ íì | ìì visibility |
| 3 | í¼ ì
ë ¥ | ì í¨ì± íµê³¼ | ìë¬ ë©ìì§ ìì |
| 4 | ì ì¶ | ì±ê³µ ë©ìì§ | í ì¤í¸/ì림 |
### ì£ì§ ì¼ì´ì¤
- [ ] ë¤í¸ìí¬ ì¤ë¥ ì
- [ ] íììì ë°ì ì
- [ ] ëì ìì² ì
Playwright í ì¤í¸ í¨í´
기본 íì´ì§ í ì¤í¸
import { test, expect } from '@playwright/test';
test.describe('User Profile Page', () => {
test.beforeEach(async ({ page }) => {
// ë¡ê·¸ì¸ ë° íì´ì§ ì ê·¼
await page.goto('/login');
await page.fill('[data-testid="email"]', 'test@example.com');
await page.fill('[data-testid="password"]', 'password123');
await page.click('[data-testid="login-button"]');
await page.waitForURL('/dashboard');
});
test('should display user profile', async ({ page }) => {
await page.goto('/profile');
await expect(page.locator('[data-testid="user-name"]')).toBeVisible();
await expect(page.locator('[data-testid="user-email"]')).toBeVisible();
});
test('should edit profile successfully', async ({ page }) => {
await page.goto('/profile');
// í¸ì§ 모ë ì§ì
await page.click('[data-testid="edit-button"]');
// ì´ë¦ ë³ê²½
await page.fill('[data-testid="name-input"]', 'New Name');
// ì ì¥
await page.click('[data-testid="save-button"]');
// ì±ê³µ íì¸
await expect(page.locator('[data-testid="success-toast"]')).toBeVisible();
await expect(page.locator('[data-testid="user-name"]')).toHaveText('New Name');
});
});
í¼ ì¸í°ëì í ì¤í¸
test.describe('Registration Form', () => {
test('should validate required fields', async ({ page }) => {
await page.goto('/register');
// ë¹ í¼ ì ì¶
await page.click('[data-testid="submit-button"]');
// ìë¬ ë©ìì§ íì¸
await expect(page.locator('[data-testid="email-error"]')).toHaveText('ì´ë©ì¼ì ì
ë ¥íì¸ì');
await expect(page.locator('[data-testid="password-error"]')).toHaveText('ë¹ë°ë²í¸ë¥¼ ì
ë ¥íì¸ì');
});
test('should show password strength indicator', async ({ page }) => {
await page.goto('/register');
// ì½í ë¹ë°ë²í¸
await page.fill('[data-testid="password"]', '123');
await expect(page.locator('[data-testid="strength-weak"]')).toBeVisible();
// ê°í ë¹ë°ë²í¸
await page.fill('[data-testid="password"]', 'StrongP@ss123!');
await expect(page.locator('[data-testid="strength-strong"]')).toBeVisible();
});
test('should handle form submission', async ({ page }) => {
await page.goto('/register');
await page.fill('[data-testid="email"]', 'new@example.com');
await page.fill('[data-testid="password"]', 'SecureP@ss123');
await page.fill('[data-testid="confirm-password"]', 'SecureP@ss123');
await page.check('[data-testid="terms-checkbox"]');
await page.click('[data-testid="submit-button"]');
// ì±ê³µ íì´ì§ë¡ 리ë¤ì´ë í¸
await page.waitForURL('/register/success');
await expect(page.locator('h1')).toHaveText('ê°ì
ìë£');
});
});
ìí ì í í ì¤í¸
test.describe('Shopping Cart', () => {
test('should update cart count on add', async ({ page }) => {
await page.goto('/products');
// ì´ê¸° ì¹´í¸ ìë
await expect(page.locator('[data-testid="cart-count"]')).toHaveText('0');
// ìí ì¶ê°
await page.click('[data-testid="add-to-cart-1"]');
// ì¹´í¸ ìë ì
ë°ì´í¸
await expect(page.locator('[data-testid="cart-count"]')).toHaveText('1');
});
test('should show loading state during checkout', async ({ page }) => {
await page.goto('/cart');
await page.click('[data-testid="checkout-button"]');
// ë¡ë© ìí íì¸
await expect(page.locator('[data-testid="loading-spinner"]')).toBeVisible();
// ìë£ í 리ë¤ì´ë í¸
await page.waitForURL('/checkout/success');
});
});
ì ê·¼ì± í ì¤í¸
test.describe('Accessibility', () => {
test('should be keyboard navigable', async ({ page }) => {
await page.goto('/');
// Tab í¤ë¡ ë¤ë¹ê²ì´ì
await page.keyboard.press('Tab');
await expect(page.locator(':focus')).toHaveAttribute('data-testid', 'nav-home');
await page.keyboard.press('Tab');
await expect(page.locator(':focus')).toHaveAttribute('data-testid', 'nav-products');
// Enter í¤ë¡ íì±í
await page.keyboard.press('Enter');
await page.waitForURL('/products');
});
test('should have proper ARIA labels', async ({ page }) => {
await page.goto('/');
// 주ì ìì ARIA íì¸
await expect(page.locator('nav')).toHaveAttribute('aria-label', 'Main navigation');
await expect(page.locator('main')).toHaveAttribute('role', 'main');
await expect(page.locator('footer')).toHaveAttribute('role', 'contentinfo');
});
});
ë°ìí í ì¤í¸
test.describe('Responsive Design', () => {
test('should show mobile menu on small screens', async ({ page }) => {
// 모ë°ì¼ ë·°í¬í¸
await page.setViewportSize({ width: 375, height: 667 });
await page.goto('/');
// íë²ê±° ë©ë´ íì
await expect(page.locator('[data-testid="mobile-menu-button"]')).toBeVisible();
await expect(page.locator('[data-testid="desktop-nav"]')).not.toBeVisible();
// ë©ë´ ì´ê¸°
await page.click('[data-testid="mobile-menu-button"]');
await expect(page.locator('[data-testid="mobile-nav"]')).toBeVisible();
});
test('should show desktop nav on large screens', async ({ page }) => {
// ë°ì¤í¬í± ë·°í¬í¸
await page.setViewportSize({ width: 1280, height: 720 });
await page.goto('/');
await expect(page.locator('[data-testid="desktop-nav"]')).toBeVisible();
await expect(page.locator('[data-testid="mobile-menu-button"]')).not.toBeVisible();
});
});
í ì¤í¸ ëª ë ¹ì´
# Playwright í
ì¤í¸ ì¤í
npx playwright test
# í¹ì íì¼ ì¤í
npx playwright test user-profile.spec.ts
# UI 모ëë¡ ì¤í
npx playwright test --ui
# ëë²ê·¸ 모ë
npx playwright test --debug
# í¹ì ë¸ë¼ì°ì
npx playwright test --project=chromium
# 리í¬í¸ ìì±
npx playwright show-report
í ì¤í¸ ê³í 문ì 구조
# [기ë¥ëª
] ì¸í°ëì
í
ì¤í¸ ê³í
## 1. í
ì¤í¸ ë²ì
### í¬í¨
### ì ì¸
## 2. í
ì¤í¸ íê²½
- ë¸ë¼ì°ì : Chrome, Firefox, Safari
- ëë°ì´ì¤: Desktop, Tablet, Mobile
## 3. ì¬ì©ì íë¡ì°ë³ í
ì¤í¸
### íë¡ì° 1: [íë¡ì°ëª
]
### íë¡ì° 2: [íë¡ì°ëª
]
## 4. ì£ì§ ì¼ì´ì¤
## 5. ì±ë¥ 기ì¤
- íì´ì§ ë¡ë: < 3ì´
- ì¸í°ëì
ìëµ: < 100ms
## 6. ì ê·¼ì± ì구ì¬í
- WCAG 2.1 Level AA
## 7. í
ì¤í¸ ë°ì´í°
ì°ì¶ë¬¼ ìì¹
- í
ì¤í¸ ê³í:
docs/features/<기ë¥ëª >/test-plans/interaction-tests.md - E2E í
ì¤í¸:
e2e/**/*.spec.ts - í
ì¤í¸ 리í¬í¸:
playwright-report/ - ì¤í¬ë¦°ì·:
test-results/