如何测试网页代码?

有没有人对编写数据库后端开发的测试代码有很好的提示,因为这些代码严重依赖于状态?

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

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

我很肯定这不是一个新问题,所以我会非常有兴趣向他人学习经验。

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

我通常编写PHP代码,但我希望所有这些问题主要是语言和框架不可知的。

0
额外 编辑
意见: 1

10 答案

你可以尝试 http://selenium.openqa.org/ ,它更多的是GUI测试而不是数据但是会记录您的操作,然后可以在不同平台上自动执行测试。

0
额外

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

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

0
额外
非常有趣,我一定会开始研究这个。由于这个原因,我没有真正写出单元测试,这是一个不好的做法,我需要消除。
额外 作者 kaybenleroll,

我和我的工作有完全相同的问题,我发现最好的想法是有一个PHP脚本来重新创建数据库,然后是一个单独的脚本,在这里我将疯狂的数据放在它上面,看看它是否会打破它。

我从未使用任何单元测试或类似的东西,所以不能说它是否工作或不抱歉。

0
额外

如果您主要关心数据层测试,那么您可能需要查看本书: xUnit测试模式:重构测试代码。我自己总是不确定,但本书在帮助列举诸如性能,可重复性等问题方面做得很好。

0
额外

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

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

至于测试网络方面的东西,我目前正在研究Selenium(selenium.openqa.org)。这似乎是一个跨浏览器的测试套件,它可以帮助您测试功能。但是,与所有这些网站测试工具一样,没有真正的方法来测试这些东西在所有浏览器中的效果如何,而不会对他们造成肉眼的影响!

0
额外

如果您可以在运行测试之前以已知数量设置数据库并在最后拆卸数据库,那么您将知道正在处理哪些数据。

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

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

0
额外

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

0
额外

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

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

0
额外

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

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

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

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

0
额外

我们使用内存数据库(hsql: http://hsqldb.org/ )。 Hibernate( http://www.hibernate.org/ )可以让我们轻松地指出我们的单元测试在测试数据库中,还有额外的好处,他们的运行速度与雷电一样快。

0
额外