2014-03-12 19 views

回答

1

問題是我不認爲JDBC連接是一個需要進行單元測試的問題。 JDBC連接是依賴於環境的,而你的單元測試應該只依賴於你的代碼(和測試相關的資源)。也許你需要的是設置集成測試(http://searchsoftwarequality.techtarget.com/definition/integration-testing),即使這樣我也不確定它是否是你需要的。

如果您需要從您的開發工作站檢查JDBC連接性,請注意,您將放入單元測試的所有內容都將與整個測試套件一起執行(甚至在您的CI環境中,假設您有一套測試套件),因此它可以污染你的持續集成和交付流程,如果你有一個。如果您需要此項來檢查開發工作站中的某些內容,最好要求您的IT或運營部門在其工作站設置程序中檢查它或包括端口開口等。

+1

如果這個問題純粹是關於單元測試,那麼你是對的。但我認爲你假設JUnit只能用於單元測試。當我是技術測試員時,我使用基於JUnit的框架編寫了大量的集成/環境測試。他們絕對不是單元測試,但他們使用JUnit。 –

1

單元測試不適合覆蓋數據庫連接。相反,這是由集成測試覆蓋的。假設你的類處理JDBC有一個返回Connection的方法,你可以編寫一個不是nullisValid的連接的測試來提交查詢並執行它們。這是使用Spring和JUnit 這個集成測試的例子:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "/your/resource/package/your-spring-config.xml" }) 
public class YourJdbcClassTest { 

    //this will inject an instance of the class that access and manages your JDBC resources 
    @Autowired 
    YourJdbcClass yourJdbcClass; 

    //test the database connection 
    @Test 
    public void testGetConnection() throws SQLException { 
     Connection con = yourJdbcClass.getConnection(); 
     Assert.assertNotNull(con); 
     Assert.assertTrue(con.isValid(0)); 
     con.close(); 
    } 
} 

然後,只需創建與JDBC交互的其他方法的測試。只需補充一點,這可以用於代碼覆蓋,但是如果您使用Spring或任何其他已經處理注入資源的框架(如Connection),那麼這種測試將是無用的,因爲它在每個集成測試中都有涉及案件。


注意添加衝刺JUnit測試將使你做集成測試。來自official documentation

測試是企業軟件開發不可分割的一部分。本章重點討論IoC原理對單元測試的增值以及Spring Framework對集成測試支持的益處。

+0

對不起,但我看不出這樣的測試會增加什麼值 –

+1

@NickHolt它驗證JDBC連接機制在其特定的類中以正確的方式使用,並返回一個有效的「連接」,可以通過其餘的的DAO層。 –

+0

@Luiggi門多薩,當我執行Connection con = yourJdbcClass.getConnection();我得到NullPointerException,我該怎麼辦? – Amir

1

簡短的回答是不。

較長的答案是,除非你對你將要使用的數據庫的實際實例中運行,這種測試不是真正的測試系統,只是它的一個近似,可以有很多說Oracle和H2SQL之間的驚人差異。如果您對數據庫的實際實例中運行,這會減慢你的測試套件下來,這通常會導致其不被頻繁,因爲它應該運行。

請記住,這些測試都沒有(也不應該)只是被從開發人員的桌面上運行。他們應該從CI服務器在您的釋放過程中運行,等等 - 這些都需要多數民衆贊成保持最新與最新的變化和自身的數據庫實例。這是可行的,但比它的價值更麻煩。

所以,這就是爲什麼將DB訪問納入單元測試是一個壞主意,,但你仍然需要測試

就個人而言,我認爲與數據庫爲全天在已知的環境中運行對我的系統/數據庫的安裝實例集成測試(與CondordionFitNesse書面)互動測試。理想情況下,數據庫更新應該是自動的,應該是系統的安裝和啓動。