使用 H2 数据库对 DAO 层进行单元测试
Unit testing DAO layer with H2 database
在互联网上大量阅读后,我发现使用像 H2 这样的内存数据库对 DAO 层进行单元测试似乎是一个很好的做法。背后的想法是避免使用生产数据库。
很好,所以我设置了一个 H2 数据库并激活了 H2 PostgreSQL 兼容模式,因为我的生产数据库在 Postgres 上。我现在面临的问题:当我在 H2 上 运行 原始 SQL 查询以构建测试数据库时,H2 不接受此查询为有效:
ALTER SEQUENCE MYERP.ecriture_comptable_id_seq OWNED BY MYERP.ecriture_comptable.id;
我猜想使用 PostgreSQL 兼容模式并不能保证所有 Postgres 特定语法都会被 H2 接受。并且可能这也会发生在其他数据库中,例如 MySQL。
那么在这种情况下使用 h2 数据库有什么意义呢?
我错过了什么吗?
单元测试应该专注于测试一个单元。 PostgreSQL 在您的应用程序外部,因此不属于任何使用它的 DAO:不应该编写使用任何此类外部数据库的 'unit test'。
使用数据库进行集成测试可能没问题,但正如您已经注意到的那样,当您使用不同的数据库执行集成测试时可能会出现多个问题(我知道很少有应用程序只使用 ANSI-SQL 而没有任何触发器或其他特定于供应商的 SQL 扩展,例如 PostgreSQL 中的 UPSERT
或 post 中的 SQL。
那如果你的生产基地也是in-memory呢?这非常困难,我认为集成测试会很好,只是不要称之为单元测试。所有这些都突出了在数据库中执行业务逻辑(例如,通过您现在无法测试的触发器)或使用特定于供应商的 sql 的痛点,这有几个优点,但在更改底层数据库供应商。
在互联网上大量阅读后,我发现使用像 H2 这样的内存数据库对 DAO 层进行单元测试似乎是一个很好的做法。背后的想法是避免使用生产数据库。
很好,所以我设置了一个 H2 数据库并激活了 H2 PostgreSQL 兼容模式,因为我的生产数据库在 Postgres 上。我现在面临的问题:当我在 H2 上 运行 原始 SQL 查询以构建测试数据库时,H2 不接受此查询为有效:
ALTER SEQUENCE MYERP.ecriture_comptable_id_seq OWNED BY MYERP.ecriture_comptable.id;
我猜想使用 PostgreSQL 兼容模式并不能保证所有 Postgres 特定语法都会被 H2 接受。并且可能这也会发生在其他数据库中,例如 MySQL。
那么在这种情况下使用 h2 数据库有什么意义呢? 我错过了什么吗?
单元测试应该专注于测试一个单元。 PostgreSQL 在您的应用程序外部,因此不属于任何使用它的 DAO:不应该编写使用任何此类外部数据库的 'unit test'。
使用数据库进行集成测试可能没问题,但正如您已经注意到的那样,当您使用不同的数据库执行集成测试时可能会出现多个问题(我知道很少有应用程序只使用 ANSI-SQL 而没有任何触发器或其他特定于供应商的 SQL 扩展,例如 PostgreSQL 中的 UPSERT
或 post 中的 SQL。
那如果你的生产基地也是in-memory呢?这非常困难,我认为集成测试会很好,只是不要称之为单元测试。所有这些都突出了在数据库中执行业务逻辑(例如,通过您现在无法测试的触发器)或使用特定于供应商的 sql 的痛点,这有几个优点,但在更改底层数据库供应商。