Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ATF-SH(3)		    Library Functions Manual		     ATF-SH(3)

NAME
       atf_add_test_case,   atf_check,	atf_check_equal,  atf_check_not_equal,
       atf_config_get,	atf_config_has,	  atf_expect_death,   atf_expect_exit,
       atf_expect_fail,		  atf_expect_pass,	    atf_expect_signal,
       atf_expect_timeout,	atf_fail,	atf_get,       atf_get_srcdir,
       atf_init_test_cases,  atf_pass,	atf_require_prog,  atf_set,  atf_skip,
       atf_test_case --	POSIX shell API	to write ATF-based test	programs

SYNOPSIS
       atf_add_test_case "name"
       atf_check "command"
       atf_check_equal "expected_expression" "actual_expression"
       atf_check_not_equal "expected_expression" "actual_expression"
       atf_config_get "var_name"
       atf_config_has "var_name"
       atf_expect_death	"reason" "..."
       atf_expect_exit "exitcode" "reason" "..."
       atf_expect_fail "reason"	"..."
       atf_expect_pass ""
       atf_expect_signal "signo" "reason" "..."
       atf_expect_timeout "reason" "..."
       atf_fail	"reason"
       atf_get "var_name"
       atf_get_srcdir
       atf_init_test_cases "name"
       atf_pass
       atf_require_prog	"prog_name"
       atf_set "var_name" "value"
       atf_skip	"reason"
       atf_test_case "name" "cleanup"

