【问题标题】:Silverstripe Unit Tests modify live database (postgres module)Silverstripe 单元测试修改实时数据库(postgres 模块)
【发布时间】:2017-02-10 01:28:33
【问题描述】:

我有一个 3.1.12 版的网站,使用的是 0.92 版的 postgres 模块。

我刚刚将所有内容分别升级到 3.5.3 和 1.2。一切都很好,除了我现有和未更改的单元测试中的一些奇怪行为。当测试以编程方式创建对象时似乎会发生,如下所示:

$page=new Page();
$page->Title='Read only success';
$page->write();

在 3.1 和 0.92 上,测试将运行,然后返回成功。在 tmp 数据库中完成上述工作。

升级后相同的测试,不做任何修改,运行并返回成功。只有这一次,工作是在当前的实时数据库中完成的。在上述情况下,我的管理站点树中有一个新的草稿页面。

有人见过这个吗?我已经竭尽全力寻找答案和追踪究竟是什么导致了这种非常危险的行为。

【问题讨论】:

  • 除非您测试特定的 Postgres 功能,否则我建议在内存 sqlite 中使用以加快测试速度,请参阅 silverstrip.es/blog/how-to-speed-up-unit-tests-using-sqlite
  • 感谢您的链接。看起来很有趣!
  • 我实际上不同意使用备用 RDBMS。如果您有一个 Postgres 支持的应用程序,并且您的应用程序依赖于存在的数据库(SilverStripe 确实如此),那么根据正在运行的测试的性质(集成/行为/单元),您应该测试一个 postgres 支持的应用程序,不是 SQLite 支持的应用程序。

标签: php silverstripe


【解决方案1】:

如果您不使用夹具文件进行测试,则需要确保告诉 SapphireTest 使用测试数据库:

protected $usesDatabase = true;

否则创建这样的 DataObjects 将直接写入您的主数据库。

如果您使用的是夹具文件,无论如何这都是隐含的,因此只有在您不使用时才需要。

Here's the doc block, for reference.

【讨论】:

  • 谢谢!那行得通。尽管我发现单元测试可能对主数据库进行任何更改是非常危险的。外行的开发人员可以轻松编写测试,却不知道使用此标志或夹具可能会导致实时更改。这在 3.1 中是原子性的。我想知道这种变化的意图是什么。
  • 我完全同意你的观点,并认为默认值应该是“true”,除非以其他方式禁用而不是当前行为。非常欢迎您在建议的框架上创建一个 RFC!
  • 会的。我认为这实际上意味着 postgres 模块测试当前已损坏。因为它在没有此选项的情况下以编程方式创建页面。 github.com/silverstripe/silverstripe-postgresql/blob/master/…。此测试有效地将页面添加到当前站点树。
  • @Aaryn 是的,是的 :) 拉取请求将是理想的
  • 我猜这些设置是为了“加速”测试(生成固定装置需要很长时间),而开发人员不打算在实时环境中运行测试。这就是开发/测试环境的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多