Skip to content

nix lang coverage #16107

Description

@loynoir

Is your feature request related to a problem?

Seems like nix lang have zero coverage tool

Proposed solution

Thru environment, like NODE_V8_COVERAGE

Collect coverage for nix build

$ export NIX_COVERAGE=...
$ nix build ...

Collect coverage for configuration.nix and nested imports

$ export NIX_COVERAGE=...
$ nixos-rebuild ...

Collect coverage for nix expr

$ export NIX_COVERAGE=...
$ nix eval ...

Programmatically

https://nodejs.org/api/v8.html#v8takecoverage

https://pptr.dev/next/api/puppeteer.coverage#example

https://playwright.dev/docs/api/class-coverage

  await page.coverage.startJSCoverage();
  await page.goto('https://chromium.org');
  const coverage = await page.coverage.stopJSCoverage();

start/stopCoverage region is good, but seems cannot apply to nix lang, thus suggest

expr = builtins.withCoverage expr

Alternative solutions

Additional context

Generated code included.

Not yet verify all of them.

Just a prove of prior Art.

javascript

playwrigtht programmatically

https://playwright.dev/docs/api/class-coverage

await coverage.startCSSCoverage(options);
  await page.coverage.startJSCoverage();
  await page.goto('https://chromium.org');
  const coverage = await page.coverage.stopJSCoverage();

puppeteer programmatically

https://pptr.dev/next/api/puppeteer.coverage#example

await Promise.all([
  page.coverage.startJSCoverage(),
  page.coverage.startCSSCoverage(),
]);
await page.goto('https://example.com');
const [jsCoverage, cssCoverage] = await Promise.all([
  page.coverage.stopJSCoverage(),
  page.coverage.stopCSSCoverage(),
]);

node

node coverage for file

npx c8 node test.js

node coverage for expression

$ NODE_V8_COVERAGE=. node -e 'console.log(42)'
42

This wil collect coverage into ./coverage-XXX-XXX-XXX.json

node programmatically

https://nodejs.org/api/v8.html#v8takecoverage

deno

deno test --coverage=cov_profile && deno coverage cov_profile

bun

bun test --coverage

C

gcc -fprofile-arcs -ftest-coverage -o test test.c && ./test && gcovr --print-summary

C++

g++ -fprofile-arcs -ftest-coverage -o test test.cpp && ./test && gcovr --print-summary

go

go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out | grep total | awk '{print $3}'

lua

lua -lluacov test.lua && luacov . && luacov-console .

python

pytest --cov=. --cov-report=term

ruby

ruby -r simplecov -e 'SimpleCov.start; Dir.glob("test/**/*_test.rb").each{|f| require "./#{f}"}; puts "Coverage: #{SimpleCov.result.covered_percent.round(2)}%"'

rust

cargo tarpaulin --out Stdout

shellscript

bash

bashcov ./script.sh && ruby -rjson -e 'puts JSON.parse(File.read("coverage/coverage.json"))["covered_percent"]'

zsh

No widely‑adopted coverage tool; consider running scripts with bashcov (bash) or limited kcov support.

Checklist


Add 👍 to issues you find important.

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureFeature request or proposal

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions