我正在编写一个程序,作为Linux中的后台服务运行。我正在用C++编写它,并使用glibmm进行事件循环。
该程序唯一的用户界面是D-Bus服务。
我想用谷歌测试为它写一些测试。我计划的是,当程序本身实例化D-Bus服务时,测试代码也会实例化D-Bus客户端,并通过D-Bus调用在程序中启动操作。
我脑海中的测试用例大多是类似于";调用一个D-Bus方法,并使用断言来查看某个方法是用某些参数调用的"测试的一个重要结果也是确保测试不会崩溃。
我可以看到关于如何编写程序和测试的更严格的选项。例如,理论上,可以在main((中创建一次事件循环,也可以在每个测试用例中单独创建。如果只创建一次,理论上它仍然可以连续运行,或者在每个测试用例中启动和停止。我试着在谷歌上搜索了一些例子,但只发现其中使用了Qt而不是Glib。我不知道这是否有什么不同。
对于这样的案件,有什么现存的智慧吗?什么值得尝试,什么不值得?还是我打算使用谷歌测试来做一些不该做的事情?
您可能会发现,使用C++接口将服务器构建为库,并使用普通的单元测试进行测试更容易。暴露在D-Bus上的垫片层可能非常薄,不需要大量测试。
如果您确实想测试D-Bus服务,那么将其编译到测试程序中可能会更容易(这样D-Bus客户端和服务器就可以在同一个进程中运行(,这样您就不必担心将服务器作为子进程来处理(这会增加额外的复杂性,并使调试失败变得更加棘手(。
然后在一个线程中运行D-Bus服务,在另一个线程运行D-Bus客户端+测试代码,这样它们就不会相互阻塞。
通常,在每次测试后销毁主上下文和主循环(以及任何其他上下文(更安全,以确保一次测试不会留下状态来影响下一次测试。特别是,问题通常是由GMainContext
中一个测试留下的GSource
在下一个测试中继续激发引起的。
我无法评论这是如何转化为谷歌测试的。当然可以用普通的GLib单元测试API来实现。