Docs /features/test-reporting

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


Next: Organizations

Reading this with an agent? /docs/features/test-reporting.md serves the raw markdown.

All docs