database -如何测试Web代码?

Translate

有人对状态高度依赖的数据库后端开发编写测试代码有什么好提示吗?

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

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

我很确定这不是一个新问题,因此我将非常有兴趣学习其他人的经验。

有没有好的文章可以讨论这个基于Web的开发问题?

我通常编写PHP代码,但我希望所有这些问题在很大程度上与语言和框架无关。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

您应该研究DBUnit,或尝试查找等效的PHP(那里必须有一个)。您可以使用它来准备具有代表测试数据的一组特定数据的数据库,因此每个测试将不再依赖于数据库和某些现有状态。这样,每个测试都是独立的,不会在进一步使用数据库时中断。

更新:快速的Google搜索显示了数据库单元扩展对于PHPUnit。

来源
Translate

如果您最关心数据层测试,则可能要看一下这本书:xUnit测试模式:重构测试代码。我本人对此一直不确定,但是这本书在帮助列举性能,可重复性等问题方面做得很好。

来源
Translate

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

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

至于测试Web方面,我目前正在研究Selenium(selenium.openqa.org)。这似乎是一个具有跨浏览器功能的测试套件,它将帮助您测试功能。但是,与所有这些网站测试工具一样,没有真正的方法可以测试这些工具的性能在所有浏览器中都不会引起人们的注意!

来源
Translate

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

来源
Translate

我的工作存在完全相同的问题,我发现最好的主意是让一个PHP脚本重新创建数据库,然后再创建一个单独的脚本,在该脚本中向其抛出疯狂的数据以查看是否破坏了它。

我从来没有使用过任何单元测试之类的方法,所以不能说它是否有效。

来源
Translate

如果您可以在运行测试之前以已知数量设置数据库,然后最后将其拆除,那么您将知道正在使用哪些数据。

然后,您可以使用Selenium之类的东西轻松地从您的UI中进行测试(假设此处基于Web,但是那里有很多用于其他UI风格的UI测试工具)并检测是否存在从数据库撤回的某些记录。

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

来源
Translate

你可以试试http://selenium.openqa.org/它更多地用于GUI测试而不是数据层测试应用程序,但是它确实记录了您的操作,然后可以回放这些操作以在不同平台上自动执行测试。

来源
Translate

这是我的策略(我使用JUnit,但是我敢肯定有一种方法可以在PHP中做到这一点):

我有一个方法在特定DAO类的所有单元测试之前运行。它将dev数据库置于已知状态(添加所有测试数据等)。在运行测试时,我会跟踪添加到已知状态的所有数据。每次测试结束时都会清除此数据。在对该类进行所有测试之后,另一个方法将删除开发数据库中的所有测试数据,并将其保持在运行测试之前的状态。要完成所有这些工作需要一些工作,但是我通常在DBTestCommon类中编写方法,所有我的DAO测试类都可以使用这些方法。

来源
Translate

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

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

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

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

来源
Translate

总的来说,我同意Peter的观点,但是对于创建和删除测试数据,我不会直接使用SQL。我更喜欢使用产品中使用的某些CRUD API来创建与生产尽可能相似的数据...

来源