Test.More


Reference

All functions are injected in the global environment _G.

plan( arg )

plan(2)

pass "one"
pass "two"

gives

1..2
ok 1 - one
ok 2 - two

done_testing( num_tests )

plan 'no_plan'

pass "one"
pass "two"
done_testing()

gives

ok 1 - one
ok 2 - two
1..2

skip_all( reason )

if everything_looks_good then
    plan(7)
else
    skip_all "looks bad"
end

gives

1..0 # SKIP looks bad

BAIL_OUT( reason )

plan(7)

if not require_ok 'MyApp' then
    BAIL_OUT "no MyApp"
end

gives

1..7
not ok 1 - require 'MyApp'
#     module 'MyApp' not found:
#       no field package.preload['MyApp']
#       no file '.\MyApp.lua'
#       ...
Bail out!  no MyApp

and breaks the execution of prove.

subtest( name, func )

plan(3)
pass "First test"
subtest('An example subtest', function ()
    plan(2)
    pass "This is a subtest"
    pass "So is this"
end)
pass "Third test"

gives

1..3
ok 1 - First test
# Subtest: An example subtest
    1..2
    ok 1 - This is a subtest
    ok 2 - So is this
ok 2 - An example subtest
ok 3 - Third test

ok( test [, name] )

nok( test [, name] )

is( got, expected [, name] )

isnt( got, expected [, name] )

like( got, pattern [, name] )

unlike( got, pattern [, name] )

cmp_ok( this, op, that [, name] )

type_ok( val, t [, name] )

pass( name )

fail( name )

require_ok( mod )

eq_array( got, expected [, name] )

is_deeply( got, expected [, name] )

error_is( code [, params_array], expected [, name] )

error_like( code [, params_array], pattern [, name] )

lives_ok( code [, params_array] [, name] )

diag( msg )

note( msg )

skip( reason [, count] )

plan(4)

pass "one"

if true then
    skip("here, segfault", 2)
else
    fail "two"
    fail "three"
end

pass "four"

gives

1..4
ok 1 - one
ok 2 - # skip here, segfault
ok 3 - # skip here, segfault
ok 4 - four

todo_skip( reason [, count] )

plan(3)

pass "one"

if true then
    todo_skip "here, segfault"
else
    fail "two"
end

pass "three"

gives

1..3
ok 1 - one
not ok 2 - # TODO & SKIP here, segfault
ok 3 - three

skip_rest( reason )

plan(3)

if not require_ok 'MyApp' then
    skip_rest "no MyApp"
    os.exit()
end

pass "two"
pass "three"

gives

1..3
not ok 1 - require 'MyApp'
#     module 'MyApp' not found:
#       no field package.preload['MyApp']
#       no file '.\MyApp.lua'
#       ...
ok 2 - # skip no MyApp
ok 3 - # skip no MyApp

todo( reason [, count] )

plan(4)

pass "one"

todo( "not yet implemented", 2 )
fail "two"
fail "three"

pass "four"

gives

1..4
ok 1 - one
not ok 2 - two # TODO # not yet implemented
not ok 3 - three # TODO # not yet implemented
ok 4 - four

Examples

-- 99example.t
#!/usr/bin/lua
require 'Test.More'

plan(9)

ok(true, "true")
ok(1, "1 is true")
nok(false, "false")
nok(nil, "nil is false")

is(1 + 1, 2, "addition")

like("with aaa", 'a', "pattern matches")
unlike("with aaa", 'b', "pattern doesn't match")

error_like([[error 'MSG']], '^[^:]+:%d+: MSG', "loadstring error")
error_is(error, { 'MSG' }, 'MSG', "function error with param")
$ lua 99example.t
1..9
ok 1 - true
ok 2 - 1 is true
ok 3 - false
ok 4 - nil is false
ok 5 - addition
ok 6 - pattern matches
ok 7 - pattern doesn't match
ok 8 - loadstring error
ok 9 - function error with param

Now, with prove.

$ prove 99example.t
99example.t .. ok
All tests successful.
Files=1, Tests=9,  0 wallclock secs ( 0.05 usr +  0.20 sys =  0.25 CPU)
Result: PASS

If your continuous integration tool (for example, Jenkins) requires the JUnix XML format.

$ prove --formatter=TAP::Formatter::JUnit 99example.t
<testsuites>
  <testsuite failures="0"
             errors="0"
             tests="9"
             name="test_99example_t">
    <testcase name="1 - true"></testcase>
    <testcase name="2 - 1 is true"></testcase>
    <testcase name="3 - false"></testcase>
    <testcase name="4 - nil is false"></testcase>
    <testcase name="5 - addition"></testcase>
    <testcase name="6 - pattern matches"></testcase>
    <testcase name="7 - pattern doesn't match"></testcase>
    <testcase name="8 - loadstring error"></testcase>
    <testcase name="9 - function error with param"></testcase>
    <system-out><![CDATA[1..9
ok 1 - true
ok 2 - 1 is true
ok 3 - false
ok 4 - nil is false
ok 5 - addition
ok 6 - pattern matches
ok 7 - pattern doesn't match
ok 8 - loadstring error
ok 9 - function error with param
]]></system-out>
    <system-err></system-err>
  </testsuite>
</testsuites>

If your results must be stored first, and processed after.

$ lua 99example.t > 99example.tap
$ prove --source=TAP::Parser::SourceHandler::RawTAP 99example.tap
99example.tap .. ok
All tests successful.
Files=1, Tests=9,  0 wallclock secs ( 0.02 usr +  0.04 sys =  0.06 CPU)
Result: PASS