Nixt is a unit-testing tool for Nix.
Using nix-env:
$ nix-env -if https://github.com/nix-community/nixt/archive/master.tar.gzUsing nix profile:
$ nix profile install github:nix-community/nixtAdd Nixt as a flake to your configuration:
{
  inputs.nixt = {
    url = "github:nix-community/nixt";
    inputs.nixpkgs.follows = "nixpkgs";
  };
}Then add the package to your packages:
{
  environment.systemPackages = [
    inputs.nixt.defaultPackage.x86_64-linux
  ];
}nixt
  Test-runner for nixlang.
Options
  -p, --path string   Path to the test suite
  -w, --watch         Watch for changes at path
  -v, --verbose       Show additional test info
  -l, --list          List, but don't run, tests
  -d, --debug         Show nixt-developent relevant info
  -h, --help          Prints this usage guide
If it does not find a registry, the nixt CLI discovers and runs tests located at -p/--path:
$ nixt ./nix/
Found 14 cases in 8 suites over 3 files.
  ✗ 2 cases failed.
┏ /home/ldlework/src/nixt/cli/nix/get-testset.test.nix
┃   mkSuites
┃     ✗ always fails
┏ /home/ldlework/src/nixt/cli/nix/utils.test.nix
┃   broken test
┃     ✗ undefined variable
  ⚠ Couldn't import 1 files:
    - /home/ldlework/src/nixt/cli/nix/invalid.test.nix
      Import error: called with unexpected argument 'nixt'
      Did you forgot to add the 'nixt' argument to your test expression?
Adding in the -v/--verbose flag will show passing cases and additional
  information on failed cases:
$ nixt ./nix/ -v
Found 14 cases in 8 suites over 3 files.
  ✗ 2 cases failed.
┏ /home/ldlework/src/nixt/cli/nix/get-testset.test.nix
┃   mkSuite
┃     ✓ creates correct structure
┃   mkSuites
┃     ✗ always fails
┗     ✓ creates correct structure
┏ /home/ldlework/src/nixt/cli/nix/utils.test.nix
┃   broken test
┃     ✗ undefined variable
┃       error: undefined variable 'baz'
┃       at /home/ldlework/src/nixt/cli/nix/utils.test.nix:12:30:
┃       11|     "broken test" = {
┃       12|       "undefined variable" = baz;
┃       |                              ^
┃       13|     };
┃       (use '--show-trace' to show detailed location information)
┃   dirFiles
┃     ✓ empty list for non-existent path
┃     ✓ non-empty list for existing path
┃   findNixFiles
┃     ✓ empty list for non-existent path
┃     ✓ non-empty list for existing path
┃   getDir
┃     ✓ empty list for non-existent path
┃     ✓ non-empty list for existing path
┃   isNix
┃     ✓ false for non-nix files
┃     ✓ true for nix files
┃   isTestSuite
┃     ✓ false for non-test suites
┗     ✓ true for test suites
  ⚠ Couldn't import 1 files:
    - /home/ldlework/src/nixt/cli/nix/invalid.test.nix
      Import error: called with unexpected argument 'nixt'
      Did you forgot to add the 'nixt' argument to your test expression?
Two -v -v verbose flags implies --show-trace.
To list discovered tests without actually evaluating their cases use the
  --l/-list flag:
$ nixt ./nix/ -l
Found 14 cases in 8 suites over 3 files.
  ⚠ Couldn't import 1 files:
    - /home/ldlework/src/nixt/cli/nix/invalid.test.nix
      Import error: called with unexpected argument 'nixt'
      Did you forgot to add the 'nixt' argument to your test expression?
