首页 > 解决方案 > 对使用 Glib 事件循环的程序使用 Google 测试

问题描述

我正在编写一个在 Linux 中作为后台服务运行的程序。我正在用 C++ 编写它并使用 glibmm 进行事件循环。

该程序将拥有的唯一用户界面是 D-Bus 服务。

我想用谷歌测试为它写一些测试。我的计划是在程序本身实例化 D-Bus 服务的同时,测试代码还将实例化 D-Bus 客户端并通过 D-Bus 调用在程序中启动操作。

我想到的测试用例大多类似于“调用 D-Bus 方法并使用断言来查看使用某些参数调用某个方法”。测试的一个重要结果也是简单地看到测试不会崩溃。

我可以看到有关如何编写程序和测试的严格选项。例如,理论上,可以在 main() 中创建一次事件循环,或者在每个测试用例中单独创建事件循环。如果它只创建一次,理论上它仍然可以在每个测试用例中连续运行或启动和停止。我尝试用谷歌搜索示例,但只找到了使用 Qt 而不是 Glib 的东西。我不知道这是否会产生重大影响。

对于这样的案例,是否有任何现有的智慧?什么值得尝试,什么不值得尝试?还是我打算将谷歌测试用于它不适合的东西?

标签: c++googletestdbusevent-loopglibmm

解决方案


您可能会发现将服务器构建为具有 C++ 接口的库并使用普通单元测试进行测试更容易。暴露在 D-Bus 上的垫片层可能非常薄,不需要大量测试。

如果你确实想测试 D-Bus 服务,将它编译到测试程序中可能会更容易(这样 D-Bus 客户端和服务器在同一进程中运行),这样你就不必担心处理服务器作为子进程(这增加了额外的复杂性并使调试失败变得更加棘手)。

然后在一个线程中运行D-Bus服务,在另一个线程中运行D-Bus客户端+测试代码,这样就不会互相阻塞了。

在每次测试后销毁主上下文和主循环(以及任何其他上下文)通常更安全,以确保您没有从一个测试留下的状态影响下一个测试。特别是,问题通常是GSource由一个测试留下的 sGMainContext在下一个持续触发中引起的。

我无法评论这如何转化为谷歌测试的使用。使用普通的GLib 单元测试 API当然可以做到这一点。


推荐阅读