2

我一直在使用sqlite::memory:单元测试:它很快,并且可以自动进行测试清理。但我担心我的测试可能会由于 SQL 服务器的假设而丢失错误。(这个特定的代码应该是 DB 中立的,但实际上它必须与 MySQL 一起工作。)

作为一个具体示例,我认为 sqlite 的日期字符串输入存储为字符串 (*),因此它们以完全相同的格式返回给我。而在 MySQL 中,它们似乎被解析、规范化并以一致的格式返回。我更担心的是我没有意识到存在差异。

处理这个问题的最佳方法是什么?例如,也对 mysql 重复所有单元测试(慢 - 有没有办法制作内存中的 MySQL DB?)。只是针对一些关键领域进行mysql测试?依靠使用 MySQL 的功能测试(这是我目前的方法,但覆盖范围更广)。还有什么我没有想到的?

*:如果我给出“2012-12-25 09:12:34”,我会得到那个确切的字符串。如果我给出“2012-12-25 09:12:34 UTC”,我会返回那个确切的字符串(即这次的时区)。如果我给“2012-12-25 09:12:34 hello world”,我会返回“2012-12-25 09:12:34 hello world”:-(


在这种特殊情况下,我使用的是 PHP、PDO 和 PHPUnit。我追求与语言无关的策略,但值得注意的是,PDO 是一个非常薄的抽象,更多地与抽象连接字符串和低级 API 调用有关。它不会尝试抽象数据库之间的数据类型差异。

4

2 回答 2

2

如果你想测试 MySQL 特定的 SQL 细节,你只需要在 MySQL 上进行测试。

MySQL 有MEMORY存储引擎,但这与其他引擎并不完全兼容。您应该将数据库放在 RAM 磁盘 (tmpfs) 上。

SQLite 没有日期/时间的专用数据类型

于 2013-01-20T11:48:52.007 回答
2

我们通常在我工作的地方做的是将测试拆分为:

  • 单元测试:非常快,使用内存数据库(在我的例子中是H2)。

  • 集成测试:速度较慢,使用“真实”数据库,以及额外的(运行时间较长的)测试

在开发过程中,我们只运行单元测试。自动化构建也运行集成测试(但如果您愿意,您可以自己运行它们)。

于 2013-01-21T12:27:16.867 回答