Comprehensive code coverage tool for Scala providing statement and branch coverage through compiler plugin instrumentation and report generation
—
The ScoverageHtmlWriter generates comprehensive visual HTML coverage reports with source code highlighting, coverage statistics tables, and interactive navigation. The generated reports include overview pages, package breakdowns, class listings, and individual source file views with line-by-line coverage highlighting.
class ScoverageHtmlWriter(
sourceDirectories: Seq[File],
outputDir: File,
sourceEncoding: Option[String]
) extends BaseReportWriter(sourceDirectories, outputDir, sourceEncoding) {
def write(coverage: Coverage): Unit
}Constructor Parameters:
sourceDirectories: Sequence of source directories for relative path calculationoutputDir: Directory where HTML report files will be generatedsourceEncoding: Optional character encoding for source files (defaults to UTF-8)Methods:
write(coverage: Coverage): Unit - Generates complete HTML report structure// For Gradle plugin compatibility
class ScoverageHtmlWriter(
sourceDirectories: Array[File],
outputDir: File,
sourceEncoding: Option[String]
)
// Backward compatibility - no encoding specified
class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File)
// Backward compatibility - single source directory
class ScoverageHtmlWriter(sourceDirectory: File, outputDir: File)import java.io.File
import scoverage.reporter.ScoverageHtmlWriter
import scoverage.domain.Coverage
val sourceDirectories = Seq(new File("src/main/scala"))
val outputDir = new File("target/scoverage-report")
val writer = new ScoverageHtmlWriter(sourceDirectories, outputDir, Some("UTF-8"))
// Coverage object should be populated with data
val coverage: Coverage = loadCoverageData()
writer.write(coverage)import java.io.File
import scoverage.reporter.ScoverageHtmlWriter
val sourceDirectories = Seq(
new File("module1/src/main/scala"),
new File("module2/src/main/scala"),
new File("shared/src/main/scala")
)
val outputDir = new File("target/aggregated-coverage-report")
val writer = new ScoverageHtmlWriter(sourceDirectories, outputDir, Some("UTF-8"))
val aggregatedCoverage: Coverage = aggregateCoverageFromModules()
writer.write(aggregatedCoverage)// For projects using ISO-8859-1 encoding
val writer = new ScoverageHtmlWriter(
sourceDirectories,
outputDir,
Some("ISO-8859-1")
)
// Using default UTF-8 encoding
val writerDefault = new ScoverageHtmlWriter(sourceDirectories, outputDir, None)The HTML writer creates the following file structure in the output directory:
outputDir/
├── index.html # Main entry point (frameset)
├── overview.html # Overall coverage statistics
├── packages.html # Package list with coverage
├── pure-min.css # CSS styles
├── [package].html # Package overview pages
└── [source-path].html # Individual source file pagesMain Index (index.html): Frameset-based navigation interface
Overview (overview.html): Project-wide coverage statistics and class listings
Packages (packages.html): Navigation list of all packages with coverage percentages
Package Pages: Detailed view of classes within each package
Source Pages: Individual source files with line-by-line coverage highlighting
The generated reports use Bootstrap CSS and custom styling. The CSS is embedded in the report for self-contained viewing.
Source code is displayed with:
Common Issues:
RuntimeException: Thrown when source directories cannot be resolved to canonical pathsIOException: File writing issues due to permissions or disk spaceFileNotFoundException: Source files referenced in coverage data but not found in source directoriesBest Practices:
Install with Tessl CLI
npx tessl i tessl/maven-org-scoverage--scalac-scoverage-plugin