delphi - 如何测试连接到 FTP 服务器的类?

标签 delphi unit-testing ftp delphi-2010

我正在为我的应用程序开发实时更新。到目前为止,我已经创建了几乎所有单元测试,但我不知道如何测试连接到 FTP 服务器并下载新版本的特定类。

要测试此类,我应该创建一个 FTP 测试服务器并在单元测试中使用它吗?如果是这样,我如何确保该 FTP 服务器始终与我的测试一致?我应该在测试开始之前手动创建所需的每个文件,还是应该在我的测试类中自动创建此文件(拆卸和设置方法)?

这个问题也适用于连接任何类型服务器的单元测试类。

编辑

我已经在模拟我的 ftp 类,因此我并不总是需要在其他测试中连接到 ftp 服务器。

让我看看我对沃伦在评论中所说的话是否正确:

I would argue that once you're talking to a separate app over TCP/IP we should call that "integration tests". One is no longer testing a unit or a method, but a system.

当单元测试需要与另一个应用程序(可以是 HTTP 服务器或 FTP 服务器)通信时,这不再是单元测试而是集成服务器?如果是这样,我尝试使用单元测试技术来创建此测试是否做错了?我不应该对这个类进行单元测试是否正确?这对我来说确实有意义,因为单元测试似乎需要做很多工作。

最佳答案

在测试中,目的始终是首先回答以下问题:测试什么内容 - 即测试的范围。

因此,如果您正在测试 FTP 服务器实现,则必须创建一个 FTP 客户端。

如果您正在测试 FTP 客户端,则必须创建 FTP 服务器。

因此,您必须缩小测试范围,直到达到单一级别。

它可能是例如为了您的目的:

  • 获取应用程序当前安装的文件列表;
  • 获取远程可用文件的列表;
  • 获取文件更新;
  • 检查文件是否正确(校验和?);
  • 等等...

每个测试项目都有一些模拟和 stub 。请参阅this article关于两者之间的区别。简而言之(AFAIK), stub 只是一个始终有效的模拟对象。而模拟(在每个测试中应该是唯一的)是可能改变测试结果(通过或失败)的元素。

对于 FTP 连接的确切目的,您可以(测试客户端时)有一些返回文件列表的 stub ,以及一个将测试 FTP 服务器的几个可能问题(超时、连接丢失、内容错误)的模拟。然后您的客户端将按预期使用react。您的模拟可能是一个真正的 FTP 服务器实例,但其行为将按预期触发所有潜在错误。通常,每个错误都会引发一个异常,该异常将由测试单元跟踪,以便通过/失败每个测试。

编写好的测试代码有点困难。测试驱动的方法一开始有点耗时,但从长远来看总是更好。这里必须有一本好书,或者至少有一些引用文章(如上面链接的马丁·福勒的文章)。在 Delphi 中,使用接口(interface)和 SOLID 原则可以帮助您编写此类代码,并创建 stub /模拟来编写测试。

根据我的实验,每个程序员有时都会在编写测试时迷失……良好的测试编写可能比功能编写更耗时,在某些情况下……请注意!每个测试都应被视为一个功能,并应评估其成本:值得吗?在这里进行另一个测试不是更合适吗?我的测试是否与其正在测试的功能脱钩?不是已经测试过了吗?我是在测试我的代码,还是第三方/库功能?

偏离主题,但我想说两点:HTTP/1.1 如今可能比 FTP 更好,即使对于文件更新也是如此。您可以恢复 HTTP 连接,并行加载 HTTP 内容,并且该协议(protocol)比 FTP 更适合代理。而且托管一些 HTTP 内容比 FTP 容易得多(一些 FTP 服务器也存在已知的安全问题)。如今,大多数软件更新都是通过 HTTP/1.1 执行,而不是 FTP(例如 Microsoft 产品或大多数 Linux 存储库)。

编辑:

当您使用远程协议(protocol)时,您可能会说您正在进行集成测试。这可能有道理,但恕我直言,这不一样。

据我了解,当您让所有组件像实际应用程序一样一起工作,然后检查它们是否按预期工作时,就会发生集成测试。我关于 FTP 测试的建议是,您可以模拟 FTP 服务器,以便明确测试所有潜在问题(超时、连接或传输错误...)。这与集成测试不同:代码覆盖率要大得多。而且您只测试代码的一部分,而不是整个代码集成。这并不是因为您正在使用某些远程连接来进行集成测试:这仍然是单一测试。

当然,集成和系统测试应在单一测试之后进行。但是FTP客户端统一测试可以模拟FTP服务器,在本地运行它,但测试真实的大万维网中可能发生的所有潜在问题。

关于delphi - 如何测试连接到 FTP 服务器的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895702/

相关文章:

delphi - 为什么 TInterfacedObject 的后代不被垃圾收集?

c# - 如何将一个大文件拆分成多个小文件(对 FTP 更友好),然后再将它们合并回来?

php - 从带有路径列表的FTP服务器下载文件并下载列出的每个文件

Delphi 7 - 尝试理解MVC模式

delphi - 衰落值常规功能/过程

delphi - 隐藏窗口阴影

unit-testing - 基于 Spock 交互的测试 : too few invocation on a method

visual-studio-2010 - 在 TFS 2010 中以不同的身份运行测试

python - python 中的单元测试 : ignore an import from the code I want to test

java - 使用 Java 通过 FTP 将所有目录复制到服务器