浅尝内核原生单元测试Kunit

301 阅读1分钟

配置文件

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index f37c4b8380ae..1b97f2cf6165 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -5,6 +5,14 @@
 
 menu "Misc devices"
 
+config MISC_EXAMPLE
+	bool "My example"
+
+config MISC_EXAMPLE_TEST
+	tristate "Test for my example" if !KUNIT_ALL_TESTS
+	depends on MISC_EXAMPLE && KUNIT
+	default KUNIT_ALL_TESTS
+
 config SENSORS_LIS3LV02D
 	tristate
 	depends on INPUT
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index f2a4d1ff65d4..74fd1964174a 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -3,6 +3,8 @@
 # Makefile for misc devices that really don't fit anywhere else.
 #
 
+obj-$(CONFIG_MISC_EXAMPLE) += example.o
+obj-$(CONFIG_MISC_EXAMPLE_TEST) += example_test.o
 obj-$(CONFIG_IBM_ASM)		+= ibmasm/
 obj-$(CONFIG_IBMVMC)		+= ibmvmc.o
 obj-$(CONFIG_AD525X_DPOT)	+= ad525x_dpot.o

代码文件

example.h


int misc_example_add(int left, int right);

example.c

#include <linux/errno.h>

#include "example.h"

int misc_example_add(int left, int right)
{
	return left + right;
}

example_test.c

#include <kunit/test.h>
#include "example.h"

/* Define the test cases. */

static void misc_example_add_test_basic(struct kunit *test)
{
        KUNIT_EXPECT_EQ(test, 1, misc_example_add(1, 0));
        KUNIT_EXPECT_EQ(test, 2, misc_example_add(1, 1));
        KUNIT_EXPECT_EQ(test, 0, misc_example_add(-1, 1));
        KUNIT_EXPECT_EQ(test, INT_MAX, misc_example_add(0, INT_MAX));
        KUNIT_EXPECT_EQ(test, -1, misc_example_add(INT_MAX, INT_MIN));
}

static void misc_example_test_failure(struct kunit *test)
{
        KUNIT_FAIL(test, "This test never passes.");
}

static struct kunit_case misc_example_test_cases[] = {
        KUNIT_CASE(misc_example_add_test_basic),
        KUNIT_CASE(misc_example_test_failure),
        {}
};

static struct kunit_suite misc_example_test_suite = {
        .name = "misc-example",
        .test_cases = misc_example_test_cases,
};
kunit_test_suite(misc_example_test_suite);

MODULE_LICENSE("GPL");

kunit配置文件

该文件位于linux kernel代码根目录下。

.kunit/.kunitconfig

CONFIG_KUNIT=y
CONFIG_KUNIT_EXAMPLE_TEST=y
CONFIG_MISC_EXAMPLE=y
CONFIG_MISC_EXAMPLE_TEST=y

运行命令

./tools/testing/kunit/kunit.py run

效果

image.png