在集成测试中命中数据库是否可以?

时间:2017-04-08 03:45:15

标签: rest integration-testing database-testing

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

我正在使用spring boot开发一个由少数微服务组成的Rest API。其中一些服务基本上可以通过UI应用程序访问crud操作,或者将其用于内部验证/查询。

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

1 - 在集成测试中点击真实数据库是否可以?

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

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

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

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

我知道这可能是一个特定的情况,但我非常感谢您找到一种优雅的方法来测试这种情况。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您应该提出不同的建议:对您的生产数据库运行测试可接受的风险是什么?

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

但如果你陷入困境并且数据库严重损坏,整个网站需要被删除以备最初失败的备份...所以你的企业离线2天,你觉得你的经理会怎么样那?

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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