建议在使用内存中的sqlite DB来加速单元测试时避免使用DB deps

时间:2013-01-20 10:31:37

标签: sqlite unit-testing pdo phpunit database-testing

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

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

处理此问题的最佳方法是什么?例如。重复mysql的所有单元测试(慢 - 有没有办法制作内存中的MySQL数据库?)。只关注一些关键领域的mysql测试?依靠使用MySQL的功能测试(这是我目前的方法,但覆盖范围很大)。还有别的我没想过的东西?

*:如果我给“2012-12-25 09:12:34”,我会收到那个确切的字符串。如果我给“2012-12-25 09:12:34 UTC”,我会回到那个确切的字符串(即这次带有时区)。如果我给“2012-12-25 09:12:34你好世界”,我会回来“2012-12-25 09:12:34你好世界”: - (


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

2 个答案:

答案 0 :(得分:1)

如果您想测试MySQL特定的SQL详细信息,您只需要在MySQL上进行测试。

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

SQLite没有专用的data types for dates/times

答案 1 :(得分:1)

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

  • 单元测试:非常快,使用内存数据库(在我的情况下为H2)。

  • 集成测试:更慢,使用'真实'数据库,再加上额外的(更长时间运行)测试

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