我很确定这不是"/>

关于数据库:如何测试Web代码?

关于数据库:如何测试Web代码?

How to Test Web Code?

对于在高度依赖状态的数据库后端开发中,有没有人提供一些编写测试代码的好提示?

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

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

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

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

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


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

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


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


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


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

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

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


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


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

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

  • 插入几行(使用SQL)以初始化状态
  • 运行您要测试的功能
  • 将预期结果与实际结果进行比较。在这里,您可以使用常规的单元测试框架
  • 清理已更改的行(因此下一次运行将看不到上一次运行)
  • 可以使用DELETE * FROM table以标准方式(当然,仅在测试数据库中)进行清理。


    这是我的策略(我使用JUnit,但是我敢肯定有一种方法可以在PHP中进行等效操作):

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


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


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

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

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


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

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


    推荐阅读