TestContainers:現代資料庫的測試方法 -Gundu

banq發表於2020-07-21

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的好處相比,這些缺點很小。
 

相關文章