Examples
Running Shake in the command line
Assuming you have a module like LuaFileSystem installed and
you go to its /tests directory and run Shake from there, the output would be:
~/workspace/luafilesystem/tests$ shake -> test.lua OK! _________________ Tests: 27 Failures: 0 Errors: 0
On the other hand, if you have a test script like the one below that includes two assertions that are supposed to fail (lines are numbered):
1 items = 10
2 -- checks the correct case
3 assert (items == 10, "this should not fail")
4
5 items = 20
6 -- checks an overflow case
7 assert (items == 10, "wrong number of items")
8
9 print("Verifying the total")
10 items = 10
11 total = 30
12 assert (items == total, "wrong total")
Shake would register the failures but would run the whole test script, reporting at the end:
:~/workspace$ shake ---------------- test.lua failed! ---------------- -- checks an overflow case #7 assert (items == 10, "wrong number of items") items -> 20 Verifying the total #12 assert (items == total, "wrong total") items -> 10 total -> 30 _________________ Tests: 3 Failures: 2 Errors: 0
Note how much more informative this is when compared to the default output of running the test script with Lua:
:~/workspace$ lua5.1 test.lua
lua5.1: test.lua:7: wrong number of items
stack traceback:
[C]: in function 'assert'
test.lua:7: in main chunk
[C]: ?
Implementing a simple Shake runner
Here we show how to use the Shake API to implement runners. Note that if you just want to execute tests, the built in runners (command line and CGILua app) may be enough. On the other hand, if you need to show more detailed information about the tests results or if you want to use Shake as part of your application runtime, then you will need to use the Shake API.
The minimal Shake runner would be like:
require "shake"
local run = shake.runner()
run:test("somefile.lua")
print (run:summary())
This would be basically equivalent to the command line Shake runner, and if you want to report more details than the default summary does, you will need to drill down the results using something like:
function ReportModules(run)
local results = run.results
for cs, suite in ipairs(results.suites) do
-- displays information about the suite.title
if suite.error then
-- displays information about the suite error
elseif suite.failed > 0 then
-- displays information about the suite.failed results
else
-- displays information about the suite.passed and suite.failed results
end
end
end
For even more details, you may want to inspect each test result and decide what to show:
function ReportModule(run)
local results = run.results
for _, suite in ipairs(results.suites) do
if suite.error == -1 then
-- displays information about the error
else
for _, context in ipairs(suite.contexts) do
if next(context.tests) then
if context.output[1] ~= "" or context.comments then
-- displays information about the context
for _, output in ipairs(context.output) do
if output and output ~= "" then
-- using context.output
end
end
if context.comments and context.comments ~= "" then
-- or context.comments
end
end
for _, test in ipairs (context.tests) do
local linenumber = test.linenumber or "???"
local op = test.op
local val2 = tostring(test.val2)
-- when there is no comparision operator, assume that this is an assert(x) case
if not op then
val2 = "True value" -- just to diferentiate from the Lua "true"
end
if not op or op == "==" then
op = ""
end
-- displays information about the test result using
-- linenumber, test.exp1, op, val2, test.val1 and test.msg
end
end
end
end