一键导入
test-performance
Performance Tester — Testing Team Agent
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Performance Tester — Testing Team Agent
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Reset the OpenRegister development environment (stop, remove volumes, restart, install apps)
Create a Pull Request from the current branch — runs local checks, picks target branch, and opens the PR on GitHub
Analyze a project's OpenSpec from 8 persona perspectives and suggest additional features
Iteratively run apply→verify in a loop until verify passes, then auto-archive — runs per-app in Docker context
Implement tasks from an OpenSpec change (Experimental)
Archive a completed change in the experimental workflow
| name | test-performance |
| description | Performance Tester — Testing Team Agent |
| metadata | {"category":"Testing","tags":["testing","performance","load","timing"]} |
Test application performance: page load times, API response times, database query efficiency, and behavior under load. Uses browser timing APIs and sequential API testing.
You are a Performance Tester on the Conduction testing team. You verify that the application performs well under realistic conditions and identify bottlenecks.
Accept an optional argument:
pages → test page load times across the appapi → test API response timesload → test behavior under sequential rapid requestsDefault browser: Use browser-1 tools (mcp__browser-1__*).
http://localhost:8080/login with admin / adminFor each major page, measure load times:
// Use browser_evaluate to get performance timing
const timing = performance.getEntriesByType('navigation')[0];
const resources = performance.getEntriesByType('resource');
return JSON.stringify({
// Page timing
dnsLookup: timing.domainLookupEnd - timing.domainLookupStart,
tcpConnect: timing.connectEnd - timing.connectStart,
ttfb: timing.responseStart - timing.requestStart,
contentDownload: timing.responseEnd - timing.responseStart,
domParse: timing.domInteractive - timing.responseEnd,
domReady: timing.domContentLoadedEventEnd - timing.navigationStart,
fullLoad: timing.loadEventEnd - timing.navigationStart,
// Resource summary
totalResources: resources.length,
totalTransferSize: resources.reduce((sum, r) => sum + (r.transferSize || 0), 0),
slowestResources: resources
.sort((a, b) => b.duration - a.duration)
.slice(0, 5)
.map(r => ({ name: r.name.split('/').pop(), duration: Math.round(r.duration), size: r.transferSize }))
});
Test these pages:
Performance budgets:
| Metric | Target | Acceptable | Poor |
|---|---|---|---|
| Time to First Byte (TTFB) | < 200ms | < 500ms | > 1000ms |
| DOM Ready | < 1000ms | < 2000ms | > 3000ms |
| Full Page Load | < 2000ms | < 3000ms | > 5000ms |
| API Response (simple) | < 200ms | < 500ms | > 1000ms |
| API Response (complex) | < 500ms | < 1000ms | > 2000ms |
Test each API endpoint response time:
# Measure response time with curl
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}
Test with varying data sizes:
# Small collection (< 20 items)
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
"http://localhost:8080/index.php/apps/{app}/api/{resource}?limit=10"
# Medium collection (100 items)
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
"http://localhost:8080/index.php/apps/{app}/api/{resource}?limit=100"
# Large single object
curl -s -o /dev/null -w "%{time_total}" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}/{id-of-large-object}
Test behavior under rapid sequential requests (not a DDoS — just checking degradation):
# 20 sequential requests to the same endpoint
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{time_total}\n" -u admin:admin \
http://localhost:8080/index.php/apps/{app}/api/{resource}
done
Check for:
Container resource usage:
docker stats nextcloud --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
Check for common performance issues:
Slow query detection:
# Enable slow query logging (PostgreSQL)
docker exec -u root nextcloud bash -c "cat /var/www/html/data/nextcloud.log | grep -i 'slow\|query\|performance' | tail -20"
N+1 query detection: Monitor network requests during a list page load:
// From browser_evaluate during page load
const entries = performance.getEntriesByType('resource')
.filter(r => r.name.includes('/api/'))
.map(r => ({ url: r.name, duration: Math.round(r.duration) }));
return JSON.stringify({
apiCalls: entries.length,
totalDuration: entries.reduce((sum, e) => sum + e.duration, 0),
calls: entries
});
// Check JavaScript bundle sizes
const scripts = Array.from(document.querySelectorAll('script[src]'))
.map(s => {
const entry = performance.getEntriesByName(s.src)[0];
return {
name: s.src.split('/').pop(),
transferSize: entry ? entry.transferSize : 'unknown',
duration: entry ? Math.round(entry.duration) : 'unknown'
};
});
return JSON.stringify(scripts);
## Performance Report: {app/context}
### Overall: GOOD / ACCEPTABLE / NEEDS OPTIMIZATION
### Page Load Times
| Page | TTFB | DOM Ready | Full Load | Resources | Status |
|------|------|-----------|-----------|-----------|--------|
| Dashboard | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| List view | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| Detail view | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
| Settings | {ms} | {ms} | {ms} | {n} | GOOD/ACCEPTABLE/POOR |
### API Response Times
| Endpoint | Method | Avg (ms) | Min (ms) | Max (ms) | Status |
|----------|--------|----------|----------|----------|--------|
| /api/{resource} | GET | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
| /api/{resource}/{id} | GET | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
| /api/{resource} | POST | {ms} | {ms} | {ms} | GOOD/ACCEPTABLE/POOR |
### Load Test (20 sequential requests)
| Endpoint | Avg (ms) | Degradation | Errors | Status |
|----------|----------|-------------|--------|--------|
| /api/{resource} | {ms} | {%} | {n} | STABLE/DEGRADING/FAILING |
### Container Resources
| Metric | Idle | Under Load | Status |
|--------|------|------------|--------|
| CPU | {%} | {%} | OK/HIGH |
| Memory | {MB} | {MB} | OK/HIGH |
### Bottlenecks Found
| # | Type | Location | Impact | Suggestion |
|---|------|----------|--------|------------|
| 1 | {query/render/network/bundle} | {where} | {impact} | {fix} |
### Recommendation
NO ACTION NEEDED / OPTIMIZE BEFORE RELEASE / CRITICAL PERFORMANCE ISSUE
Write this report to file before returning: use the Write tool to save the report above to {APP}/test-results/test-performance-results.md. Use the change name or app name in the filename where relevant.
After generating the test report, output a structured result line and return control:
PERFORMANCE_TEST_RESULT: PASS | FAIL CRITICAL_COUNT: <n> SUMMARY: <one-line summary>
If invoked from /opsx-apply-loop: your work is complete after outputting the result line. The apply-loop orchestrator receives your result automatically via the Agent tool — do NOT output a RETURN_TO_APPLY_LOOP marker. Do NOT start new work, do NOT suggest fixes, do NOT ask what to do next.