1

我在集成测试中有一个非常具体的情况。

我正在使用 Spring Boot 开发由几个微服务组成的 Rest API。其中一些服务基本上具有供 UI 应用程序访问或用于内部验证/查询的粗略操作。

所有数据库操作都是通过遗留库(没有 jpa)的过程完成的,我使用的是非标准数据库。我知道良好做法说不要使用真实数据库,但在这种情况下,我无法想象如何在测试时使用虚拟数据库(如 dbunit 或 h2)。这样:

1 - 可以在集成测试中访问真实数据库吗?

如果 1 没问题,我还有一个问题:

通常,我们不会在单元/集成测试中更改数据状态;并且测试应该彼此独立。

但是,就我而言,我只知道 post 方法的响应中的实体 id 是什么,因此难以实现 get/put/delete 方法。当然在 get/put/delete 方法中我可以先插入,然后再进行另一个操作,但是从这个角度来看,最后,我将拥有一个与测试开始时处于不同状态的数据库。这样,我的另一个问题是:

2 - 如何在测试前将数据库恢复到相同的状态?

我知道这可能是一个特定的情况,但我真的很感谢任何帮助找到一种优雅的方式来测试这个场景。

提前致谢。

4

3 回答 3

3

您应该问不同的问题:针对您的生产数据库运行测试的风险是否可以接受?

含义:如果您的测试只发现代码中的问题,那么每个人都会很高兴。

但是,如果您搞砸了,数据库严重损坏,整个站点需要关闭以进行最初失败的备份……所以您的业务离线 2 天,您认为您的经理会喜欢这样吗?

长话短说:这取决于。如果你能控制风险——是的。但如果没有,请寻找其他替代方案。至少:确保您的经理了解您在做什么。

于 2017-04-08T04:44:43.617 回答
1

集成测试很好,只要您不在生产环境中运行它们,我就必须说。它允许测试整个应用程序以及您如何处理响应、序列化和反序列化。您的测试用例应该处理您期望在生产数据库中拥有的内容,并且每个测试测试都应该被隔离,并且您在测试用例中创建的内容必须在它恢复到原始状态后将其删除,否则您可能会遇到测试用例冲突。在本地数据库或专用测试数据库中测试集成测试。

于 2017-04-08T05:40:43.113 回答
0

您可以为接口集成测试指定内存中的 H2 数据库,并根据特定测试的需要填充它。当您在 Jenkins 或类似的单元测试系统上拥有数据库没有意义的情况下运行时,这很有用。这实际上取决于您要测试的内容,即端到端集成或更精细的集成。

于 2017-04-08T03:55:53.480 回答