From 756f30146091d0383566b5291a85cc6c4198869b Mon Sep 17 00:00:00 2001
From: Richard Carlsson Copyright © 2004-2009 Mickaël Rémond, Richard Carlsson Version: 2.1.1, Apr 22 2009 22:37:19 Authors: Mickaël Rémond (mickael.remond@process-one.net) [web site: http://www.process-one.net/], Richard Carlsson (richardc@it.uu.se) [web site: http://user.it.uu.se/~richardc/]. start() -> any() Starts the EUnit server. Normally, you don't need to call this
- function; it is started automatically. stop() -> any() Stops the EUnit server. Normally, you don't need to call this
- function. test(Tests) -> any() Equivalent to test(Tests, []). test(Tests::term(), Options::[term()]) -> ok | {error, term()} Runs a set of tests. The format of runs all tests in the module
-
-Module eunit
-This module is the main EUnit user interface.
-Description
This module is the main EUnit user interface.
-Function Index
-
-
-
-start/0 Starts the EUnit server.
-stop/0 Stops the EUnit server.
-test/1 Equivalent to test(Tests, []).
-
-test/2 Runs a set of tests. Function Details
-
-start/0
-stop/0
-test/1
-test/2
-Tests
is described in the
- section EUnit test
- representation of the overview. eunit:test(fred)
fred
- and also any tests in the module fred_tests
, if that module exists.
-
-
- Options in the environment variable EUNIT are also included last in
- the option list, i.e., have lower precedence than those in verbose
Options
.
See also: test/1.
-Generated by EDoc, Apr 22 2009, 22:37:19.
- - diff --git a/lib/eunit/doc/eunit_surefire.html b/lib/eunit/doc/eunit_surefire.html deleted file mode 100644 index f2ecbae572..0000000000 --- a/lib/eunit/doc/eunit_surefire.html +++ /dev/null @@ -1,78 +0,0 @@ - - - -Copyright © 2009 Mickaël Rémond, Paul Guyot
- -Behaviours: eunit_listener.
-Authors: Mickaël Rémond (mremond@process-one.net).
-See also: eunit.
- -Surefire reports for EUnit (Format used by Maven and Atlassian -Bamboo for example to integrate test results). Based on initial code -from Paul Guyot.
- - Example: Generate XML result file in the current directory: -eunit:test([fib, eunit_examples], - [{report,{eunit_surefire,[{dir,"."}]}}]).-
handle_begin/3 | |
handle_cancel/3 | |
handle_end/3 | |
init/1 | |
start/0 | |
start/1 | |
terminate/2 |
handle_begin(X1, Data, St) -> any()
-handle_cancel(X1, Data, St) -> any()
-handle_end(X1, Data, St) -> any()
-init(Options) -> any()
-start() -> any()
-start(Options) -> any()
-terminate(X1, St) -> any()
-Generated by EDoc, Apr 22 2009, 22:37:19.
- - diff --git a/lib/eunit/doc/index.html b/lib/eunit/doc/index.html deleted file mode 100644 index 9bd8e8cf6b..0000000000 --- a/lib/eunit/doc/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - -eunit |
eunit_surefire |
Copyright © 2004-2007 Mickaël Rémond, Richard Carlsson
-Version: 2.1.1, Apr 22 2009 22:37:19 -
-Authors: Richard Carlsson (richardc@it.uu.se) [web site: http://user.it.uu.se/~richardc/], Mickaël Rémond (mickael.remond@process-one.net) [web site: http://www.process-one.net/].
-EUnit is a unit testing framework for Erlang. It is very powerful -and flexible, is easy to use, and has small syntactical overhead.
- - - -EUnit builds on ideas from the family of unit testing frameworks for -Object Oriented languages that originated with JUnit by Beck and Gamma -(and Beck's previous framework SUnit for Smalltalk). However, EUnit uses -techniques more adapted to functional and concurrent programming, and is -typically less verbose than its relatives.
- -Although EUnit uses many preprocessor macros, they have been designed to -be as nonintrusive as possible, and should not cause conflicts with -existing code. Adding EUnit tests to a module should thus not normally -require changing existing code. Furthermore, tests that only exercise -the exported functions of a module can always be placed in a completely -separate module, avoiding any conflicts entirely.
- -Unit Testing is testing of individual program "units" in relative -isolation. There is no particular size requirement: a unit can be a -function, a module, a process, or even a whole application, but the most -typical testing units are individual functions or modules. In order to -test a unit, you specify a set of individual tests, set up the smallest -necessary environment for being able to run those tests (often, you -don't need to do any setup at all), you run the tests and collect the -results, and finally you do any necessary cleanup so that the test can -be run again later. A Unit Testing Framework tries to help you in each -stage of this process, so that it is easy to write tests, easy to run -them, and easy to see which tests failed (so you can fix the bugs).
- -A
(e.g., a function) requires that
- it collaborates somehow with some other unit B
(perhaps being passed
- as an argument, or by reference) - but B
has not been implemented
- yet. A "mock object" - an object which, for the purposes of testing
- A
, looks and behaves like a real B
- might then be used instead.
- (This is of course only useful if it would be significantly more work
- to implement a real B
than to create a mock object.)-module
-declaration, but before any function definitions):
--include_lib("eunit/include/eunit.hrl").- -This will have the following effect: -
test()
(unless testing is turned
- off, and the module does not already contain a test() function), that
- can be used to run all the unit tests defined in the module..._test()
or ..._test_()
- to be automatically exported from the module (unless testing is
- turned off, or the EUNIT_NOAUTO
macro is defined)-include_lib(...)
to work, the Erlang
-module search path must contain a directory whose name ends in
-eunit/ebin
(pointing to the ebin
subdirectory of the EUnit
-installation directory). If EUnit is installed as lib/eunit
under your
-Erlang/OTP system directory, its ebin
subdirectory will be
-automatically added to the search path when Erlang starts. Otherwise,
-you need to add the directory explicitly, by passing a -pa
flag to the
-erl
or erlc
command. For example, a Makefile could contain the
-following action for compiling .erl
files:
-erlc -pa "path/to/eunit/ebin" $(ERL_COMPILE_FLAGS) -o$(EBIN) $<-or if you want Eunit to always be available when you run Erlang -interactively, you can add a line like the following to your -
$HOME/.erlang
file:
-code:add_path("/path/to/eunit/ebin").- -
The EUnit framework makes it extremely easy to write unit tests in -Erlang. There are a few different ways of writing them, though, so we -start with the simplest:
- -A function with a name ending in ..._test()
is recognized by EUnit as
-a simple test function - it takes no arguments, and its execution either
-succeeds (returning some arbitrary value that EUnit will throw away), or
-fails by throwing an exception of some kind (or by not terminating, in
-which case it will be aborted after a while).
reverse_test() -> lists:reverse([1,2,3]).
-This just tests that the function lists:reverse(List)
does not crash
-when List
is [1,2,3]
. It is not a great test, but many people write
-simple functions like this one to test the basic functionality of their
-code, and those tests can be used directly by EUnit, without changes,
-as long as their function names match.
=
, as in the following
-examples:
-reverse_nil_test() -> [] = lists:reverse([]). - reverse_one_test() -> [1] = lists:reverse([1]). - reverse_two_test() -> [2,1] = lists:reverse([1,2]).
-If there was some bug in lists:reverse/1
that made it return something
-other than [2,1]
when it got [1,2]
as input, then the last test
-above would throw a badmatch
error. The first two (we assume they do
-not get a badmatch
) would simply return []
and [1]
, respectively,
-so both succeed. (Note that EUnit is not psychic: if you write a test
-that returns a value, even if it is the wrong value, EUnit will consider
-it a success. You must make sure that the test is written so that it
-causes a crash if the result is not what it should be.)
assert
-macro comes in handy (see EUnit macros for details):
-length_test() -> ?assert(length([1,2,3]) =:= 3).
-The ?assert(Expression)
macro will evaluate Expression
, and if that
-does not evaluate to true
, it will throw an exception; otherwise it
-just returns ok
. In the above example, the test will thus fail if the
-call to length
does not return 3.
If you have added the declaration
--include_lib("eunit/include/eunit.hrl")
to your module, as described
-above, you only need to compile the module, and run the automatically
-exported function test()
. For example, if your module was named m
,
-then calling m:test()
will run EUnit on all the tests defined in the
-module. You do not need to write -export
declarations for the test
-functions. This is all done by magic.
You can also use the function eunit:test/1
to run arbitrary
-tests, for example to try out some more advanced test descriptors (see
-EUnit test representation). For example, running
-eunit:test(m)
does the same thing as the auto-generated function
-m:test()
, while eunit:test({inparallel, m})
runs the same test
-cases but executes them all in parallel.
If you want to separate your test code from your normal code (at least
-for testing the exported functions), you can simply write the test
-functions in a module named m_tests
(note: not m_test
), if your
-module is named m
. Then, whenever you ask EUnit to test the module
-m
, it will also look for the module m_tests
and run those tests as
-well. See ModuleName
in the section Primitives for details.
If your test code writes to the standard output, you may be surprised to
-see that the text does not appear on the console when the tests are
-running. This is because EUnit captures all standard output from test
-functions (this also includes setup and cleanup functions, but not
-generator functions), so that it can be included in the test report if
-errors occur. To bypass EUnit and print text directly to the console
-while testing, you can write to the user
output stream, as in
-io:format(user, "~w", [Term])
. The recommended way of doing this is to
-use the EUnit Debugging macros, which make it much simpler.
A drawback of simple test functions is that you must write a separate -function (with a separate name) for each test case. A more compact way -of writing tests (and much more flexible, as we shall see), is to write -functions that return tests, instead of being tests.
- -A function with a name ending in ..._test_()
(note the final
-underscore) is recognized by EUnit as a test generator
-function. Test generators return a representation of a set
-of tests to be executed by EUnit.
basic_test_() -> - fun () -> ?assert(1 + 1 =:= 2) end.-will have the same effect as the following simple test: -
simple_test() -> - ?assert(1 + 1 =:= 2).
-(in fact, EUnit will handle all simple tests just like it handles -fun-expressions: it will put them in a list, and run them one by one).
- -_test
macro (note the initial underscore character), like
-this:
-basic_test_() -> - ?_test(?assert(1 + 1 =:= 2)).
-The _test
macro takes any expression (the "body") as argument, and
-places it within a fun-expression (along with some extra information).
-The body can be any kind of test expression, just like the body of a
-simple test function.
assert
macros, have a corresponding form with an initial
-underscore character, which automatically adds a ?_test(...)
wrapper.
-The above example can then simply be written:
-basic_test_() -> - ?_assert(1 + 1 =:= 2).
-which has exactly the same meaning (note the _assert
instead of
-assert
). You can think of the initial underscore as signalling
-test object.
-module(fib). - -export([fib/1]). - -include_lib("eunit/include/eunit.hrl"). - - fib(0) -> 1; - fib(1) -> 1; - fib(N) when N > 1 -> fib(N-1) + fib(N-2). - - fib_test_() -> - [?_assert(fib(0) =:= 1), - ?_assert(fib(1) =:= 1), - ?_assert(fib(2) =:= 2), - ?_assert(fib(3) =:= 3), - ?_assert(fib(4) =:= 5), - ?_assert(fib(5) =:= 8), - ?_assertException(error, function_clause, fib(-1)), - ?_assert(fib(31) =:= 2178309) - ].- -
(Author's note: When I first wrote this example, I happened to write a
-*
instead of +
in the fib
function. Of course, this showed up
-immediately when I ran the tests.)
See EUnit test representation for a full list of all the ways -you can specify test sets in EUnit.
- -NOTEST
macro when compiling,
-for example as an option to erlc
, as in:
-erlc -DNOTEST my_module.erl-or by adding a macro definition to the code, before the EUnit header -file is included: -
-define(NOTEST, 1).
-(the value is not important, but should typically be 1 or true
).
-Note that unless the EUNIT_NOAUTO
macro is defined, disabling testing
-will also automatically strip all test functions from the code, except
-for any that are explicitly declared as exported.
-define(NOTEST, true). - -include_lib("eunit/include/eunit.hrl").-and then make sure that every module of your application includes that -header file. This means that you have a only a single place to modify in -order to change the default setting for testing. To override the
NOTEST
-setting without modifying the code, you can define TEST
in a compiler
-option, like this:
-erlc -DTEST my_module.erl- -
See Compilation control macros for details about these -macros.
- --ifdef(TEST). - -include_lib("eunit/include/eunit.hrl"). - -endif.
-and, of course, also make sure that you place all test code that uses
-EUnit macros within -ifdef(TEST)
or -ifdef(EUNIT)
sections.
Although all the functionality of EUnit is avaliable even without the -use of preprocessor macros, the EUnit header file defines a number of -such macros in order to make it as easy as possible to write unit tests -as compactly as possible and without getting too many details in the -way.
- -Except where explicitly stated, using EUnit macros will never introduce -run-time dependencies on the EUnit library code, regardless of whether -your code is compiled with testing enabled or disabled.
- -_test(Expr)
Expr
into a "test object", by wrapping it in a
-fun-expression and a source line number. Technically, this is the same
-as {?LINE, fun () -> (Expr) end}
.
-EUNIT
true
whenever EUnit is enabled at
-compile time. This is typically used to place testing code within
-conditional compilation, as in:
--ifdef(EUNIT). - % test code here - ... - -endif.-e.g., to ensure that the code can be compiled without including the -EUnit header file, when testing is disabled. See also the macros
TEST
-and NOTEST
.
-EUNIT_NOAUTO
TEST
This macro is always defined (to true
, unless previously defined
-by the user to have another value) whenever EUnit is enabled at compile
-time. This can be used to place testing code within conditional
-compilation; see also the macros NOTEST
and EUNIT
.
For testing code that is strictly dependent on EUnit, it may be
-preferable to use the EUNIT
macro for this purpose, while for code
-that uses more generic testing conventions, using the TEST
macro may
-be preferred.
TEST
macro can also be used to override the NOTEST
macro. If
-TEST
is defined before the EUnit header file is
-included (even if NOTEST
is also defined), then the code will be
-compiled with EUnit enabled.
-NOTEST
This macro is always defined (to true
, unless previously defined
-by the user to have another value) whenever EUnit is disabled
-at compile time. (Compare the TEST
macro.)
NOTEST
is defined
-before the EUnit header file is included, and TEST
-is not defined, then the code will be compiled with EUnit
-disabled. See also Disabling testing.
-NOASSERT
ASSERT
NODEBUG
NODEBUG
also implies NOASSERT
,
-unless testing is enabled.
-DEBUG
The following macros can make tests more compact and readable:
- -LET(Var,Arg,Expr)
Var = Arg
in Expr
. (This is the same as
-(fun(Var)->(Expr)end)(Arg)
.) Note that the binding is not exported
-outside of Expr
, and that within Expr
, this binding of Var
will
-shadow any binding of Var
in the surrounding scope.
-IF(Cond,TrueCase,FalseCase)
TrueCase
if Cond
evaluates to true
, or otherwise
-evaluates FalseCase
if Cond
evaluates to false
. (This is the same
-as (case (Cond) of true->(TrueCase); false->(FalseCase) end)
.) Note
-that it is an error if Cond
does not yield a boolean value.
-(Note that these macros also have corresponding forms which start with
-an "_
" (underscore) character, as in ?_assert(BoolExpr)
, that create
-a "test object" instead of performing the test immediately. This is
-equivalent to writing ?_test(assert(BoolExpr))
, etc.)
If the macro NOASSERT
is defined before the EUnit header file is
-included, these macros have no effect when testing is also disabled; see
-Compilation control macros for details.
assert(BoolExpr)
Evaluates the expression BoolExpr
, if testing is enabled. Unless
-the result is true
, an informative exception will be generated. If
-there is no exception, the result of the macro expression is the atom
-ok
, and the value of BoolExpr
is discarded. If testing is disabled,
-the macro will not generate any code except the atom ok
, and
-BoolExpr
will not be evaluated.
?assert(f(X, Y) =:= [])- -The
assert
macro can be used anywhere in a program, not just in unit
-tests, to check pre/postconditions and invariants. For example:
-some_recursive_function(X, Y, Z) -> - ?assert(X + Y > Z), - ...-
assertNot(BoolExpr)
assert(not (BoolExpr))
.
-assertMatch(GuardedPattern, Expr)
Evaluates Expr
and matches the result against GuardedPattern
, if
-testing is enabled. If the match fails, an informative exception will be
-generated; see the assert
macro for further details. GuardedPattern
-can be anything that you can write on the left hand side of the ->
-symbol in a case-clause, except that it cannot contain comma-separated
-guard tests.
The main reason for using assertMatch
also for simple matches, instead
-of matching with =
, is that it produces more detailed error messages.
?assertMatch({found, {fred, _}}, lookup(bloggs, Table))-
?assertMatch([X|_] when X > 0, binary_to_list(B))-
assertEqual(Expect, Expr)
Evaluates the expressions Expect
and Expr
and compares the
-results for equality, if testing is enabled. If the values are not
-equal, an informative exception will be generated; see the assert
-macro for further details.
assertEqual
is more suitable than than assertMatch
when the
-left-hand side is a computed value rather than a simple pattern, and
-gives more details than ?assert(Expect =:= Expr)
.
?assertEqual("b" ++ "a", lists:reverse("ab"))-
?assertEqual(foo(X), bar(Y))-
assertException(ClassPattern, TermPattern, Expr)
assertError(TermPattern, Expr)
assertExit(TermPattern, Expr)
assertThrow(TermPattern, Expr)
Evaluates Expr
, catching any exception and testing that it matches
-the expected ClassPattern:TermPattern
. If the match fails, or if no
-exception is thrown by Expr
, an informative exception will be
-generated; see the assert
macro for further details. The
-assertError
, assertExit
, and assertThrow
macros, are equivalent to
-using assertException
with a ClassPattern
of error
, exit
, or
-throw
, respectively.
?assertError(badarith, X/0)-
?assertExit(normal, exit(normal))-
?assertException(throw, {not_found,_}, throw({not_found,42}))-
Keep in mind that external commands are highly dependent on the
-operating system. You can use the standard library function os:type()
-in test generator functions, to produce different sets of tests
-depending on the current operating system.
Note: these macros introduce a run-time dependency on the EUnit library -code, if compiled with testing enabled.
- -assertCmd(CommandString)
Runs CommandString
as an external command, if testing is enabled.
-Unless the returned status value is 0, an informative exception will be
-generated. If there is no exception, the result of the macro expression
-is the atom ok
. If testing is disabled, the macro will not generate
-any code except the atom ok
, and the command will not be executed.
?assertCmd("mkdir foo")-
assertCmdStatus(N, CommandString)
assertCmd(CommandString)
macro, but generates an
-exception unless the returned status value is N
.
-assertCmdOutput(Text, CommandString)
CommandString
as an external command, if testing is enabled.
-Unless the output produced by the command exactly matches the specified
-string Text
, an informative exception will be generated. (Note that
-the output is normalized to use a single LF character as line break on
-all platforms.) If there is no exception, the result of the macro
-expression is the atom ok
. If testing is disabled, the macro will not
-generate any code except the atom ok
, and the command will not be
-executed.
-cmd(CommandString)
Runs CommandString
as an external command. Unless the returned
-status value is 0 (indicating success), an informative exception will be
-generated; otherwise, the result of the macro expression is the output
-produced by the command, as a flat string. The output is normalized to
-use a single LF character as line break on all platforms.
This macro is useful in the setup and cleanup sections of fixtures, -e.g., for creating and deleting files or perform similar operating -system specific tasks, to make sure that the test system is informed of -any failures.
- -A Unix-specific example: -{setup, - fun () -> ?cmd("mktemp") end, - fun (FileName) -> ?cmd("rm " ++ FileName) end, - ...}-
To help with debugging, EUnit defines several useful macros for printing -messages directly to the console (rather than to the standard output). -Furthermore, these macros all use the same basic format, which includes -the file and line number where they occur, making it possible in some -development environments (e.g., when running Erlang in an Emacs buffer) -to simply click on the message and jump directly to the corresponding -line in the code.
- -If the macro NODEBUG
is defined before the EUnit header file is
-included, these macros have no effect; see
-Compilation control macros for details.
debugHere
ok
.debugMsg(Text)
Text
(which can be a plain string, an IO-list,
-or just an atom). The result is always ok
.debugFmt(FmtString, Args)
io:format(FmtString, Args)
and outputs
-it like debugMsg
. The result is always ok
.debugVal(Expr)
Expr
and its current value. E.g.,
-?debugVal(f(X))
might be displayed as "f(X) = 42
". (Large terms are
-shown truncated.) The result is always the value of Expr
, so this
-macro can be wrapped around any expression to display its value when
-the code is compiled with debugging enabled.debugTime(Text,Expr)
Text
and the wall clock time for evaluation of Expr
. The
-result is always the value of Expr
, so this macro can be wrapped
-around any expression to show its run time when the code is compiled
-with debugging enabled. For example, List1 = ?debugTime("sorting",
-lists:sort(List))
might show as "sorting: 0.015 s
".The way EUnit represents tests and test sets as data is flexible, -powerful, and concise. This section describes the representation in -detail.
- -fun () -> ... end-
fun some_function/0-
fun some_module:some_function/0-
{ModuleName, FunctionName}
, referring to the
- function ModuleName:FunctionName/0
{LineNumber, SimpleTest}
, where LineNumber
is a
- nonnegative integer and SimpleTest
is another simple test
- object. LineNumber
should indicate the source line of the test.
- Pairs like this are usually only created via ?_test(...)
macros;
- see Basic macros.-In brief, a simple test object consists of a single function that takes -no arguments (possibly annotated with some additional metadata, i.e., a -line number). Evaluation of the function either succeeds, by -returning some value (which is ignored), or fails, by throwing -an exception.
- -A test set can be easily created by placing a sequence of test objects
-in a list. If T_1
, ..., T_N
are individual test objects, then [T_1,
-..., T_N]
is a test set consisting of those objects (in that order).
Test sets can be joined in the same way: if S_1
, ..., S_K
are test
-sets, then [S_1, ..., S_K]
is also a test set, where the tests of
-S_i
are ordered before those of S_(i+1)
, for each subset S_i
.
Thus, the main representation of test sets is deep lists, and
-a simple test object can be viewed as a test set containing only a
-single test; there is no difference between T
and [T]
.
A module can also be used to represent a test set; see ModuleName
-under Primitives below.
Any test or test set T
can be annotated with a title, by wrapping it
-in a pair {Title, T}
, where Title
is a string. For convenience, any
-test which is normally represented using a tuple can simply be given a
-title string as the first element, i.e., writing {"The Title", ...}
-instead of adding an extra tuple wrapper as in {"The Title", {...}}
.
ModuleName::atom()
-{module, ModuleName}
. This is often used as in the call
-eunit:test(some_module)
.
-{module, ModuleName::atom()}
-This composes a test set from the exported test functions of the
-named module, i.e., those functions with arity zero whose names end
-with _test
or _test_
. Basically, the ..._test()
functions become
-simple tests, while the ..._test_()
functions become generators.
ModuleName
plus the suffix _tests
, and if it exists, all the tests
-from that module will also be added. (If ModuleName
already contains
-the suffix _tests
, this is not done.) E.g., the specification
-{module, mymodule}
will run all tests in the modules mymodule
and
-mymodule_tests
. Typically, the _tests
module should only contain
-test cases that use the public interface of the main module (and no
-other code).
-{application, AppName::atom(), Info::list()}
-.app
file. The resulting test set consists of the modules listed in
- the modules
entry in Info
.
-{application, AppName::atom()}
-.app
file
-(see {file, FileName}
), or if no such file exists, by testing all
-object files in the application's ebin-directory (see {dir,
-Path}
); if that does not exist, the code:lib_dir(AppName)
directory
-is used.
-Path::string()
-{file, Path}
, or {dir, Path}
, respectively, depending
-on what Path
refers to in the file system.
-{file, FileName::string()}
-If FileName
has a suffix that indicates an object file (.beam
),
-EUnit will try to reload the module from the specified file and test it.
-Otherwise, the file is assumed to be a text file containing test
-specifications, which will be read using the standard library function
-file:path_consult/2
.
code:get_path()
). This means that the names of typical "app" files
-can be used directly, without a path, e.g., "mnesia.app"
.
-{dir, Path::string()}
-{file, FileName}
.
-{generator, GenFun::(() -> Tests)}
-GenFun
is called to produce a test
-set.
-{generator, ModuleName::atom(), FunctionName::atom()}
-ModuleName:FunctionName()
is called to produce a test
-set.
-{with, X::any(), [AbstractTestFun::((any()) -> any())]}
-X
over the unary functions in the list,
-turning them into nullary test functions. An AbstractTestFun
is like
-an ordinary test fun, but takes one argument instead of zero - it's
-basically missing some information before it can be a proper test. In
-practice, {with, X, [F_1, ..., F_N]}
is equivalent to [fun () ->
-F_1(X) end, ..., fun () -> F_N(X) end]
. This is particularly useful if
-your abstract test functions are already implemented as proper
-functions: {with, FD, [fun filetest_a/1, fun filetest_b/1, fun
-filetest_c/1]}
is equivalent to [fun () -> filetest_a(FD) end, fun ()
--> filetest_b(FD) end, fun () -> filetest_c(FD) end]
, but much more
-compact. See also Fixtures, below.
-{spawn, Tests}
{spawn, Node::atom(), Tests}
{spawn, Tests}
, but runs the specified tests on the given
-Erlang node.{timeout, Time::number(), Tests}
{inorder, Tests}
{inparallel,
-Tests}
. By default, tests are neither marked as inorder
or
-inparallel
, but may be executed as the test framework chooses.{inparallel, Tests}
{inorder, Tests}
.{inparallel, N::integer(), Tests}
{inparallel, Tests}
, but running no more than N
subtests
-simultaneously.A "fixture" is some state that is necessary for a particular set of -tests to run. EUnit's support for fixtures makes it easy to set up such -state locally for a test set, and automatically tear it down again when -the test set is finished, regardless of the outcome (success, failures, -timeouts, etc.).
- -To make the descriptions simpler, we first list some definitions: -
Setup | () -> (R::any()) |
-
SetupX | (X::any()) -> (R::any()) |
-
Cleanup | (R::any()) -> any() |
-
CleanupX | (X::any(), R::any()) -> any() |
-
Instantiator | ((R::any()) -> Tests) | {with, [AbstractTestFun::((any()) -> any())]} |
-
Where | local | spawn | {spawn, Node::atom()} |
-
{setup, Setup, Tests | Instantiator}
{setup, Setup, Cleanup, Tests | Instantiator}
{setup, Where, Setup, Tests | Instantiator}
{setup, Where, Setup, Cleanup, Tests | Instantiator}
setup
sets up a single fixture for running all of the specified
-tests, with optional teardown afterwards. The arguments are described in
-detail below.
-{node, Node::atom(), Tests | Instantiator}
{node, Node::atom(), Args::string(), Tests | Instantiator}
node
is like setup
, but with a built-in behaviour: it starts a
-slave node for the duration of the tests. The atom Node
should have
-the format nodename@full.machine.name
, and Args
are the optional
-arguments to the new node; see slave:start_link/3
for details.
-{foreach, Where, Setup, Cleanup, [Tests | Instantiator]}
{foreach, Setup, Cleanup, [Tests | Instantiator]}
{foreach, Where, Setup, [Tests | Instantiator]}
{foreach, Setup, [Tests | Instantiator]}
foreach
is used to set up a fixture and optionally tear it down
-afterwards, repeated for each single one of the specified test sets.
-{foreachx, Where, SetupX, CleanupX,
- Pairs::[{X::any(), ((X::any(), R::any()) -> Tests)}]}
{foreachx, SetupX, CleanupX, Pairs}
{foreachx, Where, SetupX, Pairs}
{foreachx, SetupX, Pairs}
foreachx
is like foreach
, but uses a list of pairs, each
-containing an extra argument X
and an extended instantiator function.
-A Setup
function is executed just before any of the specified tests
-are run, and a Cleanup
function is executed when no more of the
-specified tests will be run, regardless of the reason. A Setup
-function takes no argument, and returns some value which will be passed
-as it is to the Cleanup
function. A Cleanup
function should do
-whatever necessary and return some arbitrary value, such as the atom
-ok
. (SetupX
and CleanupX
functions are similar, but receive one
-additional argument: some value X
, which depends on the context.) When
-no Cleanup
function is specified, a dummy function is used which has
-no effect.
An Instantiator
function receives the same value as the Cleanup
-function, i.e., the value returned by the Setup
function. It should
-then behave much like a generator (see Primitives), and
-return a test set whose tests have been instantiated with the
-given value. A special case is the syntax {with, [AbstractTestFun]}
-which represents an instantiator function that distributes the value
-over a list of unary functions; see Primitives: {with, X,
-[...]}
for more details.
Where
term controls how the specified tests are executed. The
-default is spawn
, which means that the current process handles the
-setup and teardown, while the tests are executed in a subprocess.
-{spawn, Node}
is like spawn
, but runs the subprocess on the
-specified node. local
means that the current process will handle both
-setup/teardown and running the tests - the drawback is that if a test
-times out so that the process is killed, the cleanup will not be
-performed; hence, avoid this for persistent fixtures such as file
-operations. In general, 'local' should only be used when:
-Sometimes, it can be convenient not to produce the whole set of test -descriptions before the testing begins; for example, if you want to -generate a huge amount of tests that would take up too much space to -keep in memory all at once.
- -It is fairly easy to write a generator which, each time it is called, -either produces an empty list if it is done, or otherwise produces a -list containing a single test case plus a new generator which will -produce the rest of the tests. This demonstrates the basic pattern:
- -lazy_test_() -> - lazy_gen(10000). - - lazy_gen(N) -> - {generator, - fun () -> - if N > 0 -> - [?_test(...) - | lazy_gen(N-1)]; - true -> - [] - end - end}.- -
When EUnit traverses the test representation in order to run the tests, -the new generator will not be called to produce the next test until the -previous test has been executed.
- -Note that it is easiest to write this kind of recursive generator using -a help function, like thelazy_gen/1
function above. It can also be
-written using a recursive fun, if you prefer to not clutter your
-function namespace and are comfortable with writing that kind of code.
-
-Generated by EDoc, Apr 22 2009, 22:37:19.
- - diff --git a/lib/eunit/doc/packages-frame.html b/lib/eunit/doc/packages-frame.html deleted file mode 100644 index 52b45534f5..0000000000 --- a/lib/eunit/doc/packages-frame.html +++ /dev/null @@ -1,11 +0,0 @@ - - - -