我现在正在开发一个桌面电子邮件客户端,我想对我的后端进行单元测试。然而,我看不到有什么方法可以做到这一点。为了让我的代码正常工作,它必须连接到一个正常工作的邮件服务器。除非我将我的单元测试绑定到一个电子邮件帐户,并确保该帐户与我的测试期望的状态相匹配,否则我不知道如何管理它。
有没有人对如何测试这种依赖于外部因素的应用程序有什么想法?
编辑:
补充一些细节:我正在为我的应用程序开发一个C++高级邮件客户端库,它使用C库libEtPan来实际处理连接到邮件服务器并与之交互的细节。
发布于 2009-10-08 13:36:00
我将假设通过测试后端,您指的是实际与电子邮件服务器对话的代码,并且为了测试您的软件的其余部分,您有mocked这一层。
现在,这可能是也可能不是集成测试,这取决于您的定义单元。坦率地说,我并不关心您决定如何命名它,但是如果您编写了一些运行迅速且经常执行的自动化测试,那么它们也可以使用与您的单元测试相同的平台。
我尝试这样写,这样它至少可以通过以下两种方式工作-第一种方式是连接到进程本地电子邮件服务器,您可以根据需要设置和配置该服务器。在Java语言中,我使用的是Dumpster,但我相信C++也有类似的东西。第二种方法是连接到至少一个您可以编写脚本的本地电子邮件服务器。一个你可以随心所欲的飞溅(所以不是真实的或在开发人员之间共享的),并对其运行相同的测试集。原因是SMTP服务器的开发人员讨厌每个人,您将希望检查您的存根是否像真实的一样工作。我认为这等同于One Database Per Developer。
现在,如果您还没有编写自己的SMTP客户端,而只是在现有的第三方API周围有一个facade,那么我就不太可能在假设第三方API已经受到足够的打击以至于bug已经掉出来的情况下进行“集成测试”。我会考虑模仿第三方API并验证外观是否如预期的那样工作。
1)也许你可以在CI周期中做到这一点,然后在所有开发人员之间共享一组电子邮件服务器,本地运行只需使用类似的C++垃圾箱。
发布于 2009-10-08 12:49:29
我将对电子邮件服务器执行mock操作,并配置该模拟对象以适当地接受/拒绝电子邮件(取决于您的测试)。
要有效地做到这一点,您需要一个接口来与您的电子邮件服务器进行对话。为了进行测试,实现是一个模拟对象。对于部署,您可以将其替换为直接与邮件服务器对话的实现。
有关C++模拟框架,请参阅此SO question。
发布于 2009-10-08 12:54:02
你只需要找到一种方法来用存根替换真正的东西,这完全在你的控制之下。通常,这是通过Rhino.Mocks等模拟框架来完成的。
顺便说一句,如果你使用一个“真正的”电子邮件帐户,那么它就不再是一个单元测试,而是一个集成测试……
https://stackoverflow.com/questions/1537578
复制相似问题