4

我现在正在开发一个桌面电子邮件客户端,我想对我的后端进行单元测试。但是,我看不出有什么方法可以让它发挥作用。为了让我的代码工作,它必须连接到一个工作的邮件服务器。除非我将我的单元测试绑定到一个电子邮件帐户,并确保该帐户与我的测试期望的状态相匹配,否则我看不出我该如何管理它。

有没有人对如何测试这种应用程序有任何想法,它在设计上依赖于外部因素?

编辑:

添加一些细节:我正在为我的应用程序开发一个 C++ 更高级别的邮件客户端库,它使用 libEtPan(一个 C 库)来实际处理连接到邮件服务器并与之交互的细节。

4

5 回答 5

7

我会模拟电子邮件服务器,并配置该模拟对象以适当地接受/拒绝电子邮件(取决于您的测试)。

为了有效地做到这一点,您需要一个接口来与您的电子邮件服务器通信。对于测试,实现是一个模拟对象。对于部署,您可以将其替换为直接与邮件服务器对话的实现。

有关 C++ 模拟框架,请参阅此SO 问题

于 2009-10-08T12:49:29.340 回答
2

我将假设通过测试后端您指的是实际与电子邮件服务器对话的代码位,并测试您已模拟该层的其余软件。

现在这可能是也可能不是集成测试,具体取决于您的定义单元。坦率地说,我不在乎您决定如何称呼它,但是如果您编写一些运行迅速且经常执行的自动化测试,那么它们可能会使用与您的单元测试相同的平台。

我会尝试编写它,以便它至少可以通过以下两种方式工作 - 第一种是它连接到您可以根据需要设置和配置的进程本地电子邮件服务器。在 Java 中,我使用Dumpster,但我确信 C++ 也存在类似的东西。第二种方法是连接到至少一个您可以编写脚本的本地电子邮件服务器。您可以随心所欲地喷溅(因此不是真实的或在开发人员之间共享¹)并针对它运行相同的测试集。原因是 SMTP 服务器的开发人员讨厌所有人,您会想要检查您的存根是否与真实的东西一样工作。我认为这相当于每个开发人员一个数据库

现在,如果您还没有编写自己的 SMTP 客户端并且只是围绕现有的 3rd 方 API 有一个外观,那么我不太可能在假设 3rd 方 API 已经被严重破坏以至于错误已经出现的情况下进行“集成测试”。我会考虑模拟第 3 方 API 并验证外观是否按预期工作。

1) 也许你可以在 CI 周期中这样做,然后在所有开发人员之间共享一组电子邮件服务器,本地运行只使用 C++ Dumpster。

于 2009-10-08T13:35:59.560 回答
1

你只需要找到一种方法来用存根替换真实的东西,这完全在你的控制之下。通常,这是通过像Rhino.Mocks这样的模拟框架来完成的。

顺便说一句:如果您使用“真实”电子邮件帐户,那么它不再是单元测试,而是集成测试......

于 2009-10-08T12:54:02.343 回答
0

由于您很可能不想测试您对套接字的使用,您可能会考虑用不涉及任何 TCP 通信的虚拟服务器实现替换代码的那部分。只需对来自客户端的预期请求进行硬编码,并让您的虚拟服务器做出适当的响应。

于 2009-10-08T12:50:48.480 回答
0

Andrew 关于模拟邮件 API 是正确的。可以通过以下两种方式之一解决您在 C 中的问题。

  • 提供一个可以模拟的简单 C++ 包装器。
  • 使用链接器来提供您的 C api 的测试/模拟版本,您必须使用与库提供的相同的头文件,但您的单元测试链接到您的模拟 C 函数而不是库。

有一本很棒的书介绍了如何在困难的情况下进行单元测试:“Working Effectively with Legacy Code”,我不能高度推荐这本书。不要被标题吓到,本书将遗留代码视为任何没有单元测试的代码。

于 2009-10-08T14:15:50.540 回答