出于单元测试的目的,哪个内存 Java 数据库最接近 MySQL 和 SqlServer?

Posted

技术标签:

【中文标题】出于单元测试的目的,哪个内存 Java 数据库最接近 MySQL 和 SqlServer?【英文标题】:Which in-memory Java database is closest to MySQL & SqlServer for the purpose of unit testing? 【发布时间】:2013-04-01 01:01:48 【问题描述】:

我正在寻找一个内存数据库,用于对我的数据访问层进行单元测试。在生产环境中,我的大部分课程将针对 mysql 5.1 运行,但有些课程将对 Microsoft SQL Server 具有读取权限。

过去,I've had issues with differences dialects between different databases tripping up unit testing(导致在执行前使用 AspectJ 破坏查询!!!)所以我想尽可能避免这种情况。

所以,我想知道 哪个 Java 内存中 数据库在行为上最接近 MySql 和 SQL Server? 我主要关心的是 MySQL,因为我们使用它是最多的,并且 -AFAIK- 它具有最非标准的语法。这是用于单元测试的,因此可扩展性、性能、效率等并不重要。

【问题讨论】:

针对不是用于生产的数据库的单元(或集成)测试是毫无价值的。 "Don't let the perfect be the enemy of the good" - 伏尔泰。这并不理想,但它仍然会出现错误,例如在生成 SQL 等时将 WHERE 放在 FROM 之前。 @ArtB,同意引用,但您的问题是关于 mysql 和内存数据库之间的具体差异,您 在不同数据库之间的方言差异导致单元测试时遇到了问题。这听起来像你需要确保它与 mysql 一起工作,因此,没有其他数据库会这样做...... 好吧,我只是想摆脱这些黑客,或者尽量减少所需的数量。如果有必要,我可以接受。 【参考方案1】:

我实际上在单元测试中使用 MySQL 数据库来确保正确性。使用 JUnit 时,您可以这样做:

@Before
public void initialize() 
    try 
        dataSource.getConnection().close();
        logger.info( "got a connection, so we can assume the configuration is correct..." );
    
    catch ( Exception e ) 
        logger.warn( "skipping tests as no connection is available.  check spring config: ", e.getMessage() );
        e.printStackTrace();
        assumeNoException( e );
    

这在每次测试之前运行,如果它无法连接到数据库,它将跳过测试而不会通过assumeNoException 导致失败。这样,如果您需要在未配置 MySQL 的系统上构建,则可以,但如果您的开发人员正确配置他们的系统,它将使用已安装的 MySQL 实例。我知道这不是您问题的直接答案,但我认为它可能还是有用的......

【讨论】:

但是你的单元测试不是独立的。此外,这意味着您可能无法运行测试,因为它们没有部署适当配置的服务器,并且您的测试将失败。 @ArtB,虽然这个单元测试确实不是完全独立的,但在没有配置的情况下运行是安全的(因为它会构建安全,而不是代码通过测试)。您的第二条评论听起来好像您正在做某种持续集成方案...如果是这种情况,您只需要确保您的构建服务器已配置,这不应该要求太多...跨度> 我们有离岸工人,我们在 Windows 上开发,在 OS X 上构建,并在 Linux 上部署。我们有独立的维护团队。任何不运行测试或让它们默默失败的借口都将导致无用。设置外部数据库现在需要服务器的采购订单,系统管理员必须维护它,而且......如果它不是内部的,它就不会发生。

以上是关于出于单元测试的目的,哪个内存 Java 数据库最接近 MySQL 和 SqlServer?的主要内容,如果未能解决你的问题,请参考以下文章

内存数据库中的 H2:使用 JDBC 设置时区? Java 单元测试

如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?

如何对 Excel VBA 代码进行单元测试

如何在 Spring Security Bean 中模拟自定义 UserService 详细信息以进行单元测试?

如何使用 H2 内存数据库编写单元测试

出于测试目的,如何在 angular2 中模拟已激活的父路由?