我最近被要求有效地推销我的部门进行单元测试。我无法告诉你这让我有多兴奋,但我确实有一个担忧。我们将 JUnit 与 Spring 和 Maven 一起使用,这意味着每次 mvn test
被调用,它重建数据库。显然,我们不能将它与我们的生产服务器集成——它会杀死有值(value)的数据。
如何在不告诉 maven 跳过测试的情况下阻止重建?
我能想到的最好的办法是分配脚本在测试数据库中运行(添加换行符以提高可读性):
mvn test
-Ddbunit.schema=<database>test
-Djdbc.url=jdbc:mysql://localhost/<database>test?
createDatabaseIfNotExist=true&
useUnicode=true&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/