【问题标题】:Using Google Test for a program that uses Glib event loop对使用 Glib 事件循环的程序使用 Google 测试
【发布时间】:2020-10-28 06:57:46
【问题描述】:

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

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

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

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

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

对于这样的案例是否有任何现有的智慧?什么值得尝试,什么不值得尝试?还是我打算将 Google Test 用于不适合的用途?

【问题讨论】:

    标签: c++ googletest dbus event-loop glibmm


    【解决方案1】:

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

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

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

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

    我无法评论这如何转化为使用 Google 测试。用普通的GLib unit testing API当然可以做到。

    【讨论】:

    • 好主意。进行一些基本的集成测试以确保所有数据类型都通过 dbus 正确地进行了测试,这可能仍然是件好事。
    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多