Zig Test

    detect_test.zig

    1. $ zig test detect_test.zig
    2. Test 1/1 builtin.is_test...OK
    3. All tests passed.

    Zig has lazy top level declaration analysis, which means that if a function is not called, or otherwise used, it is not analyzed. This means that there may be an undiscovered compile error in a function because it is never called.

    unused_fn.zig

    1. fn unused() i32 {
    2. return "wrong return type";
    3. }
    4. test "unused function" { }
    1. pub fn assert(ok: bool) void {

    This means that when testing in ReleaseFast or ReleaseSmall mode, assert is not sufficient to check the result of a computation:

    assert.zig

    1. const std = @import("std");
    2. const assert = std.debug.assert;
    3. test "assert in release fast mode" {
    4. assert(false);
    5. }

    Note that although the above example shows the test passing, this is invoking unchecked . This documentation is showing only one possible outcome of this test.

    test.zig

    1. const std = @import("std");
    2. expect(false);
    3. }
    1. $ zig test test.zig --release-fast
    2. Test 1/1 assert in release fast mode...test failure
    3. Tests failed. Use the following command to reproduce the failure:

    See the rest of the std.testing namespace for more available functions.

    zig test has a few command line parameters which affect the compilation. See zig --help for a full list. The most interesting one is --test-filter [text]. This makes the test build only include tests whose name contains the supplied filter text. Again, thanks to lazy analysis, this can allow you to narrow a build to only a few functions in isolation.