CN101634965B - 一种Linux内核级单元测试的方法 - Google Patents
一种Linux内核级单元测试的方法 Download PDFInfo
- Publication number
- CN101634965B CN101634965B CN 200810134082 CN200810134082A CN101634965B CN 101634965 B CN101634965 B CN 101634965B CN 200810134082 CN200810134082 CN 200810134082 CN 200810134082 A CN200810134082 A CN 200810134082A CN 101634965 B CN101634965 B CN 101634965B
- Authority
- CN
- China
- Prior art keywords
- function
- unit testing
- unit
- kernel
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
提供一种Linux内核级单元测试的方法,包括:编译被测模块,并将编译后的被测模块加载到内核空间;建立并实现内核级单元测试框架;建立并实现单元测试模块;将内核级单元测试框架连同单元测试模块一起编译,并且将编译后的模块加载到内核空间;以及输出单元测试结果。
Description
技术领域
本发明涉及一种单元测试方法,更具体地说,涉及一种Linux内核级单元测方法。
背景技术
单元测试被公认为软件开发过程中的一个关键步骤。单元测试能够简化错误检测,在减少开发时间和成本的同时提高软件质量。
通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list中去,然后确认该值出现在list的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。
当前已经存在多种单元测试框架,但是都是用于用户空间的应用程序单元测试。例如,在公开号为CN101055522A的发明专利中公开了一种自动生成单元测试例的方法和装置,其中,预先设置程序单元的详细设计文档,读取详细设计文档中接口规格部分,并且从接口规格部分解析出所有针对程序单元的参数的参数值,然后将各参数的参数值组合生成单元测试例。
在公开号为CN1987821A的发明专利中公开了一种实现单元测试的方法及系统,具体地说,该方法和系统利用记录函数信息的方法,将一函数抽离开发环境进行单元测试,依据该函数的测试实例对该函数进行测试,产生测试覆盖率及测试报告,并且将其作为该函数的品质参考数据。
在公开号为CN1641601A的发明专利中公开了一种软件的单元测试方法,在该方法中,启动测试用例;设置能够提供被测单元所需数据的桩环境或数据库环境;构造被测单元所需的输入参数,并驱动被测单元执行被测函数或方法,该被测函数或方法需要的下层数据或外部数据从桩环境或数据库环境获取;检查被测函数或方法的输出以验证被测单元是否工作正常。
目前尚无Linux内核空间的单元测试框架和完善的单元测试方法。因此,需要一种Linux内核中做单元测试的方法来解决Linux内核级单元测试的问题。
发明内容
本发明的目的在于提供一种Linux内核中做单元测试的方法来解决Linux内核级单元测试。
根据本发明的一方面,提供一种Linux内核级单元测试的方法,所述方法包括:编译被测模块,并将编译后的被测模块加载到内核空间;建立并实现内核级单元测试框架;建立并实现单元测试模块;将内核级单元测试框架连同单元测试模块一起编译,并且将编译后的模块加载到内核空间;以及输出单元测试结果。
根据本发明的另一方面,提供一种Linux内核级单元测试的方法,所述方法包括:编译被测模块,并将编译后的被测模块加载到内核空间;建立并实现内核级单元测试框架;建立并实现单元测试模块;分别编译内核级单元测试框架和单元测试模块,并且先将编译后的内核级单元测试框架加载到内核空间,再将编译后的单元测试模块加载到内核空间;以及输出单元测试结果。
附图说明
通过下面结合附图进行的描述,本发明的目的和特点将会变得更加清楚,其中:
图1是根据本发明的示例性实施例的内核级单元测试方法的流程图;
图2是根据本发明的示例性实施例的调用关系的示图;以及
图3是根据本发明的另一示例性实施例的内核级单元测试方法的流程图。
具体实施方式
下面将详细说明本发明的实施例。首先,明确在本发明的实施例中使用的几个概念。
被测模块
被测模块是我们编写的某种用途的内核模块,需要对它进行单元测试,在本发明的示例性实施例中假定为被测模块为mod。
被测函数
被测模块中的被测函数。在本发明的示例性实施例中假定有一个单元foo的被测函数foo_bar。
单元测试模块
单元测试模块一个独立的内核模块,用单元测试模块来对被测模块中的单元进行单元测试。在本发明的示例性实施例中假定为kut_mod。
单元测试函数
单元测试函数包括在单元测试模块中,用于对被测模块中的被测函数进行测试。在本发明的示例性实施例中假定为test_foo_bar,test_foo_baz等。
Linux内核级单元测试(KUnit)框架模块
KUnit框架可以编译为一个独立的内核模块,这样它可以同时被多个单元测试模块使用。KUnit框架也可以和单元测试模块一起编译为一个独立的单元测试模块。
断言
断言是一个简单的方法调用,用于判断某个语句是否为真。
下面将参照图1详细根据本发明的内核级单元测试方法。在步骤S101,当测试被测模块mod时,可以修改被测模块的代码,以使用EXPORT_SYMBOL宏将被测模块的被测函数导出到内核空间中,并且将被测模块编译为mod.ko。
在步骤S102,使用insmod命令将mod.ko加载到内核空间。
在步骤S103,建立并实现KUnit框架。具体地说,建立KUnit框架包括实现内核空间断言(kunit_assert)、实现调用单元测试函数的方法(kunit_run)以及实现单元测试结果的收集、管理和输出(kunit_result)。
在本发明的示例性实施例中,可以按照下述方式来实现内核空间断言(kunit_assert):
#define kunit_assert(condition)\
do{ \
if(!(condition)) \
return#condition; \
}while(0)
其中,参数包含断言条件(例如,condition)。断言的关键是对条件的判断,条件condition不满足时返回不满足的条件信息。
kunit_run带有一个参数,该参数是单元测试函数。kunit_run的主要职责是调用单元测试函数,收集单元测试函数执行的结果,并且将该结果保存在某种数据结构中(例如,链表)。结果信息至少包含单元测试函数名,ID,测试成功与否,失败时的断言错误信息,以便最后输出。
下面将描述调用单元测试函数,收集测试结果,对测试结果进行管理的过程。
单元测试模块(kut_mod)的test_foo函数用于对与被测模块mod中foo单元的每个被测函数(如foo_bar,foo_baz等)相应的单元测试模块中的单元测试函数(test_foo_bar等)依次调用kunit_run,然而,test_foo函数被单元测试模块的入口函数(kut_mod_init)调用。参见如图2所示的调用关系。
图中test_foo_bar函数分别用kunit_assert来断言foo_bar各种测试用例的结果。
最后通过kunit_result函数,遍历内部的链表或其它数据结构,输出各结点上保存的结果信息。输出信息可以显示在屏幕,内核日志文件或者远端机器上。
在步骤S104,建立并实现单元测试模块kut_mod。kut_mod包括入口函数kut_mod_init函数和test_foo函数。kut_mod_init函数是单元测试模块的入口函数。test_foo函数对每个单元测试函数依次调用kunit_run,并且test_foo函数被kut_mod_init函数调用。
在步骤S105,将KUnit框架连同单元测试模块kut_mod一起编译为内核单元测试模块kut_mod.ko,并且使用insmod命令将kut_mod.ko加载到内核空间。
然后,在步骤S106,在加载kut_mod.ko的同时启动入口函数kut_mod_init从而进行自动化的内核单元测试,并输出结果。
此外,KUnit框架可以不与单元测试模块kut_mod一起被编译,而是被单独编译。下面将参照图3描述根据本发明的示例性实施例的将KUnit框架单独编译的单元测试方法。
在步骤S301,当测试被测模块mod时,可以修改被测模块的代码,以使用EXPORT_SYMBOL宏将被测模块的被测函数导出到内核空间中,并且将被测模块编译为mod.ko。
在步骤S302,使用insmod命令将mod.ko加载到内核空间。
在步骤S303,建立并实现KUnit框架。具体地说,建立KUnit框架包括实现内核空间断言(kunit_assert)、实现调用单元测试函数的方法(kunit_run)以及实现单元测试结果的收集、管理和输出(kunit_result)。
在本发明的示例性实施例中,可以按照下述方式来实现内核空间断言(kunit_assert):
#define kunit_assert(condition)\
do{ \
if(!(condition)) \
return#condition; \
}while(0)
其中,参数包含断言条件(例如,condition)。断言的关键是对条件的判断,条件condition不满足时返回不满足的条件信息。
kunit_run带有一个参数,该参数是单元测试函数。kunit_run的主要职责是调用单元测试函数,收集单元测试函数执行的结果,并且将该结果保存在某种数据结构中(例如,链表)。结果信息至少包含单元测试函数名,ID,测试成功与否,失败时的断言错误信息,以便最后输出。
下面将描述调用单元测试函数,收集测试结果,对测试结果进行管理的过程。
单元测试模块(kut_mod)的test_foo函数用于对与被测模块mod中foo单元的每个被测函数(如foo_bar,foo_baz等)相应的单元测试模块中的单元测试函数(test_foo_bar等)依次调用kunit_run,然而,test_foo函数被单元测试模块的入口函数(kut_mod_init)调用。参见如图2所示的各函数之间的调用关系。
图中test_foo_bar函数分别用kunit_assert来断言foo_bar各种测试用例的结果。
最后通过kunit_result函数,遍历内部的链表或其它数据结构,输出各结点上保存的结果信息。输出信息可以显示在屏幕,内核日志文件或者远端机器上。
在步骤S304,建立并实现单元测试模块kut_mod。kut_mod包括入口函数kut_mod_init函数和test_foo函数。kut_mod_init函数是单元测试模块的入口函数。test_foo函数对每个单元测试函数依次调用kunit_run,并且test_foo函数被kut_mod_init函数调用。
在步骤S305,分别将KUnit框架和kut_mod编译为kunit.ko和kut_mod.ko,并且使用insmod命令将其加载到内核空间。因为KUnit框架被编译为一个独立的内核模块,在该内核模块中,用EXPORT_SYMBOL宏导出kunit_assert,kunit_run,kunit_result符号,并将KUnit框架编译为kunit.ko。在将kunit.ko和kut_mod.ko加载到内核空间时,先加载kunit.ko,再加载kut_mod.ko。
然后,在步骤S306,在加载kut_mod.ko的同时启动入口函数kut_mod_init从而进行自动化的内核单元测试,并输出结果。
根据本发明的Linux内核级单元测试方法能够有效地对内核中的被测模块进行自动化的单元测试。
尽管已经参照本发明的特定的示例性实施例显示和描述了本发明,但本领域的技术人员应该理解,在不脱离由权利要求限定的本发明的精神和范围的情况下,可以对其进行各种形式和细节的变形。
Claims (10)
1.一种Linux内核级单元测试的方法,包括:
编译被测模块,并将编译后的被测模块加载到内核空间;
建立并实现内核级单元测试框架;
建立并实现内核空间断言、实现调用单元测试函数以及实现单元测试结果的收集、管理和输出,并将内核级单元测试框架和单元测试模块一起编译为一个独立内核的模块;
建立并实现单元测试模块;
将内核级单元测试框架连同单元测试模块一起编译,并且将编译后的模块加载到内核空间;以及
输出单元测试结果。
2.如权利要求1所述的方法,其中,实现调用单元测试函数的步骤包括实现一函数,该函数以单元测试函数为参数,且该函数调用单元测试函数,收集单元测试函数执行的结果,并且将该结果保存在数据结构中。
3.如权利要求2所述的方法,其中,所述结果的信息至少包含单元测试函数名、单元测试函数ID、测试成功与否、失败时的断言错误信息。
4.如权利要求1所述的方法,其中,实现单元测试结果的收集、管理和输出包括断言被测函数各种测试用例的结果、遍历内部的链表或其它数据结构,并且输出各结点上保存的结果信息。
5.如权利要求1所述的方法,其中,所述单元测试模块包括入口函数kut_mod_init和对每个单元测试函数依次调用实现调用单元测试函数的函数test_foo,其中,入口函数kut_mod_init调用test_foo。
6.一种Linux内核级单元测试的方法,包括:
编译被测模块,并将编译后的被测模块加载到内核空间;
建立并实现内核级单元测试框架;
建立并实现内核空间断言、实现调用单元测试函数以及实现单元测试结果的收集、管理和输出,并将内核级单元测试框架编译为一个独立的内核模块,这样内核级单元测试框架能够同时被多个单元测试模块使用;
建立并实现单元测试模块;
分别编译内核级单元测试框架和单元测试模块,并且先将编译后的内核级单元测试框架加载到内核空间,再将编译后的单元测试模块加载到内核空间;以及
输出单元测试结果。
7.如权利要求6所述的方法,其中,实现调用单元测试函数的步骤包括实现一函数,该函数以单元测试函数为参数,且该函数调用单元测试函数,收集单元测试函数执行的结果,并且将该结果保存在数据结构中。
8.如权利要求7所述的方法,其中,所述结果的信息至少包含单元测试函数名、单元测试函数ID、测试成功与否、失败时的断言错误信息。
9.如权利要求6所述的方法,其中,实现单元测试结果的收集、管理和输出包括断言被测函数各种测试用例的结果、遍历内部的链表或其它数据结构,并且输出各结点上保存的结果信息。
10.如权利要求6所述的方法,其中,所述单元测试模块包括入口函数kut_mod_init和对每个单元测试函数依次调用实现调用单元测试函数的函数test_foo,其中,入口函数kut_mod_init调用test_foo。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200810134082 CN101634965B (zh) | 2008-07-24 | 2008-07-24 | 一种Linux内核级单元测试的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200810134082 CN101634965B (zh) | 2008-07-24 | 2008-07-24 | 一种Linux内核级单元测试的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101634965A CN101634965A (zh) | 2010-01-27 |
CN101634965B true CN101634965B (zh) | 2012-01-11 |
Family
ID=41594160
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200810134082 Expired - Fee Related CN101634965B (zh) | 2008-07-24 | 2008-07-24 | 一种Linux内核级单元测试的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101634965B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101984408B (zh) * | 2010-11-03 | 2013-11-27 | 蓝汛网络科技(北京)有限公司 | 一种linux程序代码加载的方法及装置 |
CN102497296A (zh) * | 2011-12-13 | 2012-06-13 | 曙光信息产业(北京)有限公司 | 一种网卡收发包正常性测试方法 |
CN105512022B (zh) * | 2014-09-25 | 2018-09-28 | 华为技术有限公司 | 一种数据处理方法和设备 |
CN105068937B (zh) * | 2015-09-22 | 2018-09-28 | 浪潮(北京)电子信息产业有限公司 | 一种Linux内核模块的单元测试方法 |
CN105204998B (zh) * | 2015-09-30 | 2018-01-30 | 上海斐讯数据通信技术有限公司 | 一种移动终端内核符号表的调试方法和装置 |
CN105528292A (zh) * | 2015-12-07 | 2016-04-27 | 浪潮(北京)电子信息产业有限公司 | 一种基于内核模块的内核单元测试方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1983209A (zh) * | 2005-12-14 | 2007-06-20 | 中兴通讯股份有限公司 | 一种软件单元测试自动化系统及其方法 |
US20080163165A1 (en) * | 2006-12-28 | 2008-07-03 | Sap Ag. | method and framework for object code testing |
-
2008
- 2008-07-24 CN CN 200810134082 patent/CN101634965B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1983209A (zh) * | 2005-12-14 | 2007-06-20 | 中兴通讯股份有限公司 | 一种软件单元测试自动化系统及其方法 |
US20080163165A1 (en) * | 2006-12-28 | 2008-07-03 | Sap Ag. | method and framework for object code testing |
Also Published As
Publication number | Publication date |
---|---|
CN101634965A (zh) | 2010-01-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101383871B (zh) | 一种网元配置的实现方法及装置 | |
CN102520972B (zh) | 电子游戏开发系统及其方法 | |
CN101634965B (zh) | 一种Linux内核级单元测试的方法 | |
US8719784B2 (en) | Assigning runtime artifacts to software components | |
CN106775744B (zh) | 一种生成静态库的方法和装置 | |
CN107526676B (zh) | 一种跨系统测试方法及装置 | |
US20060136880A1 (en) | System, apparatus and methods for automatic program translation | |
US8219856B2 (en) | Memory growth detection | |
CN107832059A (zh) | 一种基于Makefile的代码静态分析方法和装置 | |
CN104133676A (zh) | 一种基于脚本的功能执行方法和设备 | |
CN104375933A (zh) | 一种单元测试方法和装置 | |
CN112486459B (zh) | 活动页面生成方法、装置、计算机设备和可读存储介质 | |
CN115658529A (zh) | 用户页面的自动化测试方法以及相关设备 | |
CN110543427A (zh) | 测试用例存储方法、装置、电子设备及存储介质 | |
CN111913889A (zh) | 一种测试系统搭建方法及测试系统 | |
CN111666201A (zh) | 回归测试方法、装置、介质及电子设备 | |
CN108287720B (zh) | 软件编译方法、装置、设备及存储介质 | |
CN114064503A (zh) | 一种ui自动化测试方法、装置、电子设备及存储介质 | |
CN114327484A (zh) | 支持多架构的k8s集成与部署方法、系统及存储介质 | |
CN109684192A (zh) | 基于数据处理的本地测试方法、设备、存储介质及装置 | |
CN112241373A (zh) | 自动化测试方法、测试装置、处理器和测试系统 | |
CN110806891B (zh) | 嵌入式设备软件版本的生成方法及装置 | |
CN101673200A (zh) | 用户输入模型的检测方法及装置 | |
CN101141767A (zh) | 一种网络管理平台测试系统及方法 | |
CN112631563A (zh) | 基于框架的系统开发方法、装置、计算机设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120111 Termination date: 20130724 |