2011-07-18 159 views
40

我只是試圖爲訪問MySQL數據庫的服務添加測試用例,並且我想重新創建整個模式(對於某些場景還只是使用每個測試用例所需數據的MySQL轉儲文件)。我四處張望,發現有些人使用SQLite/H2和其他人來做這件事,但是我只是在想辦法在內存中運行MySQL,所以我不需要擔心任何特定於MySQL的事情我可能會在我們的服務中使用方言。有沒有辦法爲JUnit測試用例運行MySQL內存?

回答

0

嘗試http://hsqldb.org/,我沒有經驗,但聽到好東西。

編輯 對不起 - 好像你需要刪除任何MySQL的特定語法...

3

這其中的原因,使用專用SQL擴展通常不是一個好主意之一。

我會做的是嘗試識別您使用非標準SQL的地方,並重構代碼以將這些零件移至專用服務。然後你可以在運行單元測試時嘲笑這些。

+2

仍然有些情況可能會出現問題(例如,某些字詞是一個DBMS中的關鍵字,而不是其他字詞),並且使用不同的DBMS進行測試可能不會吸引他們。 –

+0

@Nicolae顯然,是的。您需要針對這些方法進行專門的集成測試 –

1

您可以對JUnit測試使用不同的模式。如果您使用的是Spring,那麼JUnit擴展允許每個測試運行在只讀事務中,因此在測試之後數據庫中不會有數據持久性。如果您需要測試的初始數據,則將所需數據放入參與交易的已標記方法中。

1

您可以安裝ramdrive(使用ImDisk),在其上覆制數據文件,並在更改my.cnf中的相應配置後啓動Mysql服務。單元測試數據庫通常很小(並且您應該將它們保持較小測試),他們通常可以裝入一個ramdrive。

您也可以考慮在您的彈簧測試中使用事務,而不是在每次測試時重建表。

我們用它來開發團隊,它像一個魅力一樣工作,我們在速度上獲得了一個數量級。

20

我們使用MySQL和flyway來處理遷移。

對於單元測試和簡單集成測試,我們在內存數據庫中使用H2和MODE = MySQL參數。 Mode = MySQL使H2數據庫可以處理大部分MySQL方言。

我們在Spring配置測試數據源設置是這樣的:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > 
     <property name="driverClassName" value="org.h2.Driver"/> 
     <property name="url" value="jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" /> 
    </bean> 

(如果你不知道春天 - 將XML轉換成調用新的BasicDataSource,然後調用setDriverClassName和setUrl上創建的實例)

然後我們使用的飛行路線上的數據源創建模式和我們一樣對會定期MySQL數據庫讀取:

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="cleanOnValidationError" value="false" /> 
     <property name="initOnMigrate" value="true" /> 
     <property name="sqlMigrationSuffix" value=".ddl" /> 
    </bean> 

你也可以在jdbcTemplate中使用dataSource bean,並使用<jdbc:initialize-database...>標記以某種方式運行一些SQL腳本或運行多個MySQL腳本。

+5

不幸的是,H2不支持很多語句,如'UNIQUE KEY','CREATE EVENT'和'INSERT IGNORE'。 – John29

+3

但它不是Mysql,而且你仍然容易出現不兼容問題 –

+1

H2也不支持中頻功能:( 引起:org.h2.jdbc.JdbcSQLException:未找到函數「IF」; SQL語句: select if (len <4,'default',val)as val from(選擇val,length(val)as len from config where scope ='test'and keyname ='defaultName')temp [90022-191] – Kunal

22

使用與MySQL完全兼容並且可以在JUnit測試用例中使用的內存數據庫的最簡單方法是使用MariaDB4j。 你只需要一個搖籃(/ Maven的)的依賴性(http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mariaDB4j%22)和幾行代碼開始:

DB database = DB.newEmbeddedDB(3306); 
database.start(); 
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", ""); 

一個startupt腳本可以通過GitHub上的自述

database.source("path/to/resource.sql"); 

更多信息,包括: https://github.com/vorburger/MariaDB4j

相關問題