我正在使用 Google 测试框架。
现在我需要测试我的程序,看看它是否可以
fork()
和 exec()
另一个子进程在某些条件下具有预期的 cli 参数。
但是
fork()
和exec()
是系统调用,而不是常见的函数调用。
我可以不能简单地使用模拟对象捕获调用。
如何做? 谢谢!
使用依赖注入并通过抽象层将系统调用函数注入到生产代码中(请参阅https://stackoverflow.com/a/54148046/7717227)
我推荐这种方法,因为它更符合“单元”测试的精神,因为你不会产生新的进程。
您还可以测试您期望看到的结果。当
fork
失败时,它会返回 -1
,您可以向上传播它并在单元测试中进行检查。或者,您可以使用另一个系统调用 waitpid
来检查子进程是否正在运行。请参阅:如何检查所有子进程是否结束?
请记住,您
exec
的应用程序应该有自己的单元测试,并且您不应该在这里进行测试。 fork
和 exec
之间也应该有最小的逻辑 - 理想情况下,任何错误路径都应该在分叉之前在父进程中进行验证。潜在的系统级问题(例如更改用户或达到进程限制)超出了单元测试的范围,属于集成或系统级测试。