Skip to Content
Skip to Content

Test Command


The command zune test <file> will run the test suite in the specified file, enabling the testing backend for zune.testing.

Testing is able to:

  • Preview line in error tracebacks.
  • Detect runtime memory leaks. (ideally for reporting as an issue for zune)

Making tests

Tests are conducted using the testing.test function. The function takes two parameters, a name and a callback function.

testing.test("Test Name", function() -- Test code here end)

The test suite will run the callback function and check for any errors. If an error occurs, the test will fail.

Passing Example

PASS (Test Name) [0ms] Tests: 1 total Time: 0.001 s

Failing Example

FAIL (Test Name) [0ms] [string "filename"]:2: Error message path/to/filename:4:2: 0x123456 called error (test) │ error("Error Message") -- Test code here │ ^ path/to/filename:9:1: 0x123456 called test (test) │ testing.test("Test Name", function() └─ ^ Tests: 1 failed, 1 total Time: 0.001 s

Test Describing

Organizing tests can be done with then testing.describe function. The function takes two parameters, a name and a callback function.

testing.describe("Test Scope Name", function() testing.test("Test Name", function() -- Test code here end) end)

An example of the scope can be shown below:

PASS Test Scope Name (Test Name) [0ms]

If an error occurs in any test within the describe block, it would be an unexpected error, warning the error.

Expecting

The testing suite provides the testing.expect function to check for expected values.

testing.expect(1).toBe(1) testing.expect(1).never.toBe(2) testing.expect(1).toBeCloseTo(1, 0)

These functions act like assertions. If the value is not as expected, the expect function will throw an error.

Easy Integration

The testing suite is designed to be easy to use. The test suite can be disabled or enabled with zune run or zune test without extra configuration, allowing to you write tests within the same file as your code. Ideally, tests are mostly written on a separate file, but this is still an option for you to write tests on the same file without runtime errors.

While tests are disabled during runtime with zune run, the field zune.testing.running would be false, and test functions would be a NOOP and accessing nil results from expect().index would cause a runtime error. This could be used to know the running context.

local testing = zune.testing if (testing.running) then -- prepare tests -- ... or you could use another testing library here. testing.test("Test Name", function() -- Test code here end) end
NOOP
local testing = zune.testing -- NOOP if testing is inactive testing.test("Test Name", function() -- Test code here end) -- code continues
Example
local function add(a: number, b: number): number return a + b end if (zune.testing.running) then local testing = zune.testing local test = testing.test local expect = testing.expect test("1 + 2", function() expect(add(1, 2)).toBe(3) end) test("{} + {} (should error)", function() expect(function() add({}, {}) end).toThrow("attempt to perform arithmetic (add) on table") end) end return add

Output:

> zune test path/to/module.lua PASS (1 + 2) [0ms] PASS ({} + {} (should error)) [0ms] Tests: 2 total Time: 0.001 s

Flags

Optimization Level

zune test -O=0|1|2 ...

Debug Level

zune test -g=0|1|2 ...

Native

Enables native code generation by default. This is the default behavior.

zune test --native ...

No-native

Stops zune from using native code generation by default. This does not remove the native code generation, checkout no-jit flag.

zune test --no-native ...

No-jit

Disables native code generation entirely.

zune test --no-jit ...

Limbo

Disables all of zune libraries.

zune test --limbo ...

No-fmt

Disables print formatting

zune test --no-fmt ...
Last updated on