如何测试网页代码?

时间:2020-03-05 18:37:53  来源:igfitidea点击:

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

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

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

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

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

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

解决方案

回答

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

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

回答

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

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

回答

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

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

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

回答

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

回答

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

回答

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

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

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

回答

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

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

回答

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

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

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

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

回答

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

回答

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