1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/unittests
Martine Lenders 413153704a
tests/unittests/uri_parse: use less confusing assert message
Also use `strncmp()` instead of `memcmp()`
2020-04-01 00:56:08 +02:00
..
common
tests tests: use check_unittests func from testrunner 2020-03-19 10:39:34 +01:00
tests-analog_util tests: make use of ARRAY_SIZE macro 2019-08-06 19:43:54 +02:00
tests-base64 tests/unittests/base64: add test case for urlsafe_encode 2020-03-31 19:01:05 +02:00
tests-bcd
tests-bitfield tests/unittests: add tests for missing bitfield functions 2019-11-21 12:38:31 +01:00
tests-bloom tests/unittests: fix typos 2019-11-23 22:39:37 +01:00
tests-bluetil tests/unittests/bluetil: adapt to byteorder fixes 2019-08-28 16:49:21 +02:00
tests-checksum tests/checksum: add tests for crc8 2019-12-13 14:50:33 +01:00
tests-clif tests: Add unit tests for clif module 2019-10-04 11:35:52 +02:00
tests-color tests/unittests: test black corner case for color_rgb2hsv() 2019-09-27 09:35:39 +02:00
tests-core tests/unittests: fix GCC compiler bug in core-atomic for SAML1X 2020-02-26 10:56:15 +01:00
tests-credman tests: add credman unit tests 2019-07-19 13:56:40 +02:00
tests-div tests: make use of ARRAY_SIZE macro 2019-08-06 19:43:54 +02:00
tests-ecc sys/ecc: add repetition code 2018-10-18 13:37:21 +02:00
tests-fib tests/unittests: fix typos 2019-11-23 22:39:37 +01:00
tests-fib_sr tests/unittests: fix typos 2019-11-23 22:39:37 +01:00
tests-flashpage
tests-fmt unittests: add tests for fmt_is_x() functions 2019-12-05 15:39:24 +01:00
tests-frac frac: Integer fraction scaling library 2019-12-06 09:36:33 +01:00
tests-gcoap net/gcoap: remove test migrated to nanocoap 2020-01-29 09:24:46 -05:00
tests-gnrc_ipv6 tests/unittests/tests-gnrc_ipv6: fix NDEBUG compile problem 2020-03-12 17:40:46 +01:00
tests-gnrc_ipv6_hdr
tests-gnrc_ipv6_nib gnrc/nib: Move GNRC_IPV6_NIB_ABR_NUMOF to 'CONFIG_' namespace 2020-03-31 18:07:13 +02:00
tests-gnrc_mac_internal gnrc_mac: fix header includes 2018-11-29 12:39:34 +01:00
tests-gnrc_sixlowpan_frag_vrb net/gnrc/sixlowpan/frag/vrb:Move timeout macro to 'CONFIG_' namespace 2020-01-17 18:09:19 +01:00
tests-gnrc_udp doc: update IPv6 RFC references 2018-04-10 15:40:18 +02:00
tests-hashes tests/crypto*: use crypto_% modules instead of CFLAGS 2020-03-06 19:49:58 +01:00
tests-ieee802154
tests-inet_csum many typo fixes 2019-11-23 22:39:07 +01:00
tests-ipv4_addr
tests-ipv6_addr tests/unittests/ipv6_addr: Add tests for ipv6_addr_split_prefix 2019-11-15 14:35:30 +01:00
tests-ipv6_hdr tests: provide unittests for ipv6_ext_frag 2019-06-04 16:24:28 +02:00
tests-luid unittests: add test for luid module 2019-11-04 21:08:33 +01:00
tests-matstat tests: make use of ARRAY_SIZE macro 2019-08-06 19:43:54 +02:00
tests-mtd mtd_native: fix overlapping pages write check 2018-02-26 15:32:06 +01:00
tests-nanocoap tests/nanocoap: add test for coap_opt_add_uquery2() 2020-03-12 08:44:26 -04:00
tests-netopt
tests-netreg Revert "unittests: adapt tests-netreg" 2018-02-22 20:29:55 +01:00
tests-phydat tests: make use of ARRAY_SIZE macro 2019-08-06 19:43:54 +02:00
tests-pkt many typo fixes 2019-11-23 22:39:07 +01:00
tests-pktbuf tests/unittests: exclude ENOMEM tests for gnrc_pktbuf_malloc 2019-03-26 12:08:10 +01:00
tests-pktqueue tests/unittests: adapt to iolist pktsnip 2018-03-06 14:00:32 +01:00
tests-printf_float unittests: Fix printf float test BUFSIZE 2017-12-12 12:16:43 +01:00
tests-priority_pktqueue tests/unittests: adapt to iolist pktsnip 2018-03-06 14:00:32 +01:00
tests-rtc periph_common/rtc: add rtc_localtime() 2020-03-03 11:01:02 +01:00
tests-rtt_rtc tests/unittests: rtt_rtc: blacklist esp32 2020-03-24 23:15:55 +01:00
tests-saul_reg unittests/saul_reg: Add unit test for saul_reg_rm of list head 2018-02-18 12:05:54 +01:00
tests-scanf_float tests/unittests: add tests for scanf_float. 2019-05-28 12:10:39 +02:00
tests-seq
tests-sht1x unittests/sht1x: decrease the amount of tested values on board 2019-08-21 14:54:35 +02:00
tests-sixlowpan
tests-sixlowpan_ctx unittests: tests-sixlowpan_ctx: fix prefix check 2020-02-25 17:49:47 +01:00
tests-sixlowpan_sfr tests: add unittests for net/sixlowpan/sfr.h helpers 2019-10-01 08:45:19 +02:00
tests-sock_util net/sock/util: Move configuration macros to 'CONFIG_' namespace 2019-12-13 12:04:54 +01:00
tests-timex
tests-tsrb unittests: add tsrb tests 2019-06-05 17:54:56 +02:00
tests-uri_parser tests/unittests/uri_parse: use less confusing assert message 2020-04-01 00:56:08 +02:00
tests-uuid uuid: add uuid_from_string() 2018-10-03 10:44:14 +02:00
tests-vfs tests: make use of ARRAY_SIZE macro 2019-08-06 19:43:54 +02:00
tests-zptr tests/unittests: add basic zptr test 2020-02-11 13:59:59 +01:00
tests-ztimer tests/ztimer_mock: cleanup leftover debug messages 2020-03-16 15:21:22 +01:00
main.c tests: add test_utils_interactive_sync when possible 2019-11-27 15:07:42 +01:00
Makefile tests/unittests: blacklist bootloader_arduino feature 2020-03-18 10:53:18 +01:00
Makefile.ci tests/unittests: exclude nucleo-l412kb 2020-03-20 18:48:31 +01:00
map.h
README.md tests/unittests: fix typos 2019-11-23 22:39:37 +01:00

