是否有人为编写数据库后端开发的测试代码有一些好的提示,其中对状态有很大的依赖性?

具体来说,我想为从数据库中检索记录的代码编写测试,但答案将取决于数据库中的数据(可能随时间而变化)。

人们通常使用“冻结”数据库创建一个单独的开发系统,以便任何给定的函数应该始终返回完全相同的结果集吗?

我很确定这不是一个新问题,所以我很想从其他人的经验中学习。

那里有好文章讨论这个基于网络的开发问题吗?

我经常编写PHP代码,但我希望所有这些问题主要与语言和框架无关。

===============>>#1 票数:6 已采纳

您应该查看DBUnit,或尝试找到PHP等价物(必须有一个)。 您可以使用它来使用表示测试数据的特定数据集来准备数据库,因此每个测试将不再依赖于数据库和某些现有状态。 这样,每个测试都是自包含的,并且在进一步的数据库使用期间不会中断。

更新:快速谷歌搜索显示PHPUnit的数据库单元扩展

===============>>#2 票数:3

如果您最关心数据层测试,可能需要查看本书: xUnit测试模式:重构测试代码 我自己总是不确定,但这本书帮助列举了诸如性能,再现性等问题。

===============>>#3 票数:2

我想这取决于您使用的数据库,但Red Gate(www.red-gate.com)制作了一个名为SQL Data Generator的工具。 这可以配置为使用合理的测试数据填充您的数据库。 您还可以告诉它始终在其随机数生成器中使用相同的种子,因此每次“随机”数据都是相同的。

然后,您可以编写单元测试以使用这种可靠,可重复的数据。

至于测试网络方面的东西,我现在正在研究Selenium(selenium.openqa.org)。 这似乎是一个支持跨浏览器的测试套件,可以帮助您测试功能。 然而,正如所有这些网站测试工具一样,没有真正的方法可以测试这些东西在所有浏览器中的外观 ,而不会过分关注它们!

===============>>#4 票数:2

我们使用内存数据库(hsql: http//hsqldb.org/ )。 Hibernate( http://www.hibernate.org/ )使我们可以轻松地将我们的单元测试指向测试数据库,并获得额外的好处,即它们像闪电一样快速运行。

===============>>#5 票数:1

我建议使用三个数据库。 一个生产数据库,一个开发数据库(每个开发人员填充一些有意义的数据)和一个测试数据库(带有空表,可能还有几行总是需要)。

测试数据库代码的方法是:

  1. 插入几行(使用SQL)来初始化状态
  2. 运行要测试的功能
  3. 比较预期与实际结果。 在这里,您可以使用正常的单元测试框架
  4. 清理已更改的行(因此下一次运行将看不到上一次运行)

可以使用DELETE * FROM table以标准方式(当然,仅在测试数据库中)完成清理。

===============>>#6 票数:1

我对我的工作有完全相同的问题,我发现最好的想法是有一个PHP脚本来重新创建数据库,然后是一个单独的脚本,我在其中抛出疯狂的数据,看它是否破坏了它。

我没有使用任何单元测试或类似的,所以不能说它是否有效。

===============>>#7 票数:1

如果您可以在运行测试之前设置具有已知数量的数据库并在结束时拆除,那么您将知道您正在使用哪些数据。

然后你可以使用像Selenium这样的东西轻松地从你的UI进行测试(假设这里有基于web的,但是有很多用于其他UI风格的UI测试工具)并检测从数据库中拉回的某些记录的存在。

绝对值得设置数据库的测试版本 - 或者让测试脚本使用已知数据填充数据库作为测试的一部分。

===============>>#8 票数:1

您可以尝试http://selenium.openqa.org/它更多用于GUI测试而不是数据层测试应用程序,但会记录您的操作,然后可以回放以自动化跨不同平台的测试。

===============>>#9 票数:1

一般来说,我同意Peter,但是为了创建和删除测试数据,我不会直接使用SQL。 我更喜欢使用产品中使用的一些CRUD API来创建尽可能类似于生产的数据......

===============>>#10 票数:1

这是我的策略(我使用JUnit,但我确信有一种方法可以在PHP中执行相同的操作):

我有一个方法在特定DAO类的所有单元测试之前运行。 它将dev数据库置于已知状态(添加所有测试数据等)。 当我运行测试时,我会跟踪添加到已知状态的任何数据。 在每次测试结束时清理这些数据。 在运行了所有类的测试之后,另一个方法会删除dev数据库中的所有测试数据,使其处于运行测试之前的状态。 完成所有这些工作有点工作,但我通常在DBTestCommon类中编写这些方法,我的所有DAO测试类都可以在这个类中找到它们。

  ask by kaybenleroll translate from so

未解决问题?本站智能推荐: