代码之家  ›  专栏  ›  技术社区  ›  Matt Moriarity

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

  •  3
  • Matt Moriarity  · 技术社区  · 15 年前

    我现在正在处理一个桌面电子邮件客户端,我想对我的后端进行单元测试。但是,我看不出一种方法来实现这一目标。为了让我的代码工作,它必须连接到一个工作的邮件服务器。除非我将单元测试绑定到一个电子邮件帐户,并确保该帐户与我的测试预期的状态匹配,否则我看不到如何管理该帐户。

    有人对如何测试这种应用程序有什么想法吗?这种应用程序的设计依赖于外部因素?

    编辑:

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

    5 回复  |  直到 15 年前
        1
  •  1
  •   Michael Lloyd Lee mlk    15 年前

    我要去 假定 通过测试后端,您指的是实际与电子邮件服务器对话的代码位,并测试您拥有的其他软件。 mocked 这一层。

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

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

    现在,如果您没有编写自己的smtp客户机,只需要 facade 在现有的第三方API周围,我不太可能“集成测试”这种情况,因为假设第三方API已经受到足够的攻击,以至于bug已经消失。我将研究模拟第三方API,并验证门面是否按预期工作。

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

        2
  •  7
  •   Community CDub    8 年前

    我愿意 mock 电子邮件服务器,并将模拟对象配置为视情况接受/拒绝电子邮件(取决于您的测试)。

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

    看看这个 SO question 用于C++模拟框架。

        3
  •  1
  •   Wim Coenen    15 年前

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

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

        4
  •  0
  •   sfussenegger    15 年前

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

        5
  •  0
  •   iain    15 年前

    安德鲁模仿邮件API是正确的。你在C语言中遇到的问题可以用两种方法之一来解决。

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

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