|
|
1
3
这是一个老问题,但我想我要补充一些我们在这方面的具体经验。 其他海报在技术上是正确的,这是集成测试的一种形式,但从我所处的位置来看,MySQL中经常有太多的逻辑在单元测试中被排除。如果您和我们一样,拥有大量复杂的服务,这些服务在很大程度上依赖于MySQL(通常每个服务有几个表),那么拥有一个包含测试查询逻辑的健壮测试框架就非常方便。我们在单元测试中模拟了大量依赖项,但MySQL没有。 我们有一组类包装simpletest以提供此功能。它的工作原理如下:
另一个工具是bash脚本,它使创建
这对我们来说非常有效,尽管我们最终不得不自己做很多。 |
|
|
2
1
我有一个专用于单元测试的本地数据库,它有一个已知的名称和数据库用户名/密码。单元测试是硬编码到那个位置的,但是不同的开发人员可以根据需要重写这些变量。
每次考试前
注:Do 不 测试后截断!这样,如果测试失败,就会得到数据库的当前状态,这通常有助于诊断问题。 |
|
|
3
1
您可能希望允许PHP创建并向临时表/数据库提供数据,并在该表/数据库上进行测试。那么您就不必手动重置数据库了。大多数框架都有数据库操作库来简化操作。在前端可能需要一些时间,但在稍后进行更改时,测试速度会快得多。 |
|
4
0
对数据库的测试通常指示错误的测试,这可能是由于在测试代码中缺少封装。您应该尽可能地将与数据库交互的代码与其余代码隔离开来,使这个交互层非常简单,这样您就可以通过一些非常基本的测试。 换句话说,处理注释的代码不应该与处理数据库交互的代码相同。例如,您可以编写一个通用表模块,您的注释模型使用它来访问数据库。您仍然需要测试表模块,但这应该与注释代码隔离。 |
|
|
5
0
在测试数据库代码时,最好始终以相同的数据库作为起点。尤其是当你做单元测试时(我想就是这样)。其中一种方法是按照Jason的建议截断所有表,但我更喜欢在其中包含一些起始数据。你知道,你总是需要在每个数据库中都有一些“默认”数据。 另外,有些测试只有在完整的数据库中才有意义。所以,为这些测试创建一个特殊的数据库实例。在运行一些测试之前,我插入了大约3或4个不同的数据库(只是复制文件)。每次都有相同的起点可以确保重复性。 所以,只需准备几个好的“起点”数据库状态并备份它们。在运行每组测试之前,还原适当的数据库,然后运行它。 |
|
|
6
0
我鼓励你 不 尝试使用SimpleTest测试数据库访问代码。 相反,使用Selenium为应用程序创建一个功能测试:从数据库的已知状态开始时记录一个测试用例;然后添加一个注释并检查(使用Selenium的断言)内容是否确实存在。 就这样: -易于设置和维护 -不仅要验证数据库层,还要验证表示层 也就是说,如果在数据库中有存储过程, 做 使用SimpleTest-我自己做的很成功。基本上,创建从已知DB状态开始的SimpleTests,然后执行一些插入/更新,然后运行存储过程,并确保DB的状态符合您的预期。 |
|
7
0
如果您真的想对数据库进行测试,我建议在每次测试之前导入数据/创建表。这样,数据库从每个测试的已知状态开始。由于这是相当昂贵的性能,您可以在
我仍然认为,如果你需要这些,你应该考虑一下你的测试是否有可能告诉你一些事情。。 |
|
8
0
我认为您应该使用ORM,并为此编写一些集成测试。如果集成测试显示它在实际环境中工作得很好,那么只有在更改环境(数据库、php版本、平台等)时,才需要再次测试它。之后,您可以模拟ORM对象,而不需要连接到数据库。 所以我认为这是最好的方法,但是如果您不想使用ORM,那么您可以创建一个测试数据库并模拟database connection(PDO)对象。在这种情况下,可以在测试用例的setUp和tearDown部分创建和删除测试表。重要的是,这些是集成测试,而不是单元测试,因此您不需要总是运行它们,只有在PHP和SQL服务器之间发生变化时才需要运行它们。使用集成测试测试数据访问对象之后,必须在单元测试中模拟它们。 |