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_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_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 programs
     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	applica-
     tions 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 de-
     scribed in atf-test-case(4).   To	define	test  cases,  one  can	use  the
     atf_test_case  function,  which takes a first parameter specifying 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 defining  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 program is run.  In order to do so,
     a	later  registration is needed through the atf_add_test_case function de-
     tailed 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  variables
     through  the atf_config_has and atf_config_get methods.  The former takes a
     single parameter specifying a variable name and returns a boolean	indicat-
     ing 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 defined.	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 execu-
     tion 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 ex-
     pectations 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  nature
	     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.  Otherwise, 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 final-
	     izes cleanly and is reported as `expected failure'; this report in-
	     cludes the provided reason as part of it.	If no  error  is  raised
	     while  running  in  this  mode,  then  the test case is reported as
	     `failed'.

	     This mode is useful to reproduce actual known bugs in tests.  When-
	     ever 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 failure 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  sig-
	     nal.   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 ignored.

     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 out-
	     put, and fails the test case if any of the checks is  not	success-
	     ful.   This  function  is	particularly useful in integration 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 syn-
	     tax).  You should always use the atf_check function instead of  the
	     atf-check(1)  tool  in  your scripts; the latter 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 parameter.

     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 appropriate 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  functions
     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 function:

	   # 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 stdout || 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 ports 15.quarterly	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+Ports+15.1.quarterly>

home | help