Skip to main content
Prerequisites

Code Coverage requires the feature flag CI_CODE_COVERAGE to be enabled on your account. To use hcli commands for uploading coverage reports, you must also set the environment variable CI_ENABLE_HCLI_FOR_TESTS=true in your pipeline.

Contact Harness Support to enable the feature flag. Go to Environment variables to configure environment variables.

Code Coverage

Code coverage shows what percentage of your code is exercised by tests. Harness displays coverage metrics in the Coverage tab of your pipeline execution, helping you identify untested code paths.

What You'll See

MetricDescription
Total CoveragePercentage of all lines covered by tests
Patch CoveragePercentage of changed lines covered (PRs only)
Per-File BreakdownCoverage percentage for each source file

For pull requests, the diff view shows line-by-line coverage:

  • Green - Line is covered
  • Red - Line is not covered
  • Yellow - Partially covered (some branches)

Supported Formats

FormatFile ExtensionLanguages
LCOV.info, .lcovPython, Node.js, JavaScript, C/C++
JaCoCo XML.xmlJava, Kotlin, Scala
Go Coverage.outGo

Pipeline Examples

- step:
type: Run
name: Run Tests with Coverage
spec:
shell: Sh
command: |-
# Install dependencies
pip install pytest pytest-cov

# Run tests with coverage
pytest tests/ \
--junitxml=test-results.xml \
--cov=src \
--cov-report=lcov:lcov.info \
-v

# Upload test results
hcli test-reports upload test-results.xml

# Upload coverage to Harness
hcli cov upload --file=lcov.info

# Quality gate (optional)
hcli cov wait-until --gt=70 --patch-gt=80 --timeout=1m

Analyze Coverage Locally

Before uploading, you can analyze coverage locally:

hcli cov analyze --file lcov.info

This outputs coverage statistics without uploading to Harness, useful for debugging or local development.

Quality Gates

Enforce minimum coverage thresholds to fail pipelines that don't meet your standards. Use hcli cov wait-until to block the pipeline until coverage meets the specified thresholds.

You can specify one or both thresholds as needed:

# Check both total and patch coverage
hcli cov wait-until --gt=70 --patch-gt=80 --timeout=1m

# Check only total coverage
hcli cov wait-until --gt=70 --timeout=1m

# Check only patch coverage (for PRs)
hcli cov wait-until --patch-gt=80 --timeout=1m

This command:

  1. Waits for coverage data to be available
  2. Checks thresholds (if specified):
    • --gt: total coverage percentage
    • --patch-gt: patch coverage percentage (for PRs)
  3. Fails the pipeline if any specified threshold is not met

Example output when the quality gate fails:

Coverage: 84.53%
Lines: 579/685 covered
Patch Coverage: 78.57%
Patch Lines: 11/14 covered
Quality Gate FAILED:
- patch coverage 78.57% is not > 80.00%
Error: quality gate failed: 1 threshold(s) not met

Quality Gate Parameters

ParameterRequiredDescription
--gtNoMinimum total coverage percentage required
--patch-gtNoMinimum patch coverage percentage required (for PRs)
--timeoutNoHow long to wait for coverage data (e.g., 1m, 30s). Default: 30s

CLI Reference

cov upload

Upload coverage reports to Harness. Automatically detects CI environment and configuration.

hcli cov upload --file=<coverage-file>
ParameterRequiredDescription
--fileYesPath to coverage file (LCOV .info or Go .out). Can be specified multiple times
--base-branchNoBase branch for diff coverage tracking (e.g., main, origin/main)
--patchNoOnly include coverage for lines changed in the diff (requires --base-branch)
--tagsNoTags to apply to the uploaded coverage report (can be specified multiple times)
--verboseNoEnable verbose output for debugging (true or false)
--log-levelNoSet log level: debug, info, warn, error (default: info)

cov analyze

hcli cov analyze --file <coverage-file>
ParameterRequiredDescription
--fileYesPath to coverage file

cov wait-until

Wait for coverage data and enforce quality gates. Automatically detects CI environment. Specify one or both thresholds as needed.

hcli cov wait-until [--gt=<total-threshold>] [--patch-gt=<patch-threshold>] [--timeout=<duration>]
ParameterRequiredDescription
--gtNoMinimum total coverage percentage (e.g., 70)
--patch-gtNoMinimum patch coverage percentage (e.g., 80)
--timeoutNoWait timeout (e.g., 1m, 30s). Default: 30s

Troubleshooting

IssueSolution
Coverage shows 0%Verify the coverage file path matches your tool's output
Patch coverage not showingEnsure you're running on a pull request build
File not foundConfirm coverage file was generated before the upload step
Invalid formatVerify the file format matches supported types (LCOV, Go)
Incomplete or inaccurate coverageCheck if tests failed or exited early. Some test runs that terminate prematurely (test failures with --exitfirst, crashes, timeouts) may generate incomplete coverage data. Ensure all tests complete successfully before evaluating coverage metrics

Next Steps