Test Reporting
Test results visualization and analytics (Planned Feature)
📋 Overview
Test Reporting provides comprehensive dashboards, trend analysis, and detailed test result visualization to help teams understand test quality and track improvements over time.
🎯 Current Status
Status: 📋 Planned (Phase 3)
Basic test run storage exists, but reporting UI and analytics are not yet implemented.
🏗️ Planned Features
Dashboard Views
Project Dashboard:
- Test pass rate over time
- Coverage trends
- Flaky test detection
- Slowest tests
- Most failed tests
Run Details:
- Test suite breakdown
- Individual test results
- Error messages and stack traces
- Execution logs
- Coverage reports
📊 Metrics & Analytics (Planned)
Key Metrics
interface ProjectTestMetrics {
totalRuns: number
averagePassRate: number
averageCoverage: number
averageDuration: number
flakyTests: Array<{
name: string
failureRate: number
}>
trends: {
passRate: Array<{ date: string; value: number }>
coverage: Array<{ date: string; value: number }>
duration: Array<{ date: string; value: number }>
}
}
API Endpoints (Planned)
// Get project metrics
const metrics = await trpc.reports.getProjectMetrics.query({
projectId: 'proj_123',
timeRange: '30d'
})
// Get run comparison
const comparison = await trpc.reports.compareRuns.query({
runIds: ['run_123', 'run_456']
})
🎨 Frontend Components (Planned)
Test Run Dashboard
export function TestRunDashboard({ projectId }: Props) {
const { data } = trpc.reports.getProjectMetrics.useQuery({ projectId })
return (
<div className="space-y-6">
{/* Summary Cards */}
<div className="grid gap-4 md:grid-cols-4">
<MetricCard
title="Pass Rate"
value={`${data.averagePassRate.toFixed(1)}%`}
trend={data.trends.passRate}
/>
<MetricCard
title="Coverage"
value={`${data.averageCoverage.toFixed(1)}%`}
trend={data.trends.coverage}
/>
<MetricCard
title="Avg Duration"
value={formatDuration(data.averageDuration)}
/>
<MetricCard
title="Total Runs"
value={data.totalRuns}
/>
</div>
{/* Charts */}
<Card>
<CardHeader>
<CardTitle>Pass Rate Trend</CardTitle>
</CardHeader>
<CardContent>
<LineChart data={data.trends.passRate} />
</CardContent>
</Card>
{/* Flaky Tests */}
{data.flakyTests.length > 0 && (
<Card>
<CardHeader>
<CardTitle>Flaky Tests</CardTitle>
</CardHeader>
<CardContent>
<Table>
<TableHeader>
<TableRow>
<TableHead>Test Name</TableHead>
<TableHead>Failure Rate</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{data.flakyTests.map((test) => (
<TableRow key={test.name}>
<TableCell>{test.name}</TableCell>
<TableCell>{test.failureRate.toFixed(1)}%</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</CardContent>
</Card>
)}
</div>
)
}
Test Run Details
export function TestRunDetails({ runId }: Props) {
const { data } = trpc.tests.getRunDetails.useQuery({ runId })
return (
<div className="space-y-4">
<TestRunHeader run={data.run} />
<Tabs defaultValue="results">
<TabsList>
<TabsTrigger value="results">Results</TabsTrigger>
<TabsTrigger value="coverage">Coverage</TabsTrigger>
<TabsTrigger value="logs">Logs</TabsTrigger>
</TabsList>
<TabsContent value="results">
<TestResultsTable suites={data.results.suites} />
</TabsContent>
<TabsContent value="coverage">
<CoverageReport coverage={data.results.coverage} />
</TabsContent>
<TabsContent value="logs">
<LogViewer logs={data.run.logs} />
</TabsContent>
</Tabs>
</div>
)
}
🔗 Related Documentation
- Test Execution: Running tests
- Projects: Project management
- API Reference: Reports API
Next: Organizations →