2015-12-30 87 views
1

彈簧引導web集成測試,首先需要加載測試數據。 現在我用下面的方式執行集成測試時的彈簧啓動只在整個過程中加載測試數據一次

@ActiveProfiles("test") 
@Sql({"/test-schema.sql","/test-user-data.sql"}) 
public class FooControllerWebIntegrationTest {...} 

這是確定的,但我發現,當執行每個測試方法,它會反覆加載試驗數據。請看下圖:

2015-12-30 15:58:18.398 INFO 4739 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executing SQL script from class path resource [test-schema.sql] 
2015-12-30 15:58:18.403 INFO 4739 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executed SQL script from class path resource [test-schema.sql] in 5 ms. 
2015-12-30 15:58:18.403 INFO 4739 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executing SQL script from class path resource [test-user-data.sql] 
2015-12-30 15:58:18.412 INFO 4739 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executed SQL script from class path resource [test-user-data.sql] in 8 ms. 

,但我只想要一次加載試驗時,全班同學和執行mvn package時甚至加載一次,我怎麼可以達到這個目的?

回答

1

加載每個測試的模式和數據有什麼問題?

如果您的問題是爲每個測試重新創建模式,那麼您始終可以在創建數據庫對象之前清理模式。

如果您的問題是由以前的測試創建的數據不再適用於其他測試,那麼您的測試存在問題,因爲您的測試不應該依賴於其他測試。每個測試都應準備測試數據,執行測試並單獨驗證結果。

+0

是的,在某些控制器方法中需要檢查用戶名是否有效,也就是說它存在於用戶表中。所以我想準備一些測試數據(例如插入用戶(名稱)值('foo'))。所以我認爲不需要每次只加載一次這些測試數據就可以,並且可能花費更少的時間來完成整個測試過程。 – zhuguowei

+0

如果您需要測試檢查用戶名是否有效,那麼您應該將數據準備爲測試的一部分,而不是在腳本中。原因是因爲該測試數據僅對該特定測試有效,而不適用於其他測試。 – Wins

+0

是的,你是對的 – zhuguowei

0

如果你看看:@Sql annotation documentation

有一個Sql.ExecutionPhase其中執行SQL時,您可以配置。

否則你在這裏在這裏回答了同樣的問題:

@SQL one time per class

+0

謝謝!但是在'Sql.ExecutionPhase'中我只發現'BEFORE_TEST_METHOD'和'AFTER_TEST_METHOD',都是方法級別的,沒有'before_test_class'和'after_test_class'。 – zhuguowei

相關問題