2016-05-06 133 views
0

我想寫一個TestNG來測試一個property的db更新。僞代碼如下。在testNG中測試數據庫更新的最佳方法是什麼?

@Parameters({"newValue"}) 
@Test 
public void testUpdateValue(@Optional String newValue) 
{ 
    String originalValue = getValueFromDataBase(); //get Original value 
    updateValue(newValue); //update property to newValue 
    String updatedValue = getValueFromDataBase(); //get updated value from db 
    Assert.assertEquals(updatedValue == newValue, true); //test value updated correctly. 
    updateValue(originalValue);  // reset to origal value after test 
} 

我使用正確的方法來測試數據庫更新? 或其他任何解決方案是否存在於testNG中?

在此先感謝。

回答

0

它看起來有些不擅長斷言。

Assert.assertEquals(actual, expected); 

對於斷言等於你需要提供實際值從數據庫和你的期望值。如果兩者相等,那麼它會通過否則失敗。

Assert.assertEquals(updatedValue, newValue); 

謝謝你, 穆拉利

0

有3個問題,我用這個測試中看到:

  1. 正如穆拉利所說,你應該做Assert.assertEquals(updatedValue, newValue)。這確保了你的斷言錯誤是有用的。如果你的電子郵件地址爲Assert.assertEquals(updatedValue == newValue, true),那麼你的郵件將會是「False不等於True」,而不是「Joe」不等於'Bob'「。

  2. 您的測試取決於getValueFromDatabase()正常工作。如果getValueFromDatabase()每次都返回一個隨機值或相同的值或附加內容,則即使updateValue()有效,此測試也會失敗。

  3. 如果updateValue()不是工作,那麼你離開你的數據庫處於骯髒的狀態。

解決問題2和3,我建議懲戒數據庫。這需要:

  1. 它看起來像你所有的數據庫方法是靜態的。這是一個不好的的事。將數據庫封裝在一個對象中,並使用對象方法來打擊數據庫。
  2. 您的數據庫對象最好在其構造函數中使用參數來定義它使用的網絡。
  3. 創建一個模擬代表網絡(您傳遞給上面的構造函數)的對象。它將具有與普通網絡相同的方法,但實際上不會發送任何請求。
  4. 然後,在您的測試中,您可以測試以確定dataBase.updateValue()是否通過網絡發送UPDATE

Moreinfoonmocking

相關問題