最近,我的团队中讨论了如何正确测试系统中输出存储在数据库中的组件的讨论。我们使用DDD创建系统,因此该组件最终与存储库进行通信,该存储库已实现与MongoDB进行通信的不同存储。作为测试框架,我们使用Cucumber,而用于测试的数据库是mongo的内存版本。
到现在为止,我们所有的场景都有一个命令作为输入,而输出是一个事件,因此我们的声明是在该事件上完成的。但是现在我们有了一个场景,其中处理事件并将结果存储在数据库中。发生这种情况后,可以使用rest调用来检索结果。
讨论的是测试这最后两种情况的方法。对于某些人来说,正确的方法是在事件处理后检查内存数据库,因为这是系统的输出。系统的最终部分是商店,它们必须进行测试以及作为场景的一部分。测试内存数据库包含的内容是正确的方法,因为商店仍在使用相同的生产就绪逻辑来写入输出。为了方便起见,我们将使用存储库来检索此数据,因为这种方式更容易,即使我们需要使用与手头场景无关的内容也是如此。
另一方面,对于某些人来说,我们不应该检查数据库,因为这是我们不应为测试而访问的另一个组件。相反,因为在这种情况下,rest调用只是检索数据,所以我们应该将rest调用用作测试的一部分,以验证输出。这样,我们的场景将包括这两个部分,即存储和检索,而不是拆分测试。
有没有正确的答案呢?我们在这里缺少点吗?谢谢。
我想说的是,通过REST调用进行验证是正确的方法。否则,它并不是真正的黑盒测试,而您的测试将取决于内部实现细节(您的数据库结构)。您通常希望查看您的应用程序对“外部世界”有什么影响,并且您的数据库不属于此IMO。
所有这些都假设您要创建的测试旨在成为黑盒测试。如果是集成测试(我猜是灰色框?),那么IMO使用存储库检查数据库可能是一个更好的主意。
如果打算用作单元测试,则应模拟组件的依赖关系。然后,您可以使用模拟来验证您的组件正确调用了存储库。
如果我误解了,请告诉我。:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句