CN105068937B - 一种Linux内核模块的单元测试方法 - Google Patents
一种Linux内核模块的单元测试方法 Download PDFInfo
- Publication number
- CN105068937B CN105068937B CN201510609496.7A CN201510609496A CN105068937B CN 105068937 B CN105068937 B CN 105068937B CN 201510609496 A CN201510609496 A CN 201510609496A CN 105068937 B CN105068937 B CN 105068937B
- Authority
- CN
- China
- Prior art keywords
- module
- tested
- unit testing
- unit
- test result
- 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.)
- Active
Links
- 238000010998 test method Methods 0.000 title claims abstract description 25
- 238000012360 testing method Methods 0.000 claims abstract description 153
- 238000000034 method Methods 0.000 claims description 23
- 238000002347 injection Methods 0.000 claims description 8
- 239000007924 injection Substances 0.000 claims description 8
- 230000006870 function Effects 0.000 description 32
- 235000013399 edible fruits Nutrition 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 230000008569 process Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000000243 solution Substances 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种Linux内核模块的单元测试方法,包括:对被测模块及单元测试模块进行编译,其中,所述被测模块包含所述单元测试模块;将所述被测模块加载至内核空间;利用所述单元测试模块对所述被测模块进行测试,得到测试结果。与现有技术相比,本申请同时对被测模块及单元测试模块进行编译,并且被测模块中包含单元测试模块,进一步将被测模块加载至内核空间进行单元测试,符合了Linux内核模块,即被测模块是在内核空间运行的特点,从而有效提高了测试准确度、可靠性及覆盖率等。
Description
技术领域
本发明涉及计算机系统及存储技术领域,更具体地说,涉及一种Linux内核模块的单元测试方法。
背景技术
单元测试是软件研发过程中的一个关键步骤,是对代码质量和产品质量检测的一个重要环节。
现有技术的Linux内核模块的单元测试方法通常是利用用户态的单元测试框架完成的,而Linux内核模块是在内核空间运行的,因此,当利用用户态的单元测试框架对Linux内核模块进行单元测试时,存在测试准确度、可靠性及覆盖率等较低等一系列问题。因此,现有技术中利用用户态的单元测试框架实现的单元测试方法并不适用于Linux内核模块的单元测试。
综上所述,如何提供一种适用于Linux内核模块的单元测试方法,是目前本领域技术人员亟待解决的问题。
发明内容
本发明的目的是提供一种Linux内核模块的单元测试方法,该方法适用于Linux内核模块。
一种Linux内核模块的单元测试方法,包括:
对被测模块及单元测试模块进行编译,其中,所述被测模块包含所述单元测试模块;
将所述被测模块加载至内核空间;
利用所述单元测试模块对所述被测模块进行测试,得到测试结果。
优选的,所述被测模块包含所述单元测试模块,包括:
所述单元测试模块的外部接口编写在所述被测模块的主函数流程中;
利用所述单元测试模块对所述被测模块进行测试,包括:
通过所述单元测试模块的外部接口调用所述单元测试模块,并利用所述单元测试模块对所述被测模块进行测试。
优选的,所述单元测试模块通过sysfs的接口方式提供其外部接口。
优选的,利用所述单元测试模块对所述被测模块进行测试,得到测试结果,包括:
利用所述单元测试模块对所述被测模块的特定模块接口进行测试,得到测试结果;所述测试结果包括:所述特定模块接口的接口函数名、所述特定模块接口的功能是否满足要求以及所述Linux内核模块所属的Linux内核打印出的日志信息。
优选的,利用所述单元测试模块对所述被测模块进行测试,得到测试结果,包括:
利用所述单元测试模块采用旁路测试的方法通过宏定义的方式对所述被测模块进行错误注入,得到测试结果。
优选的,得到所述测试结果之后,所述方法还包括:
判断所述测试结果是否符合预设结果,如果符合,则证明所述被测模块通过测试。
优选的,在对所述被测模块及单元测试模块进行编译之前,还包括:
对所述被测模块进行功能初始化。
优选的,所述方法还包括:
在所述被测模块的主函数流程中加入条件判断语句;并通过所述条件判断语句确定是否需要利用所述单元测试模块对所述被测模块进行测试。
本发明提供的一种Linux内核模块的单元测试方法,包括:对被测模块及单元测试模块进行编译,其中,所述被测模块包含所述单元测试模块;将所述被测模块加载至内核空间;利用所述单元测试模块对所述被测模块进行测试,得到测试结果。与现有技术相比,本申请同时对被测模块及单元测试模块进行编译,并且被测模块中包含单元测试模块,进一步将被测模块加载至内核空间进行单元测试,符合了Linux内核模块,即被测模块是在内核空间运行的特点,从而有效提高了测试准确度、可靠性及覆盖率等。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的本发明实施例提供的一种Linux内核模块的单元测试方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,其示出了本发明实施例提供的一种Linux内核模块的单元测试方法的流程图,包括:
S11:对被测模块及单元测试模块进行编译,其中,被测模块包含单元测试模块。
其中,被测模块即为Linux内核模块;而编译则是将被测模块及单元测试模块所包含的代码翻译成等价的另一种语言的程序,以进行单元测试。
S12:将被测模块加载至内核空间。
其中,加载这一动作即为将被测模块调到内核空间,而内核空间的具体概念为:Linux内核模块所属的系统,即Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux系统将此称为内核空间。
S13:利用单元测试模块对被测模块进行测试,得到测试结果。
本申请同时对被测模块及单元测试模块进行编译,并且被测模块中包含单元测试模块,进一步将被测模块加载至内核空间进行单元测试,符合了Linux内核模块,即被测模块是在内核空间运行的特点,从而有效提高了测试准确度、可靠性及覆盖率等。
上述实施例提供的一种Linux内核模块的单元测试方法中,将单元测试模块包含于被测模块的方式可以根据实际需要进行设定,优选的一种为将单元测试模块的外部接口编写在被测模块的主函数流程中。由此,利用单元测试模块对被测模块进行测试,则具体为:通过单元测试模块的外部接口调用单元测试模块,并利用单元测试模块对被测模块进行测试。
本发明实施例所提供的一种Linux内核模块的单元测试方法采用常用的编译方法,区别仅仅是,将单元测试模块的外部接口编写在被测模块的主函数流程中,由此,能够在减少工作量的同时实现本发明实施例所提供的一种Linux内核模块的单元测试方法所能够实现的有益效果。而当利用单元测试模块对被测模块进行测试时,只需通过调用单元测试的外部接口调用单元测试模块,简便易行。
上述实施例提供的一种Linux内核模块的单元测试方法中,单元测试模块可以通过sysfs的接口方式提供其外部接口。
其中,sysfs是一种虚拟文件系统,这个文件系统不仅可以把硬件设备和驱动程序的信息从Linux内核输出至用户空间,也可以用来对硬件设备和驱动程序做设置。与本发明实施例提供的上述技术特征综合考虑,本发明实施例提供的一种Linux内核模块的单元测试方法能够在用户空间和内核空间之间架起一个测试桥梁,使得测试单元模块对于被测模块的测试既可以在内核态时进行,也可以通过sysfs的接口方式提供的外部接口在命令行进行。即,能够通过多种方式实现对于被测模块的测试,而具体通过哪种方式根据实际情况进行确定,这使得本发明实施例提供的单元测试方法更加完善。
上述实施例提供的一种Linux内核模块的单元测试方法中,利用单元测试模块对被测模块进行测试,得到测试结果,可以包括:
利用单元测试模块对被测模块的特定模块接口进行测试,得到测试结果;测试结果包括:特定模块接口的接口函数名、特定模块接口的功能是否满足要求以及Linux内核模块所属的Linux内核打印出的日志信息。
其中,特定模块接口是根据实际需要进行确定的,其与单元测试模块的设置相对应;特定模块接口的数量可以是一个,也可以是多个。通过单元测试模块对被测模块的特定模块接口进行测试,可以通过测试结果获知该特定模块接口的接口函数名,以及该特定模块接口的功能是否满足要求,而要求时由工作人员根据实际需要进行设定的,只有当其功能满足要求时,才能证明其通过测试。而Linux内核打印出的日志信息可以包括多项内容,如可以包括特定模块接口的相关信息,以及测试过程中产生的各种中间量,以及被测模块及单元测试模块的代码,等等。由此,可通过测试结果获取与单元测试相关的上述各种信息,以便对被测模块的性能做出评价。
综合本发明实施例公开的上述技术特征进行分析,特定模块接口可以是被测模块的头文件中的接口。如被测模块的特定模块接口的接口函数分别为a()、b()、c()等,单元测试模块的外部接口的接口函数为test(),则在被测模块的主函数流程需包括test(),而在接口函数test()中要包含特定模块接口的函数接口a(),b(),c()等。
上述实施例提供的一种Linux内核模块的单元测试方法中,利用单元测试模块对被测模块进行测试,得到测试结果,可以包括:
利用单元测试模块采用旁路测试的方法通过宏定义的方式对被测模块进行错误注入,得到测试结果。
宏定义可以理解为将宏名替换为字符串,而旁路测试就是利用宏定义进行函数替换,即注入错误,以达到改变函数正常运行步骤的目的。如函数正常运行步骤为A->B->C->D,如果没有错误注入则会一直按照此流程运行,采用旁路测试的方法进行错误注入后,函数运行的步骤应该变为A->E->C->D,此时,如果函数实际运行的步骤为A->E->C->D,则证明函数代码的健壮性良好、错误处理机制较完善,而如果函数实际运行的步骤为A->F->C->D等于应该运行的步骤不同的流程,则说明该函数代码的健壮性较差、错误处理机制不够完善。如下即为旁路测试方法的一种程序代码:
#define config_parse_line(buf)({\
int ret;\
if(!parse)
ret=正确的
else
ret=parse
ret;
})
上述程序代码主要为:将函数config_parse_line通过宏定义的方式进行替换,当不进行错误注入(变量parse为真)时,返回值或函数运行流程为:A->B->C。当进行错误注入(parse为假)时,函数运行流程应变为:A>D->C。如果程序健壮性和错误处理机制不够完善时,则函数实际运行流程则为与A>D->C不同的其他流程。
因此,通过上述方式得到的测试结果,可获知被测模块的函数的代码的健壮性是否符合工作人员对其的要求。结合上述实施例公开的对被测模块的特定模块接口的测试,本发明实施例提供的一种Linux内核模块的单元测试方法,能够对被测模块进行有效而全面的测试,可以测试出被测模块潜在的问题。
上述实施例提供的一种Linux内核模块的单元测试方法中,得到测试结果之后,方法还可以包括:
判断测试结果是否符合预设结果,如果符合,则证明被测模块通过测试。
当测试结果不同时,对应的预设结果也不相同,预设结果可以根据实际需要进行确定。如果测试结果符合预设结果,则说明被测模块通过测试,可正常使用,而如果测试结果不符合预设结果,则说明被测模块未通过测试,无法正常使用。
上述实施例提供的一种Linux内核模块的单元测试方法中,在对被测模块及单元测试模块进行编译之前,还可以包括:
对被测模块进行功能初始化。
由此,对未被测模块进行单元测试做好准备,保证单元测试的顺利实现。
上述实施例提供的一种Linux内核模块的单元测试方法中,方法还可以包括:
在被测模块的主函数流程中加入条件判断语句;并通过条件判断语句确定是否需要利用单元测试模块对被测模块进行测试。
其中,被测模块的主函数流程中包括条件判断语句,当需要对该被测模块进行单元测试时,则通过条件判断语句控制单元测试开启,以对被测模块进行单元测试;当无需对被测模块进行单元测试时,则通过条件判断语句控制单元测试关闭,以无法对被测模块进行单元测试。由此,可以根据实际需要,通过条件判断语句控制单元测试的开启或者关系,保证了被测模块在需要进行单元测试时正常进行单元测试,而在无需进行单元测试时无法进行单元测试,使得其功能更加完善。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (6)
1.一种Linux内核模块的单元测试方法,其特征在于,包括:
对被测模块及单元测试模块进行编译,其中,所述被测模块包含所述单元测试模块;
将所述被测模块加载至内核空间;
利用所述单元测试模块对所述被测模块进行测试,得到测试结果;
利用所述单元测试模块对所述被测模块进行测试,得到测试结果,包括:
利用所述单元测试模块采用旁路测试的方法通过宏定义的方式对所述被测模块进行错误注入,得到测试结果,所述测试结果包括进行错误注入后所述被测模块的函数运行步骤;
所述被测模块包含所述单元测试模块,包括:
所述单元测试模块的外部接口编写在所述被测模块的主函数流程中;
利用所述单元测试模块对所述被测模块进行测试,包括:
通过所述单元测试模块的外部接口调用所述单元测试模块,并利用所述单元测试模块对所述被测模块进行测试。
2.根据权利要求1所述的方法,其特征在于,所述单元测试模块通过sysfs的接口方式提供其外部接口。
3.根据权利要求1所述的方法,其特征在于,利用所述单元测试模块对所述被测模块进行测试,得到测试结果,包括:
利用所述单元测试模块对所述被测模块的特定模块接口进行测试,得到测试结果;所述测试结果包括:所述特定模块接口的接口函数名、所述特定模块接口的功能是否满足要求以及所述Linux内核模块所属的Linux内核打印出的日志信息。
4.根据权利要求1所述的方法,其特征在于,得到所述测试结果之后,所述方法还包括:
判断所述测试结果是否符合预设结果,如果符合,则证明所述被测模块通过测试。
5.根据权利要求1所述的方法,其特征在于,在对所述被测模块及单元测试模块进行编译之前,还包括:
对所述被测模块进行功能初始化。
6.根据权利要求1至5任一项所述的方法,其特征在于,所述方法还包括:
在所述被测模块的主函数流程中加入条件判断语句;并通过所述条件判断语句确定是否需要利用所述单元测试模块对所述被测模块进行测试。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510609496.7A CN105068937B (zh) | 2015-09-22 | 2015-09-22 | 一种Linux内核模块的单元测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510609496.7A CN105068937B (zh) | 2015-09-22 | 2015-09-22 | 一种Linux内核模块的单元测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105068937A CN105068937A (zh) | 2015-11-18 |
CN105068937B true CN105068937B (zh) | 2018-09-28 |
Family
ID=54498314
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510609496.7A Active CN105068937B (zh) | 2015-09-22 | 2015-09-22 | 一种Linux内核模块的单元测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105068937B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105528292A (zh) * | 2015-12-07 | 2016-04-27 | 浪潮(北京)电子信息产业有限公司 | 一种基于内核模块的内核单元测试方法及系统 |
US20230052559A1 (en) * | 2020-02-10 | 2023-02-16 | Visa International Service Association | Network based testing of mobile device kernels system and method |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1641601A (zh) * | 2004-01-04 | 2005-07-20 | 华为技术有限公司 | 一种软件的单元测试方法 |
CN101634965A (zh) * | 2008-07-24 | 2010-01-27 | 三星电子(中国)研发中心 | 一种Linux内核级单元测试的方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102681940B (zh) * | 2012-05-15 | 2015-06-10 | 北京航空航天大学 | 一种针对Linux操作系统内存管理子系统进行性能测试的方法 |
CN102722434B (zh) * | 2012-05-24 | 2015-01-14 | 北京航空航天大学 | 一种针对Linux进程调度的性能测试方法和工具 |
KR101620536B1 (ko) * | 2012-08-01 | 2016-05-12 | 엠파이어 테크놀로지 디벨롭먼트 엘엘씨 | 액티브 록 정보 유지 및 검색 |
-
2015
- 2015-09-22 CN CN201510609496.7A patent/CN105068937B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1641601A (zh) * | 2004-01-04 | 2005-07-20 | 华为技术有限公司 | 一种软件的单元测试方法 |
CN101634965A (zh) * | 2008-07-24 | 2010-01-27 | 三星电子(中国)研发中心 | 一种Linux内核级单元测试的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105068937A (zh) | 2015-11-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP7164017B2 (ja) | フォールトツリー分析を使用して機能安全のため制御フローグラフを最適化するシステム及び方法 | |
US8799875B2 (en) | Streamlining unit testing through hot code swapping | |
CN105224458B (zh) | 一种数据库测试方法及系统 | |
CN110704304B (zh) | 一种应用程序测试方法、装置、存储介质和服务器 | |
CN109032927A (zh) | 一种漏洞挖掘方法及装置 | |
US9208451B2 (en) | Automatic identification of information useful for generation-based functional verification | |
US20100115496A1 (en) | Filter generation for load testing managed environments | |
CN110619210A (zh) | 一种模拟器检测方法及系统 | |
CN106326107B (zh) | 基于仿真环境的非侵入式嵌入式软件异常处理验证方法 | |
US8868976B2 (en) | System-level testcase generation | |
CN103123605B (zh) | 一种Android平台自动化集成测试方法和装置 | |
US20170109260A1 (en) | Test Simulation for Software Defined Networking Environments | |
CN106909498A (zh) | 一种Java程序注入故障的方法和系统 | |
CN107656872A (zh) | 软件测试方法、装置、设备和计算机存储介质 | |
CN107038120A (zh) | 一种软件测试方法和设备 | |
CN111773728B (zh) | 数据表测试方法、装置、设备及存储介质 | |
CN106407054A (zh) | 一种bmc自动测试系统及方法 | |
CN105068937B (zh) | 一种Linux内核模块的单元测试方法 | |
US10830818B2 (en) | Ensuring completeness of interface signal checking in functional verification | |
CN110287123A (zh) | 一种绕过ios系统调试检测的方法及装置 | |
Parasyris et al. | A framework for evaluating software on reduced margins hardware | |
CN104199713A (zh) | 一种嵌入式Linux操作系统裁剪定制方法 | |
CN104536745B (zh) | 任务修改方法和任务修改装置 | |
CN109918338B (zh) | 安全芯片操作系统测试装置 | |
Zhao et al. | Suzzer: A vulnerability-guided fuzzer based on deep learning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |