Linux内核开发人员在提交代码后如何在本地测试他们的代码?他们是否使用某种单元测试和构建自动化?测试计划?
当前回答
LTP和memtest通常是首选工具。
其他回答
在树的工具
在内核中找到测试工具的一个好方法是:
做出帮助并阅读所有目标 在工具/测试下面找找
在4.0版本中,这导致我:
在工具/测试/自我测试下进行自我测试。运行make selftest。必须运行已构建的内核。请参见:Documentation/kselftest.txt, https://kselftest.wiki.kernel.org/ 工具/测试/ Ktest下的Ktest。参见:http://elinux.org/Ktest, http://www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktest make help的静态分析器部分,其中包含如下目标: linux源代码中的checkstack.pl做什么? 双球菌检查(askb提及)
内核CI
https://kernelci.org/是一个旨在使内核测试更加自动化和可见的项目。
它似乎只做构建和引导测试(TODO如何自动测试引导工作,源代码应在https://github.com/kernelci/)。
Linaro似乎是这个项目的主要维护者,有许多大公司的贡献:https://kernelci.org/sponsors/
Linaro洗
http://www.linaro.org/initiatives/lava/看起来像一个CI系统,专注于开发板和Linux内核。
可怜的丽莎
https://github.com/ARM-software/lisa
不知道它具体做了什么,但它是由ARM和Apache授权的,所以可能值得一看。
演示:https://www.youtube.com/watch?v=yXZzzUEngiU
一步调试器
不是真正的单元测试,但在测试开始失败时可能会有所帮助:
QEMU + GDB: https://stackoverflow.com/a/42316607/895245 KGDB: https://stackoverflow.com/a/44226360/895245
我自己的QEMU + Buildroot + Python设置
我还开始了一个专注于易于开发的设置,但我最终也添加了一些简单的测试功能:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this-repo
我没有非常详细地分析所有其他设置,它们可能比我的设置做得更多,但是我相信我的设置非常容易快速开始,因为它有很多文档和自动化。
Linux内核开发人员在提交代码后如何在本地测试他们的代码? 他们是否使用某种单元测试和构建自动化?
从传统意义上来说,没有。
例如,Ingo Molnar正在运行以下工作负载:
用一组随机配置选项构建一个新内核 引导进入 转到第1节
每个构建失败、启动失败、错误或运行时警告都将得到处理。24/7。乘以几个方框,就可以发现很多问题。
测试计划?
No.
可能存在误解,认为有一个中央测试设施,但实际上没有。每个人都做他/她想做的事。
一旦贡献者提交了他们的补丁文件并发出了合并请求,Linux看门人就会通过集成和审查补丁来检查补丁。一旦成功,他们将把补丁合并到相关的分支中,并发布一个新版本。
Linux测试项目是提供在应用补丁后针对内核运行的测试场景(测试用例)的主要来源。这可能需要大约2 ~ 4个小时,这取决于情况。
请注意所选内核将要测试的文件系统。 例如:ext4生成的结果与ext3不同,依此类推。
内核测试过程。
从存储库(Linux内核档案或GitHub)获取最新的内核源代码 应用补丁文件(使用diff工具) 构建新内核。 针对LTP (Linux测试项目)中的测试过程进行测试
我可以想象他们使用虚拟化来进行快速测试。它可以是QEMU、VirtualBox或Xen之类的东西,以及一些执行配置和自动化测试的脚本。
自动化测试可能是通过尝试许多随机配置或少数特定配置(如果他们处理特定问题)来完成的。Linux有很多低级工具(比如dmesg)来监视和记录来自内核的调试数据,所以我认为也会使用它。
adobriyan提到了Ingo的随机配置构建测试循环。现在,零日测试机器人(又名kbuild测试机器人)几乎涵盖了这一点。这里有一篇关于基础结构的不错的文章:内核构建/引导测试
这种设置背后的想法是尽快通知开发人员,以便他们能够尽快纠正错误(在某些情况下,在补丁进入Linus的树之前,因为kbuild基础设施也会针对维护人员的子系统树进行测试)。
推荐文章
- 如何在Linux中循环目录?
- 如何确定一个进程是否运行在lxc/Docker内部?
- 仅在文件不存在时才将行追加到文件中
- 如何强制makefile重新构建目标?
- 如何在父进程退出后使子进程死亡?
- 从URL执行bash脚本
- [: shell编程中的意外操作符
- 为什么Linux被称为单片内核?
- 在Unix中,我可以在一个目录中运行'make'而不首先cd'到该目录吗?
- 如何从命令行重置Jenkins安全设置?
- 如何查看Linux共享库正在导出的函数列表?
- 在Docker Alpine容器中启动一个shell
- 快速unix命令显示文件中间的特定行?
- fork(), vfork(), exec()和clone()的区别
- 在tmux中保持窗口名称固定