java - 有没有办法阻止 Maven Test 重建数据库?

标签 java maven-2 junit dbunit

我最近被要求有效地推销我的部门进行单元测试。我无法告诉你这让我有多兴奋,但我确实有一个担忧。我们将 JUnit 与 Spring 和 Maven 一起使用,这意味着每次 mvn test被调用,它重建数据库。显然,我们不能将它与我们的生产服务器集成——它会杀死有值(value)的数据。

如何在不告诉 maven 跳过测试的情况下阻止重建?

我能想到的最好的办法是分配脚本在测试数据库中运行(添加换行符以提高可读性):

mvn test 
   -Ddbunit.schema=<database>test 
   -Djdbc.url=jdbc:mysql://localhost/<database>test?
        createDatabaseIfNotExist=true&amp;
        useUnicode=true&amp;characterEncoding=utf-8 

我忍不住认为一定有更好的方法。

我特别想知道是否有一种简单的方法可以告诉 Maven 仅在特定类上运行测试而不构建其他任何东西? mvn -Dtest=<test-name> test仍然重建数据库。

=======更新=======

我脸上有点蛋疼。我没有意识到我在两个地方使用了相同的变量,这意味着 POM 正在使用“skip.test”变量来重建数据库和运行测试...

最佳答案

更新:我猜想 DBUnit 会重建数据库,因为它在测试设置方法中被告知这样做。如果更改设置方法,则可以消除数据库重建。当然,您应该这样做,以便在需要时重置数据库,在不需要时忽略它。我的第一个赌注是使用系统属性来控制它。您可以像使用 jdbc.url 等一样在命令行上设置属性。然后在设置方法中添加一个 if 来测试该属性,如果已设置则重置数据库。

测试数据库,如果可以的话,与生产数据库完全分离绝对是最好的选择。您甚至可以使用例如Derby ,一个可以嵌入到 JVM 中运行的内存数据库。但如果您绝对不能拥有单独的数据库,请在该数据库中至少使用一个单独的测试模式。

在这种情况下,我建议您将数据库连接参数放入 pom 中的配置文件中,默认情况下是测试数据库,以及一个单独的配置文件来包含生产设置。这样就永远不会发生您不小心针对生产数据库运行测试的情况。

但是,一般来说,了解针对数据库运行的测试在严格意义上并不是真正的单元测试,而是集成测试也很重要。如果您已有一组此类测试,那很好,请尽可能多地使用它们。但是,您应该尝试添加更多真正的单元测试,这些单元测试一次只测试一小部分独立的代码(最多一个方法或类),理想情况下是自包含的(不需要数据库、网络、配置文件等)。 ) 这样他们才能跑得快——这是非常重要的一点。如果您有 5000 个单元测试并且每个测试只需要 5 秒即可运行,那么总共将近 7 个小时,因此您显然不会经常运行它们。如果测试仅需 5 毫秒,您将在不到半分钟内获得结果,因此您可以在提交最新更改之前运行所有测试 - 一天多次。这会对您从测试中获得反馈的速度产生巨大影响。

希望这对您有所帮助。

关于java - 有没有办法阻止 Maven Test 重建数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292142/

相关文章:

java - 无法从基于周的字符串的 TemporalAccessor 获取 LocalDate

java - 如何更改 Maven 2/Cobertura 工具目标的默认输出?

java - 使用 JUnit 测试 Java Applet

web-services - WSIT、Maven 和 wsimport——它们可以一起工作吗?

java - 使用参数化测试的多个实例创建 JUnit 测试套件

java - 定义 Spring 组件时出错

java - Oracle 数据类型 raw 的等效 java 类型是什么?

java - Gen-Class 不生成 .class 文件

java - 从远程计算机(我的计算机)运行位于 Raspberry PI 上的 jar 文件

java - maven sql 插件配置以显示执行时的查询