我应该在我的案例中编写什么样的测试?

What kind of tests should I write in my case?

我对单元测试、功能测试等有点陌生

我对适合我的案例的最佳方法有点困惑:

我的服务是这样做的:

  1. 通过 SFTP 连接到远程服务器
  2. 在本地复制一些 XML 个文件
  3. 解析那些文件
  4. 将解析后的数据存入数据库

我的服务运行良好,但我的问题是:如何测试这种行为?

专注于测试代码中风险最大的元素。 "risky elements" 我指的是可能实施不正确或不完整的事情,或者当您进行其他更改时可能会在以后中断的事情。

判断您应该测试什么的一个简单方法是您多次点击 "refresh" 或 "compile" 的部分只是为了看看会发生什么以及您是否完成了。例如,您提到您的系统解析 XML 文件:您可能想要输入范围广泛的 XML 文件以确保它们都能正常工作,但如果某个完美的人将 XML解析代码并说 "this is guaranteed to work" 你可能不会用手练习或探索。 自动化测试让您成为完美的人,或者至少知道您的代码何时很可能工作。此外,如果您发现该系统 工作的情况,它允许您编写测试以确定您的系统何时适用于该情况,并确保您的更改不会不会导致系统因您之前编写的任何测试而失败。

到那时,您将成为了解系统哪些部分风险最大的最佳专家,因此您可以最好地编写测试来减轻该风险。您可能还需要重组代码以使其足够灵活以进行测试,这可能包括使字段和方法可见或允许在数据库处理代码中使用替代数据库连接;这是正常且有价值的,如果它使您的系统更易于测试。


单元测试适用于小型独立系统,这意味着它们不一定适用于堆栈中的所有部分:

  1. connect to a remote server through SFTP

这部分可能很难进行单元测试,因为如果您的计算机离线或 SFTP 服务器关闭,您不一定希望测试失败。编写 功能测试 集成测试 以确保您的系统继续使用 SFTP 可能是个好主意你想要的服务器。

如果您想检查您的系统是否正确解释了您的配置以向正确的 SFTP 服务器发出正确的请求,那可能是一个很好的单元进行测试,但只会保证您提出正确的请求,而不是它会给您正确的响应或行为。对于 mock framework(模拟您的 FTP 调用)来说,这可能是一个很好的案例,但它会遇到同样的问题:您可以验证您正在发出预期的请求,但无法验证正确的响应出来了。

  1. copy some XML files locally

在单元测试中使用文件系统可能很困难,因为您需要确保将文件设置在临时目录或其他不会受到实际数据或先前测试影响的可预测位置。但是,这是可以做到的:您可以创建一个示例 XML 文件,运行 您的复制代码,并验证结果是否在预期的位置。

再一次,您可以使用模拟或存根来验证您是否对文件系统进行了正确的调用,这可能比使用真实文件系统更可预测,但只能保证您进行了预期的调用,并不是说您得到了正确的结果。

  1. parse those files

这是一个非常容易进行单元测试的案例。准备或下载一些示例文件,运行 它们通过您的解析器,并确保输出符合您的预期。

  1. save the parsed data in database

这部分也很容易测试,如果费力的话:你可以把你解析过的示例数据发送到你的系统,然后读取数据库以确保这些片段是你期望的。这里的困难可能在于确保您的数据库设置与生产类似,但不使用真正的生产数据库;您可能想使用内存数据库。

同样,您可以选择简单地检查数据库命令是否准确:您可能认为这足以确保您使用正确的查询和正确的参数。然而,使用真正的数据库引擎会给你一个更彻底的测试,确保命令成功,它通过关于必填字段或格式的任何数据库验证规则,并且它不会 t运行cate 或 drop字符或数字精度。

集成测试可以确保对于给定的 XML 文件,它可以正确地一直到达数据库;然而,这样的测试可能会更慢,如果它失败了,你可能需要做更多的工作来找出哪个单元失败了。因此,您可能应该尽快考虑全面的单元测试,然后再专注于集成和端到端测试。

另请参阅: Are (database) integration tests bad?,我在 Software Engineering Stack Exchange 上回答的相关问题