7 Examples
7.1 Test suite
-module(my_SUITE).
-export([all/1,
not_started/1, not_started_func1/1, not_started_func2/1,
start/1, stop/1,
func1/1, func2/1
]).
-export([init_per_testcase/2, fin_per_testcase/2]).
-include("test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog=?t:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
fin_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
all(suite) ->
%% Test specification on test suite level
[not_started,
{conf, start, [func1, func2], stop}].
not_started(suite) ->
%% Test specification on test case level
[not_started_func1, not_started_func2];
not_started(doc) ->
["Testing all functions when application is not started"].
%% No execution clause unless the specification clause returns [].
not_started_func1(suite) ->
[];
not_started_func1(doc) ->
["Testing function 1 when application is not started"].
not_started_func1(Config) when list(Config) ->
?line {error, not_started} = myapp:func1(dummy_ref,1),
?line {error, not_started} = myapp:func1(dummy_ref,2),
ok.
not_started_func2(suite) ->
[];
not_started_func2(doc) ->
["Testing function 2 when application is not started"].
not_started_func2(Config) when list(Config) ->
?line {error, not_started} = myapp:func2(dummy_ref,1),
?line {error, not_started} = myapp:func2(dummy_ref,2),
ok.
%% No specification clause needed for an init function in a conf case!!!
start(doc) ->
["Testing start of my application."];
start(Config) when list(Config) ->
?line Ref = myapp:start(),
case erlang:whereis(my_main_process) of
Pid when pid(Pid) ->
[{myapp_ref,Ref}|Config];
undefined ->
%% Since this is the init function in a conf case, the rest of the
%% cases in the conf case will be skipped if this case fails.
?t:fail("my_main_process did not start")
end.
func1(suite) ->
[];
func1(doc) ->
["Test that func1 returns ok when argument is 1 and error if argument is 2"];
func1(Config) when list(Config) ->
?line Ref = ?config(myapp_ref,Config),
?line ok = myapp:func1(Ref,1),
?line error = myapp:func1(Ref,2),
ok.
func2(suite) ->
[];
func2(doc) ->
["Test that func1 returns ok when argument is 3 and error if argument is 4"];
func2(Config) when list(Config) ->
?line Ref = ?config(myapp_ref,Config),
?line ok = myapp:func2(Ref,3),
?line error = myapp:func2(Ref,4),
ok.
%% No specification clause needed for a cleanup function in a conf case!!!
stop(doc) ->
["Testing termination of my application"];
stop(Config) when list(Config) ->
?line Ref = ?config(myapp_ref,Config),
?line ok = myapp:stop(Ref),
case erlang:whereis(my_main_process) of
undefined ->
lists:keydelete(myapp_ref,1,Config);
Pid when pid(Pid) ->
?t:fail("my_main_process did not stop")
end.
7.2 Test specification file
myapp.spec:
{topcase, {dir, "../myapp_test"}}. % Test specification on top level
myapp.spec.vxworks:
{topcase, {dir, "../myapp_test"}}. % Test specification on top level
{skip,{my_SUITE,func2,"Not applicable on VxWorks"}}.