DESCRIPTION
       ATF provides a simple but powerful interface to easily write test  pro-
       grams  in  the POSIX shell language.  These are extremely helpful given
       that they are trivial to	write due to the language simplicity  and  the
       great deal of available external	tools, so they are often ideal to test
       other applications at the user level.

       Test  programs  written	using  this  library  must  be	run  using the
       atf-sh(1) interpreter by	putting	the  following	on  their  very	 first
       line:

	     #!	/usr/bin/env atf-sh

       Shell-based test	programs always	follow this template:

	     atf_test_case tc1
	     tc1_head()	{
		 ... first test	case's header ...
	     }
	     tc1_body()	{
		 ... first test	case's body ...
	     }

	     atf_test_case tc2 cleanup
	     tc2_head()	{
		 ... second test case's	header ...
	     }
	     tc2_body()	{
		 ... second test case's	body ...
	     }
	     tc2_cleanup() {
		 ... second test case's	cleanup	...
	     }

	     ... additional test cases ...

	     atf_init_test_cases() {
		 atf_add_test_case tc1
		 atf_add_test_case tc2
		 ... add additional test cases ...
	     }

   Definition of test cases
       Test  cases  have  an  identifier  and  are composed of three different
       parts: the header, the body and an optional  cleanup  routine,  all  of
       which are described in atf-test-case(4).	 To define test	cases, one can
       use  the	atf_test_case function,	which takes a first parameter specify-
       ing the test case's name	and instructs the library to set things	up  to
       accept  it as a valid test case.	 The second parameter is optional and,
       if provided, must be `cleanup'; providing this parameter	allows	defin-
       ing  a cleanup routine for the test case.  It is	important to note that
       this function does not set the test case	up for execution when the pro-
       gram is run.  In	order to do so,	a later	registration is	needed through
       the atf_add_test_case function detailed in "Program initialization".

       Later on, one must define the three parts of the	body by	providing  two
       or  three  functions  (remember	that the cleanup routine is optional).
       These functions are named after the test	 case's	 identifier,  and  are
       <id>_head,  <id>_body  and <id>_cleanup.	 None of these take parameters
       when executed.

   Program initialization
       The test	program	must define an atf_init_test_cases function, which  is
       in  charge  of  registering the test cases that will be executed	at run
       time by using the atf_add_test_case function, which takes the name of a
       test case as its	single parameter.  This	main function  should  not  do
       anything	else, except maybe sourcing auxiliary source files that	define
       extra variables and functions.

   Configuration variables
       The  test  case has read-only access to the current configuration vari-
       ables through the atf_config_has	and atf_config_get methods.  The  for-
       mer  takes  a single parameter specifying a variable name and returns a
       boolean indicating whether the variable is defined or not.  The	latter
       can take	one or two parameters.	If it takes only one, it specifies the
       variable	 from  which  to  get the value, and this variable must	be de-
       fined.  If it takes two,	the second one specifies a default value to be
       returned	if the variable	is not available.

   Access to the source	directory
       It is possible to get the path to the test case's source	directory from
       anywhere	in the test program by using the atf_get_srcdir	function.   It
       is interesting to note that this	can be used inside atf_init_test_cases
       to silently include additional helper files from	the source directory.

   Requiring programs
       Aside from the require.progs meta-data variable available in the	header
       only,  one  can	also  check for	additional programs in the test	case's
       body by using the atf_require_prog function, which takes	the base  name
       or  full	path of	a single binary.  Relative paths are forbidden.	 If it
       is not found, the test case will	be automatically skipped.

   Test	case finalization
       The test	case finalizes either when the body reaches its	end, at	 which
       point  the  test	 is assumed to have passed, or at any explicit call to
       atf_pass, atf_fail or atf_skip.	These three  functions	terminate  the
       execution  of  the  test	case immediately.  The cleanup routine will be
       processed afterwards in a completely automated way, regardless  of  the
       test case's termination reason.

       atf_pass	 does  not  take any parameters.  atf_fail and atf_skip	take a
       single string parameter that describes why the test case	failed or  was
       skipped,	 respectively.	 It is very important to provide a clear error
       message in both cases so	that the user can quickly know	why  the  test
       did not pass.

   Expectations
       Everything explained in the previous section changes when the test case
       expectations are	redefined by the programmer.

       Each  test  case	 has  an internal state	called `expect'	that describes
       what the	test case expectations are at any point	in time.  The value of
       this property can change	during execution by any	of:

       atf_expect_death	"reason" "..."
	       Expects the test	case to	exit prematurely regardless of the na-
	       ture of the exit.

       atf_expect_exit "exitcode" "reason" "..."
	       Expects the test	case to	exit  cleanly.	 If  exitcode  is  not
	       `-1',  the  runtime  engine will	validate that the exit code of
	       the test	case matches the one provided in  this	call.	Other-
	       wise, the exact value will be ignored.

       atf_expect_fail "reason"
	       Any  failure raised in this mode	is recorded, but such failures
	       do not report the test case as failed; instead, the  test  case
	       finalizes  cleanly  and is reported as `expected	failure'; this
	       report includes the provided reason as part of it.  If no error
	       is raised while running in this mode, then the test case	is re-
	       ported as `failed'.

	       This mode is useful to reproduce	actual known  bugs  in	tests.
	       Whenever	 the  developer	 fixes the bug later on, the test case
	       will start reporting a failure, signaling  the  developer  that
	       the  test case must be adjusted to the new conditions.  In this
	       situation, it is	useful,	for example, to	set reason as the  bug
	       number for tracking purposes.

       atf_expect_pass
	       This  is	the normal mode	of execution.  In this mode, any fail-
	       ure is reported as such to the user and the test	case is	marked
	       as `failed'.

       atf_expect_signal "signo" "reason" "..."
	       Expects the test	case to	terminate due to the  reception	 of  a
	       signal.	If signo is not	`-1', the runtime engine will validate
	       that  the  signal that terminated the test case matches the one
	       provided	in this	call.  Otherwise, the exact value will be  ig-
	       nored.

       atf_expect_timeout "reason" "..."
	       Expects the test	case to	execute	for longer than	its timeout.

   Helper functions for	common checks
       atf_check "[options]" "command" "[args]"
	       Executes	 a  command,  performs checks on its exit code and its
	       output, and fails the test case if any of  the  checks  is  not
	       successful.   This  function is particularly useful in integra-
	       tion tests that verify the correct functioning of a binary.

	       Internally,  this  function  is	just  a	  wrapper   over   the
	       atf-check(1)  tool  (whose  manual page provides	all details on
	       the calling syntax).  You should	always use the atf_check func-
	       tion instead of the atf-check(1)	tool in	your scripts; the lat-
	       ter is not even in the path.

       atf_check_equal "expected_expression" "actual_expression"
	       This function takes two expressions,  evaluates	them  and,  if
	       their  results differ, aborts the test case with	an appropriate
	       failure message.	 The common style is to	put the	expected value
	       in the first parameter and the actual value in the second para-
	       meter.

       atf_check_not_equal "expected_expression" "actual_expression"
	       This function takes two expressions,  evaluates	them  and,  if
	       their results are equal,	aborts the test	case with an appropri-
	       ate  failure  message.  The common style	is to put the expected
	       value in	the first parameter and	the actual value in the	second
	       parameter.

EXAMPLES
       The following shows a complete test program with	 a  single  test  case
       that validates the addition operator:

	     atf_test_case addition
	     addition_head() {
		 atf_set "descr" "Sample tests for the addition	operator"
	     }
	     addition_body() {
		 atf_check_equal 0 $((0	+ 0))
		 atf_check_equal 1 $((0	+ 1))
		 atf_check_equal 1 $((1	+ 0))

		 atf_check_equal 2 $((1	+ 1))

		 atf_check_equal 300 $((100 + 200))
	     }

	     atf_init_test_cases() {
		 atf_add_test_case addition
	     }

       This  other example shows how to	include	a file with extra helper func-
       tions in	the test program:

	     ... definition of test cases ...

	     atf_init_test_cases() {
		 . $(atf_get_srcdir)/helper_functions.sh

		 atf_add_test_case foo1
		 atf_add_test_case foo2
	     }

       This example demonstrates the use of the	very  useful  atf_check	 func-
       tion:

	     # Check for silent	output
	     atf_check -s exit:0 -o empty -e empty true

	     # Check for silent	output and failure
	     atf_check -s exit:1 -o empty -e empty false

	     # Check for known stdout and silent stderr
	     echo foo >expout
	     atf_check -s exit:0 -o file:expout	-e empty echo foo

	     # Generate	a file for later inspection
	     atf_check -s exit:0 -o save:stdout	-e empty ls
	     grep foo ls || atf_fail "foo file not found in listing"

	     # Or just do the match along the way
	     atf_check -s exit:0 -o match:"^foo$" -e empty ls

SEE ALSO
       atf-check(1), atf-sh(1),	atf-test-program(1), atf-test-case(4)

FreeBSD	14.3		       January 27, 2021			     ATF-SH(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=atf-sh&sektion=3&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help