【问题标题】:dbunit how to sync real database with test databasedbunit如何将真实数据库与测试数据库同步
【发布时间】:2016-05-15 13:02:43
【问题描述】:

我有一个指向 mysql 数据库的应用程序。

我一直在尝试使用 DBUnit 来设置我的测试环境,效果很好。

问题是在配置 DBUnit 时,我将它指向了相同的 mysql 数据库。因此,当执行 DBUnit 时,它会采用指定的 dataset.xml 并覆盖我原始数据库中的信息。这是有道理的,因为我指向的地方。

问题是,我是否应该只为测试创建一个新数据库,以便我的 DBUnit 可以指向它?如果是这样,我将如何管理我的原始数据库和用于测试的数据库之间的结构同步?

提前致谢。

【问题讨论】:

    标签: dbunit


    【解决方案1】:

    我是否应该只为测试创建一个新数据库,以便我的 DBUnit 可以指向它?

    这是一种更好的方法,因为它消除了多个问题。

    我将如何管理我的原始数据库和用于测试的数据库之间的结构同步?

    您没有在持久性堆栈中提及技术,例如 Hibernate、Spring/Spring Boot/Spring Data/Flyway/LiquiBase/等。建议更多如何实施这一点。通常,在测试运行启动时在模式中运行 DDL(来自 Flyway 等托管 DDL 或来自 Hibernate 的自动生成)。

    此外,我首选的典型测试方法是:

    1. 内存/嵌入式数据库(例如 Apache Derby)在启动测试前自动启动。
    2. 使用带注释的实体的 Hibernate DDL gen 在架构中创建表。
    3. 任何表中都没有现有行;将任何文件存储在构建输出目录的子目录中时,嵌入式数据库和干净构建会自动发生。
    4. dbUnit 配置了 DatabaseOperation.CLEAN_INSERT [0]。
    5. 每个测试的最少 dbUnit 数据。

    【讨论】:

    • 很好的答案,谢谢!是的,我正在使用 hibernate-entitymanager,假设我正在使用 liquibase 来管理 mysql 数据库。所以我想到的问题是.. 使用 Hibernate DDL gen 为内存数据库创建模式及其表是否“安全”?还是我应该找到对两个数据库使用相同的 liquibase 的方法?
    • 如果团队正确管理实体,那么使用 Hibernate DDL gen 可能非常“安全”。但是,如果实体没有所有需要的注释,那么最好的选择是 LiquiBase 配置。由于团队已经努力编写 LiquiBase 文件,并且 LiquiBase 具有“主定义”(并用于生产),因此我将使用它而不是 Hibernate DDL gen。这样,测试使用与 dev/test/prod 环境相同的配置。这是非常有用和重要的。
    • 杰夫,我还有一个疑问。我的 DAO 正在使用我的 persistence.xml(到 mysql)中指定的连接......而我的 dbunit 正在使用我在 PropertiesBasedJdbcDatabaseTester(到 hsql)中指定的连接......所以当我运行测试时,DAO 's 不指向我的内存数据库.. 你能帮我解决这个问题吗?
    • 就在我看到这个评论之前,我看到了你关于这个的另一个问题,并且得到了很好的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2016-08-05
    • 1970-01-01
    • 2019-01-30
    • 2021-09-16
    • 2016-09-04
    相关资源
    最近更新 更多