在Internet上进行了大量阅读之后,我发现使用内存数据库(如H2)来对DAO层进行单元测试似乎是一个好习惯。背后的想法是避免使用生产数据库。
很好,所以我建立了一个H2数据库并激活了H2 PostgreSQL兼容模式,因为我的生产数据库在Postgres上。我现在面临的问题:在H2上运行原始SQL查询以构建测试数据库时,H2不接受此查询为有效查询:
ALTER SEQUENCE MYERP.ecriture_comptable_id_seq OWNED BY MYERP.ecriture_comptable.id;
我想使用PostgreSQL兼容模式不能保证H2会接受所有特定于Postgres的语法。而且,其他数据库(例如MySQL)也可能会发生这种情况。
那么在这种情况下使用h2数据库有什么意义呢? 我错过了什么吗?
答案 0 :(得分:0)
单元测试应重点测试单元。 PostgreSQL在您的应用程序外部,因此不属于使用它的任何DAO的一部分:不应编写使用任何此类外部数据库的“单元测试”。
使用数据库进行集成测试可能很好,但是正如您已经注意到的那样,当您使用其他数据库执行集成测试时可能会出现多个问题(我知道很少有仅使用ANSI-SQL而没有任何触发器或其他供应商的应用程序特定的SQL扩展名,例如PostgreSQL中的UPSERT
或您帖子中的SQL)。
那么如果您的生产基地也在内存中怎么办?这非常困难,我认为集成测试会很好,只是不要将其称为单元测试。所有这些都凸显了在数据库中进行业务逻辑的痛点(例如,通过现在无法测试的触发器)或使用特定于供应商的sql的痛点,这些优势在更改基础数据库供应商时无法发挥很好的作用。