Or with the -v/--verbose flag:
$ nixt ./nix/ -l -v
Found 14 cases in 8 suites over 3 files.
┏ /home/ldlework/src/nixt/cli/nix/get-testset.test.nix
┃   mkSuite
┃     - creates correct structure
┃   mkSuites
┃     - always fails
┗     - creates correct structure
┏ /home/ldlework/src/nixt/cli/nix/utils.test.nix
┃   broken test
┃     - undefined variable
┃   dirFiles
┃     - empty list for non-existent path
┃     - non-empty list for existing path
┃   findNixFiles
┃     - empty list for non-existent path
┃     - non-empty list for existing path
┃   getDir
┃     - empty list for non-existent path
┃     - non-empty list for existing path
┃   isNix
┃     - false for non-nix files
┃     - true for nix files
┃   isTestSuite
┃     - false for non-test suites
┗     - true for test suites
  ⚠ Couldn't import 1 files:
    - /home/ldlework/src/nixt/cli/nix/invalid.test.nix
      Import error: called with unexpected argument 'nixt'
      Did you forgot to add the 'nixt' argument to your test expression?
Nixt tests are written in blocks. Users may use flakes or standalone testing.
With standalone testing, a block is put in its own file which:
- Contains a function taking attrset args 
nixtandpkgs - Evaluates to a 
Block 
Each block is composed of one or more suites; Each suite is composed of one or more cases. Each case should be an expression or list of expressions that evaluate to booleans.
For those curious:
Block = struct "Block" {
  path = path;
  suites = list TestSuite;
};TestSuite = struct "TestSuite" {
  name = string;
  cases = list TestCase;
};TestCase = struct "TestCase" {
  name = string;
  expressions = list bool;
};Args:
attrsetcontaining- blocks: 
listofBlock - settings: Optional 
attrsetof settings 
- blocks: 
 
Builds the nixt registry for cli consumption. Only relevant to flakes.
{
  inputs = {
    nixt.url = "github:nix-community/nixt";
  };
  outputs = {
    nixt,
    ...
  } @ inputs:
  {
    __nixt = nixt.lib.grow {
      blocks = [
        nixt.lib.block' ./flake.nix {
          "nixt"."passes this test" = true;
          "nixt"."fails this test" = false;
        }
      ];
    };
  };
}Args:
- path: 
pathto the current file - suites: 
listofTestSuites 
Creates a Block from a path and list of TestSuite.
{
  nixt,
  pkgs ? import <nixpkgs> {}
}: let
  inherit (nixt) block describe';
in
  block ./block.spec.nix [
    (describe' "nixt" {
      "passes this test" = true;
      "fails this test" = false;
    })
  ]Args:
- path: 
pathto the current file - suites: 
attrsetof suites 
Creates a Block from a path and attrset.
{
  nixt,
  pkgs ? import <nixpkgs> {}
}:
nixt.block ./block.spec.nix {
  "nixt"."passes this test" = true;
  "nixt"."fails this test" = false;
}Args:
- name: 
string - cases: 
listofTestCase 
Creates a TestSuite from a string and list of TestCase
{
  nixt,
  pkgs ? import <nixpkgs> {}
}: let
  inherit (nixt) block describe it;
in
  block ./block.spec.nix [
    (describe "nixt" [
      (it "passes this test" true)
      (it "fails this test" false)
    ])
  ]Args:
- name: 
string - cases: 
attrsetof cases 
Creates a TestSuite from a string and attrset
{
  nixt,
  pkgs ? import <nixpkgs> {}
}: let
  inherit (nixt) block describe';
in
  block ./block.spec.nix [
    (describe' "nixt" {
      "passes this test" = true;
      "fails this test" = false;
    })
  ]Args:
- name: 
string - expressions: 
boolorlistofbool 
Creates a TestCase from a string and bool or list of bool
{
  nixt,
  pkgs ? import <nixpkgs> {}
}: let
  inherit (nixt) block describe it;
in
  block ./block.spec.nix [
    (describe "nixt" [
      (it "passes this test" true)
      (it "fails this test" false)
    ])
  ]Args:
- path: 
pathto a test file 
Provides arguments to compliant files. For standalone support and cli use.