如果使用 Cucumber 将输出发送到数据库,我该如何测试组件?

How do I test a component were the output goes to a database using Cucumber?

最近我的团队讨论了如何正确测试输出存储在数据库中的系统组件。我们使用 DDD 来创建我们的系统,因此该组件最终会与一个存储库对话,该存储库实现了与 MongoDB 对话的不同商店。我们使用 Cucumber 作为测试框架,我们用于测试的数据库是 mongo 的内存版本。

到目前为止,我们所有的场景都有一个命令作为输入,输出是一个事件,所以我们的断言是在事件上完成的。但是现在我们有一个处理事件并将结果存储在数据库中的场景。发生这种情况后,可以使用 rest 调用检索结果。

讨论的是如何测试最后两个场景。对于某些人来说,正确的方法是在事件处理后检查内存数据库,因为那是系统的输出。系统的最终部分是商店,必须对它们以及场景的一部分进行测试。测试内存数据库包含的内容是正确的方法,因为商店仍在使用相同的生产就绪逻辑来编写输出。为了方便起见,我们将使用存储库来检索此数据,因为这种方式更容易,即使我们需要使用与手头场景无关的东西也是如此。

另一方面,对于某些人来说,我们不应该检查数据库,因为这是我们不应该为测试访问的另一个组件。相反,因为在这种情况下 rest 调用只是检索数据,所以我们应该将 rest 调用用作测试的一部分来验证输出。这样,我们的场景将包括这两个部分,即存储和检索而不是拆分测试。

这个问题有正确答案吗?我们在这里遗漏了什么吗? 谢谢。

我想说用 REST 调用验证是在这里进行验证的正确方法。否则它就不是真正的黑盒测试,并且您的测试将取决于内部实现细节(您的数据库结构)。你通常想看看你的应用程序对 "outside world" 有什么影响,而你的数据库不是这个 IMO 的一部分。

这一切都是假设您正在创建的测试旨在成为黑盒测试。如果它是一个集成测试(我猜是~灰色框?)那么 IMO 使用存储库检查数据库可能是一个更好的主意。

如果打算进行单元测试,则应模拟组件的依赖项。然后,您可以使用模拟来验证您的组件是否正确调用了存储库。

如果我误解了什么,请告诉我。 :)