Zephyrのテストフレームワーク調査①〜サンプル実験〜
はじめに
Zephyrにはテストフレームワーク (Mockもあります!) が用意されています。 テストは大事です。さっさとテストを作れるようにしましょう!
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
スクリプトで解析するようで、ドキュメントに制限が色々と書いてあります。
それは、追々紹介します。
今日は、とりあえずここまでです。