Unittests

Building and running tests

Tests can be built by calling:

cd tests/unittests
make

If there are tests for a module you even can build tests specifically for this module:

make tests-<module>
# e.g.
make tests-core

You then can run the tests by calling

make term

or flash them to your board as you would flash any RIOT application to the board (see board documentation|RIOT-Platforms).

You can debug your tests by running

make debug

and using GDB as usual.

Other output formats

Other output formats using embUnit's textui library are available by setting the environment variable OUTPUT:

  • Compiler: OUTPUT="COMPILER"
  • Text: OUTPUT="TEXT"
  • XML: OUTPUT="XML"
  • Color: OUTPUT="COLOR" (like default, but with red/green output)
  • Colored-Text: OUTPUT="COLORTEXT" (like TEXT, but with red/green output)

Compile example

OUTPUT="COMPILER" make tests-core
make term

(only outputs in case of test failures)

Text example

OUTPUT="TEXT" make tests-core
make term
- core_bitarithm_tests
1) OK test_SETBIT_null_null
2) OK test_SETBIT_null_limit
3) ...
- core_clist_tests
25) ...
- ...

OK (... tests)

XML example

OUTPUT="XML" make tests-core
make term
<?xml version="1.0" encoding='shift_jis' standalone='yes' ?>
<TestRun>
<core_bitarithm_tests>
<Test id="1">
<Name>test_SETBIT_null_null</Name>
</Test>
<Test id="2">
<Name>test_SETBIT_null_limit</Name>
</Test>
...
</core_bitarithm_tests>
<core_clist_tests>
<Test id="25">
<Name>test_clist_add_one</Name>
</Test>
...
</core_clist_tests>
<Statistics>
<Tests>...</Tests>
</Statistics>
</TestRun>

Writing unit tests

File structure

