我只是試圖爲訪問MySQL數據庫的服務添加測試用例,並且我想重新創建整個模式(對於某些場景還只是使用每個測試用例所需數據的MySQL轉儲文件)。我四處張望,發現有些人使用SQLite/H2和其他人來做這件事,但是我只是在想辦法在內存中運行MySQL,所以我不需要擔心任何特定於MySQL的事情我可能會在我們的服務中使用方言。有沒有辦法爲JUnit測試用例運行MySQL內存?
回答
嘗試http://hsqldb.org/,我沒有經驗,但聽到好東西。
編輯 對不起 - 好像你會需要刪除任何MySQL的特定語法...
這其中的原因,使用專用SQL擴展通常不是一個好主意之一。
我會做的是嘗試識別您使用非標準SQL的地方,並重構代碼以將這些零件移至專用服務。然後你可以在運行單元測試時嘲笑這些。
您可以對JUnit測試使用不同的模式。如果您使用的是Spring,那麼JUnit擴展允許每個測試運行在只讀事務中,因此在測試之後數據庫中不會有數據持久性。如果您需要測試的初始數據,則將所需數據放入參與交易的已標記方法中。
您可以安裝ramdrive(使用ImDisk),在其上覆制數據文件,並在更改my.cnf中的相應配置後啓動Mysql服務。單元測試數據庫通常很小(並且您應該將它們保持較小測試),他們通常可以裝入一個ramdrive。
您也可以考慮在您的彈簧測試中使用事務,而不是在每次測試時重建表。
我們用它來開發團隊,它像一個魅力一樣工作,我們在速度上獲得了一個數量級。
我們使用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腳本。
不幸的是,H2不支持很多語句,如'UNIQUE KEY','CREATE EVENT'和'INSERT IGNORE'。 – John29
但它不是Mysql,而且你仍然容易出現不兼容問題 –
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
使用與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");
- 1. 有沒有辦法在TeamCity中訂購JUnit測試用例?
- 2. JUnit測試沒有可運行方法例外
- 3. 有沒有辦法同時運行C++單元測試測試?
- 4. 有沒有辦法爲Google OAuth2編寫GAE JUnit測試
- 5. 沒有可運行的方法,同時運行測試用例運行JUnit的插件測試
- 6. 有沒有辦法用iOS中的iPodMusicPlayer測試內存泄漏?
- 7. 有沒有辦法有條件地忽略Spring的JUnit測試?
- 8. 有沒有辦法用Selenium Webdriver運行Jasmine 2測試?
- 9. 有沒有辦法使用Gallio運行MS測試?
- 10. 有沒有辦法運行兩個調試器實例?
- 11. Junit測試沒有通過gradle任務運行'測試'
- 12. 用UiAutomator測試Snackbar,有沒有辦法?
- 13. 有沒有辦法'測試運行'螞蟻構建?
- 14. 有沒有辦法在失敗時重新運行測試類
- 15. 有沒有辦法取消在Selenium Grid中運行測試?
- 16. 有沒有辦法同時運行Bamboo測試?
- 17. 有沒有辦法在遠程主機上運行Selenium測試?
- 18. 有什麼辦法可以在測試環境中運行junit/TestNG測試用例嗎?
- 19. junit測試用例事務沒有被提交 - 沒有錯誤
- 20. 運行JUNIT測試用例時出錯
- 21. 運行Junit測試用例時OutofMemoryError
- 22. 同時運行JUnit測試用例
- 23. 的build.xml不運行JUnit測試用例
- 24. JUnit測試類(netbeans)上沒有可運行的方法
- 25. 有例外的Java JUnit測試用例
- 26. 有沒有辦法在Kubernetes的e2e測試中運行單個測試?
- 27. 有沒有辦法壓縮測試用例?
- 28. 有沒有辦法實時製作Cabal打印測試用例?
- 29. 有沒有辦法在沒有真正運行測試的情況下爲RSpec測試生成文檔?
- 30. 有沒有辦法通過打開每個測試的瀏覽器實例並行運行量角器測試?
仍然有些情況可能會出現問題(例如,某些字詞是一個DBMS中的關鍵字,而不是其他字詞),並且使用不同的DBMS進行測試可能不會吸引他們。 –
@Nicolae顯然,是的。您需要針對這些方法進行專門的集成測試 –