Zephyrのテストフレームワーク調査①〜サンプル実験〜

はじめに

Zephyrにはテストフレームワーク (Mockもあります!) が用意されています。 テストは大事です。さっさとテストを作れるようにしましょう!

docs.zephyrproject.org

Ztest

ZephyrのテストフレームワークZtestは、インテグレーションテストにも、特定モジュールのユニットテストにも利用できます。

The framework can be used in two ways, either as a generic framework for integration testing, or for unit testing specific modules.

サンプルのテストを動かしてみる

zephyr/tests/ztest/test/baseに簡単なサンプルが見つかりました。

$ ls
CMakeLists.txt      prj_verbose_1.conf  src
prj_verbose_0.conf  prj_verbose_2.conf  testcase.yaml

testcase.yamlにテストケースを書いて、その際にプロジェクトの設定を切り替えることができるようです。

$ cat testcase.yaml 
tests:
  testing.ztest:
    tags: test_framework
    type: unit
  testing.ztest.verbose_0:
    extra_args: CONF_FILE=prj_verbose_0.conf
    tags: test_framework
  testing.ztest.verbose_1:
    extra_args: CONF_FILE=prj_verbose_1.conf
    tags: test_framework
  testing.ztest.verbose_2:
    extra_args: CONF_FILE=prj_verbose_2.conf
    tags: test_framework

テストを実行するには、zephyr/script/sanitycheckを使います。

# テストケースを指定してテストを実行
$ ./scripts/sanitycheck -s <PATH TO TEST>/<test-identifier>

# プロジェクトのテストを全て実装
$ ./scripts/sanitycheck -T <PATH TO TEST>/

試しに、testing.ztest.verbose_0をターゲットにテストをしてみます。

$ ./scripts/sanitycheck -s tests/ztest/test/base/testing.ztest.verbose_0
JOBS: 16
Selecting default platforms per test case
Building testcase defconfigs...
10 tests selected, 81753 tests discarded due to filters
total complete:   10/  10  100%  failed:    0
10 of 10 tests passed with 0 warnings in 15 seconds

おっそ!15秒ですか…。

それは、ともかくとして、何をやっているのか全くわかりません。少しずつ紐解いてみましょう。

サンプルプロジェクトの中身を覗く

テストケースの記述は、至って普通です。

|> src/main.c

#include <ztest.h>

static void test_empty_test(void)
{
}

static void test_assert_tests(void)
{
    zassert_true(1, NULL);
    zassert_false(0, NULL);
    zassert_is_null(NULL, NULL);
    zassert_not_null("foo", NULL);
    zassert_equal(1, 1, NULL);
    zassert_equal_ptr(NULL, NULL, NULL);
}

void test_main(void)
{
    ztest_test_suite(framework_tests,
             ztest_unit_test(test_empty_test),
             ztest_unit_test(test_assert_tests)
             );

    ztest_run_test_suite(framework_tests);
}

どうも、sanitycheckスクリプトで解析するようで、ドキュメントに制限が色々と書いてあります。 それは、追々紹介します。

今日は、とりあえずここまでです。