如何对电子邮件客户端进行单元测试

时间:2009-10-08 12:46:17

标签: c++ unit-testing email testing email-client

我现在正在使用桌面电子邮件客户端,我想对我的后端进行单元测试。但是,我看不出有办法让这项工作成功。为了使我的代码能够工作,它必须连接到正常工作的邮件服务器。除非我将我的单元测试绑定到电子邮件帐户,并确保该帐户符合我的测试所期望的状态,否则我看不出如何管理它。

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

编辑:

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

5 个答案:

答案 0 :(得分:7)

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

要有效地执行此操作,您需要一个界面来与您的电子邮件服务器通信。对于测试,实现是一个模拟对象。对于部署,您可以将其替换为直接与邮件服务器对话的实现。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我将假设通过测试后端,你指的是实际与电子邮件服务器通信的代码,并测试你拥有的其他软件{{3}这层。

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

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

现在,如果您还没有编写自己的SMTP客户端,并且在现有的第三方API周围只有One Database Per Developer,那么假设第三方API受到足够的打击,我就不太可能“集成测试”错误已经消失了。我会看一下嘲笑第三方API并验证外观是否按预期工作。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Andrew对于模拟邮件API是正确的。你在C中的这个问题可以通过两种方式解决。

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

有一本很好的书介绍了如何在困难的情况下进行单元测试:“有效地使用遗留代码”,我不能高度推荐这本书。不要被标题推迟,本书将遗留代码视为没有单元测试的任何代码。