RIOT uses embUnit for unit testing. All unit tests are organized in tests/unittests and can be built module-wise, if needed. For each module there exists a tests-<modulename>/tests-<modulename>.h file, at least one C file in tests-<modulename>/ and a tests-<modulename>/Makefile. It is recommended to add a C file named tests-<modulename>/tests-<modulename>-<headername>.c for every header file that defines functions (or macros) implemented in the module. If there is only one such header file tests-<modulename>/tests-<modulename>.c should suffice.

Each *.c file should implement a function defined in tests-<modulename>/tests-<modulename>.h, named like

Test *tests_<modulename>_<headername>_tests(void);

/* or respectively */

Test *tests_<modulename>_tests(void);

Testing a module

To write new tests for a module you need to do three things:

  1. Create a Makefile: add a file tests-<modulename>/Makefile
  2. Define a test header: add a file tests-<modulename>/tests-<modulename>.h
  3. Implement tests: for each header file, that defines a function or macro implemented or related to the module, add a file tests-<modulename>/tests-<modulename>-<headername>.c or tests-<modulename>/tests-<modulename>.c if there is only one header.

Create a Makefile

The Makefile should have the following content:

include $(RIOTBASE)/Makefile.base

Define a test header.

The test header tests-<modulename>/tests-<module>.h of a module you add to tests/unittests/ should have the following structure

/*
 * Copyright (C) <year> <author>
 *
 * This file is subject to the terms and conditions of the GNU Lesser
 * General Public License v2.1. See the file LICENSE in the top level
 * directory for more details.
 */

/**
 * @addtogroup  unittests
 * @{
 *
 * @file
 * @brief       Unittests for the ``module`` module
 *
 * @author      <author>
 */
#ifndef TESTS_<MODULE>_H
#define TESTS_<MODULE>_H
#include "embUnit/embUnit.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief   Generates tests for <header1>.h
 *
 * @return  embUnit tests if successful, NULL if not.
 */
Test *tests_<module>_<header1>_tests(void);

/**
 * @brief   Generates tests for <header2>.h
 *
 * @return  embUnit tests if successful, NULL if not.
 */
Test *tests_<module>_<header2>_tests(void);

/* ... */

#ifdef __cplusplus
}
#endif

#endif /* TESTS_<MODULE>_H */
/** @} */

Implement tests

Every tests-<modulename>/tests-<module>*.c file you add to tests/unittests/ should have the following structure:

/*
 * Copyright (C) <year> <author>
 *
 * This file is subject to the terms and conditions of the GNU Lesser
 * General Public License v2.1. See the file LICENSE in the top level
 * directory for more details.
 */

/* clib includes */

#include "embUnit.h"

#include "<header>.h"

#include "tests-<module>.h"

/* your macros */

/* your global variables */

static void set_up(void)
{
    /* omit if not needed */
}

static void tear_down(void)
{
    /* omit if not needed */
}

static void test_<function1>_<what1>(void) {
    /* ... */

    TEST_ASSERT(/* ... */);
}

static void test_<function1>_<what2>(void) {
    /* ... */

    TEST_ASSERT(/* ... */);
}

/* ... */

static void test_<function2>_<what1>(void) {
    /* ... */

    TEST_ASSERT(/* ... */);
}

static void test_<function2>_<what2>(void) {
    /* ... */

    TEST_ASSERT(/* ... */);
}

/* ... */

Test *tests_<module>_<header>_tests(void)
{
    EMB_UNIT_TESTFIXTURES(fixtures) {
        new_TestFixture(test_<function1>_<what1>),
        new_TestFixture(test_<function1>_<what2>),
        new_TestFixture(test_<function2>_<what1>),
        new_TestFixture(test_<function2>_<what2>),
        /* ... */
    };

    EMB_UNIT_TESTCALLER(<module>_<header>_tests, set_up, tear_down, fixtures);
    /* set up and tear down function can be NULL if omitted */

    return (Test *)&<module>_<header>;
}

The following assertion macros are available via embUnit

Assertion Description
TEST_ASSERT_EQUAL_STRING(expected,actual) Assert that strings actual and expected are equivalent
TEST_ASSERT_EQUAL_INT(expected,actual) Assert that integers actual and expected are equivalent
TEST_ASSERT_NULL(pointer) Assert that pointer == NULL
TEST_ASSERT_NOT_NULL(pointer) Assert that pointer != NULL
TEST_ASSERT_MESSAGE(condition, message) Assert that condition is TRUE (non-zero) or output customized message on failure.
TEST_ASSERT(condition) Assert that condition is TRUE (non-zero)
TEST_FAIL(message) Register a failed assertion with the specified message. No logical test is performed.