如何测试Web代码?

时间:2008-08-05 21:58:52

标签: database testing

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

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

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

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

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

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

10 个答案:

答案 0 :(得分:5)

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

更新:快速谷歌搜索显示PHPUnit为DB unit extension

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

这是我的策略(我使用JUnit,但我确信有一种方法可以在PHP中使用等效的方法):

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

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

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