1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/unittests
2022-01-19 11:43:35 +01:00
..
common
tests tests: use check_unittests func from testrunner 2020-03-19 10:39:34 +01:00
tests-analog_util tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-base64 tests/unittests/tests-base64: enlarge test buffer for worst case 2021-11-29 13:24:40 +01:00
tests-bcd
tests-bitfield treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-bloom treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-bluetil tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-checksum tests/unittests: fix unaligned access 2021-11-16 14:23:45 +01:00
tests-chunked_ringbuffer tests/unittests: add tests for chunked_ringbuffer 2022-01-19 11:43:35 +01:00
tests-clif unittests/clif: add attribute test cases 2021-03-05 16:47:48 +01:00
tests-color treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-core Merge pull request #16098 from kfessel/p-remove-lifo 2021-06-15 13:55:30 +02:00
tests-credman tests/unittests/credman: add tests for key load functions 2021-09-20 08:11:01 +02:00
tests-div tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-ecc treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-fib treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-fib_sr treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-fmt tests/unittests/tests-fmt: add large scale test for fmt_s32_dfp() 2021-11-22 14:11:02 +01:00
tests-frac tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-gcoap tests/unittests: Change sequence of expected resources 2020-10-03 00:00:46 +02: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 treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-gnrc_mac_internal treewide: use new gnrc_pkt API functions instead of utlist.h macros 2020-10-13 13:32:53 +02:00
tests-gnrc_netif_pktq tests/unittests: extend tests for gnrc_netif_pktq_usage() 2021-03-15 15:13:59 +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
tests-hashes treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-ieee802154 tests/unittests: fix test vectors 2021-12-03 11:32:29 +01:00
tests-inet_csum many typo fixes 2019-11-23 22:39:07 +01:00
tests-ipv4_addr unittests/tests-ipv4_addr: test_ipv4_addr_to_str__addr_NULL(): zero a 2021-07-05 16:50:44 +02:00
tests-ipv6_addr treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-ipv6_hdr tests/unittests/tests-ipv6_hdr: fix too short ipv6_hdr_t allocations 2021-07-05 22:35:29 +02:00
tests-kernel_defines core: Add IS_CT_CONSTANT() 2022-01-06 23:30:56 +01:00
tests-luid unittests: add test for luid module 2019-11-04 21:08:33 +01:00
tests-matstat tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-mtd mtd: Change API to return 0 on success 2020-05-06 20:24:27 +02:00
tests-nanocoap treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-netopt treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-netreg
tests-phydat tests/*: realign ENABLE_DEBUG 2020-10-23 11:27:48 +02:00
tests-pkt tests/unittests: add tests for new pkt operations 2020-10-29 18:06:35 +01:00
tests-pktbuf unittests: Qualifier cast for pktsnip test initializers 2020-06-25 16:08:39 +02:00
tests-pktqueue unittests: Qualifier cast for pktsnip test initializers 2020-06-25 16:08:39 +02:00
tests-printf_float
tests-priority_pktqueue treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-rtc sys: move rtc utility functions to their own module 2021-12-20 13:04:20 +01:00
tests-rtt_rtc test/unittest: no auto ztimer_periph_rtt 2021-12-07 10:07:55 +01:00
tests-saul_reg tests/unittests/tests-saul_reg: remove saul_reg_rm test function 2022-01-08 11:49:06 +01:00
tests-scanf_float treewide: Remove excessive newlines 2021-08-13 19:50:38 +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 treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
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 sys/net/sock_util: make use of SOCK_HAS_IPV4 2022-01-13 18:40:12 +01:00
tests-timex
tests-tsrb sys/tsrb: add tsrb_clear 2021-12-06 11:53:59 +01:00
tests-turo unittests/turo: Fix turo to use check 2021-11-16 08:37:46 +01:00
tests-uri_parser tests/unittests: amend uri_parser tests for query-splitter 2021-08-04 12:47:28 +02:00
tests-ut_process tests/unittests: provide test cases for ut_process 2021-09-16 18:18:48 +02:00
tests-uuid treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-vfs treewide: Remove excessive newlines 2021-08-13 19:50:38 +02:00
tests-zptr tests/unittests: add basic zptr test 2020-02-11 13:59:59 +01:00
tests-ztimer test/unittest: init ztimer, work around ztimer_t uint64_t 2021-12-06 13:31:18 +01:00
tests-ztimer64 tests/unittests: add ztimer64 regression test 2021-12-09 14:10:16 +01:00
main.c test/unittest: init ztimer, work around ztimer_t uint64_t 2021-12-06 13:31:18 +01:00
Makefile Merge pull request #15187 from bergzand/pr/info/add_json 2020-10-15 21:27:26 +02:00
Makefile.ci boards/stm32g031-disco,examples,tests: Added STM32G031-DISCO board 2021-10-13 12:14:45 -04: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.