2017-04-08 37 views
-1

我在集成测试中有一个非常特殊的情况。可以在集成测试中打到数据库吗?

我正在开发一个由少量使用spring引导的微服务组成的Rest API。这些服务中的一些基本上具有crud操作,可以由UI应用程序访问或用于内部验证/查询。

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

1 - 可以在集成测试中打真正的数据库吗?

如果1是确定的,我还有一个问题:

通常情况下,我们不改变单位/集成测试的数据状态;并且测试应该是彼此独立的。

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

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

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

在此先感谢。

+1

集成测试*将*打到真正的数据库 - 因为它是*集成*测试。播种数据库的方法很多,例如DbUnit,但还有其他的方法。 –

+0

只需带数据的数据库副本,并在完成集成测试后,使用它 –

+0

您是否想使用实时数据?在运行测试时,其他人可以访问数据吗?如果您修改数据库并且其他人可能正在访问您的测试数据并认为它是真实数据,那么可能会导致哪些问题? – ajb

回答

0

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

+0

不知道我是否清楚。但在我的情况下,使用像h2这样的内存数据库来进行测试并不那么简单。 1 - 我没有使用标准数据库(这意味着db的元语言不完全遵循ansi sql。),并且可以为每个表和过程定义2个定义; 2 - 我没有使用jpa和我的'db库',它只准备通过过程查询目标数据库。 –

+0

Mockito是另一种选择,但更多的单元测试重点。它也可以在这种情况下工作。 – Jason

+0

我需要测试我的程序调用。所有的应用程序都旨在使用这种方法。 Mockito和dbunit/h2非常酷,只要嘲笑结果即可。这不是我的情况,我需要做一个点到点验证。 –

1

你应该以不同的方式提问:对生产数据库运行测试可以接受的风险是什么?

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

但是,如果你搞砸了,数据库被严重破坏,并且整个站点需要关闭以备最初失败的备份......所以你的业务离线2天,你认为你的经理会如何像那样?

长话短说:这要看。如果你能控制风险 - 是的。但是,如果没有,寻找其他的选择。至少:确保你的经理明白你在做什么。

+0

坦率地说,我对在生产环境中运行这些测试并不感到兴奋,因为您总是必须承担所有'生产测试'的风险。理想情况下,他们不应该打破所有的数据库(这只是一些粗暴的操作),但在我看来最好将数据库恢复到初始状态。 不确定,但配置集成环境可能是避免针对生产运行的替代方案。 无论如何,我正在寻找替代品,因为这种类型的os测试在使用jpa时非常容易,您可以在虚拟数据库中模拟数据源。 –

0

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

相关问题