这个问题有点笼统,不是很具体。
我们有一个使用Oracle数据库的Java项目。我们目前正在使用SoapUI工具进行质量检查。每个测试在运行之前都需要一些数据存在于数据库中。我们当前运行测试的方式如下:


在每次测试之前,我们运行一个.sql文件(该测试唯一)将一些数据加载到db
中, SoapUI测试
我们使用通用的.sql文件擦除为测试插入的测试数据
回到1并运行下一个测试。

此方法的优点对我们来说,每个测试都在带有其自身数据的“干净表”上运行,并且与其他测试无关。

缺点是,例如,在开发过程中每次数据库中的某些内容发生更改时在表中添加了一列,我们需要更改插入到该表中的所有sql脚本,而不是在一个地方进行更改,这使得维护测试非常困难。

我想知道做这种事情的行业“标准”方法是什么,或者了解解决此问题的更多方法。

任何建议都会很棒。

评论

在stackoverflow.com/questions/12049772/…处还有另一个答案。也许可以在这里迁移/合并。

#1 楼

建议不要使用dbUnit之类的东西来导入测试数据,而不要使用SQL脚本。 dbUnit将以XML格式生成数据库转储(这还将允许您使用与数据库无关的测试数据)。

优点是您可以编写(生成)脚本,该脚本将


导入dbUnit数据集,
在其上运行数据库更新SQL脚本(如果没有这些脚本,无论如何您都不走运),然后
再次导出dbUnit数据集。

这样,您将获得测试数据的完全自动化更新。然后,您仍然可以在每次测试后进行清理,仅导入测试数据,并保留“清理表”功能。

然后每个测试用例都将像这样工作:


设置:通过dbUnit导入数据集执行:根据导入的测试执行测试数据
拆卸:删除所有数据库内容

当然还有一点缺点,那就是用这种方法准备测试数据会有点慢。 -但是,根据我的经验,只要您通常将各个测试数据集都保持较小且特定,则自动更新不胜过。

如果为每个测试用例导入数据集花费的时间太长,还可以创建测试组(和测试数据),并为每个此类组而不是每个测试用例导入数据集。

评论


这听起来很有趣,但是我不确定我是否理解它如何帮助解决我的问题。数据库更新sql脚本是什么意思?因此,我将数据库的“干净表”状态保存在转储xml中,然后运行更改数据库的测试,然后使用dbunit返回到干净状态?

–迈克尔
2012年8月21日在7:51

我试图在这方面澄清我的答案。

–约阿希姆·霍弗
2012年8月21日在7:59

#2 楼

我个人将编写一个测试数据生成器,生成唯一的测试数据,并通过直接api调用将其推入数据库,作为每个测试设置的一部分。这样,您可以并行运行多个测试,并可以扩大自动化测试的执行范围。

根据我的经验,如果您使用的是SoapUI,则可能应该直接从测试代码中调用应用程序API。

评论


这是我在当前公司和上一家公司所做的。

–user246
2012年8月21日15:52

#3 楼

您采用“干净的表”方法是正确的方法。

最好的是,每个测试都在空数据库上运行,并将其作为自己的固定装置的一部分填充数据库中的数据。但是,如果您发现自己在大量测试中使用了大量相同类型的数据,那么XML导入文件将是最佳选择。

您的测试人员应在每次测试之前清除数据库,然后加载包含数据的xml文件,运行测试,并选择是否成功清除数据库。

您可以为应用程序的每个模块制作不同的测试数据文件以导入。因此,如果您测试auth模块,您将拥有test_auth_data.xml,仅用于从auth模块进行测试。

对于仅特定测试所需的数据,请使用手动导入,但是如果您可以使用与ORM绑定的某个库,那么您就可以使用数据模型。

您提到的有关在开发/生产数据库和测试数据库之间维护相同数据库架构的问题可以通过以下方法解决:数据库迁移。它们可以应用于两个数据库,并且迁移版本在测试之前应该相同。您可以阅读Ruby on Rails迁移指南。

#4 楼

在这种情况下,我们将使用Bruce McLeod公开的方法。

我们使用数据生成器从测试用例定义的相同配置中生成4个数据集:


例如用于填充gui表单的测试输入数据(手动运行或使用qtp运行),
在测试之前在应用程序中用soapui插入的数据创建要应用测试的客户,
将有助于基于插入数据(运行测试的客户的预期状态)诊断结果的控制数据
,最后是用于删除插入数据的清理数据。

在我们的情况下,我们可以批量预加载数据,批量运行测试,批量验证和批量清理。

由于我是GEDIS Studio(http://www.gedis-studio.com)的所有者,因此我们使用了该生成器。但是,这种方法可以用任何形状良好的生成器来实现。

但要回到核心问题:如何在不断变化的世界中维持这样的解决方案?

好吧,我们依靠仅基于应用程序API,我们永远不会直接在数据库中加载或删除数据-风险太大,因为我们没有时间维护数据库及其更改的知识。

我的两分钱建议是依靠应用程序的API