TestContainers是一个开源项目,它提供可以在Docker容器中运行的任何东西的轻量级,一次性的实例。它具有Java,Python,Rust,Go,Scala和许多其他语言的绑定。
启动MySQL数据库测试就像添加3行代码一样简单:
class SimpleMySQLTest { private MySQLContainer mysql = new MySQLContainer();
@Before void before() { mysql.start(); // You can use mysql.getJdbcUrl(), mysql.getUsername() and // mysql.getPassword() to connect to the container
}
@After void after() { mysql.stop(); }
// [...] }
|
TestContainers提供@ Rule / @ClassRule集成,以允许JUnit 4控制容器的生命周期。它还提供了一个@Container标注为Junit5。这些实用程序将其简化为仅一行代码。
HibernateORM是与Java中的数据库进行交互的最受欢迎的选择。要将您的Hibernate类连接到TestContainers,就这么简单:
class SimpleHibernateTest { @Rule private MySQLContainer mysql = new MySQLContainer().withDatabaseName("local").withUsername("USER").withPassword("PWD");
@Before public void before() { final Configuration configuration = new Configuration(); // Base configuration configuration.configure("hibernate.cfg.xml") final Properties properties = new Properties(); properties.setProperty("hibernate.hikari.dataSource.url", mysql.getJdbcUrl()); properties.setProperty("hibernate.hikari.datasource.user", "USER"); properties.setProperty("hibernate.hikari.datasource.password", "PWD"); configuration.addProperties(properties); configuration.addAnnotatedClass(ClassToTest.class); }
@Test public void test() { // write test case here } }
|
局限性:
当然,使用TestContainers有缺点。与H2相比,测试用例要慢得多。有减轻这种情况的方法。该@rule注释带来了为让班上所有的测试用例一个新的数据库。建立数据库是一项昂贵的操作,我们可以使用@ClassRule对其进行优化。使用@ClassRule时,将为该类中的所有测试建立一个数据库。在这种情况下,确保在运行测试用例后清理数据库中的数据非常重要,以确保测试隔离。这可以通过使用@After生命周期来完成。
另一个缺点是,如果无法下载docker映像,则测试用例可能会失败。但是,与使用TestContainers的好处相比,这些缺点很小。