網頁

2014年1月9日 星期四

Effective Java提升Code Coverage代碼涵蓋率

雖然我們已經有了測試程式,但是如何得知是否已完整測試了主程式?,透過Code Coverage代碼涵蓋率,我們可以快速地得知,目前系統中,有多少程式中被測試過,不考量成本跟投資效益比,涵蓋率越高,代表系統如預期正常運作的面向也越廣泛。


雖然Effective Java並沒有明確指出Code Coverage代碼涵蓋率的比率,不過因為Mix採用單元測試的方式進行測試,所以還是有必要了解,測試代碼是否能夠涵蓋比較多的主代碼。




  
 /**
  * Equals.
  */
 @Test
 public void equals() {
  Role role = new RoleImpl();
  role.setId(1);
  //
  Role role2 = new RoleImpl();
  role2.setId(1);
  //
  System.out.println(role.getId() + ", " + role2.getId());

  boolean result = role.equals(role2);
  System.out.println(result);
  // 尚未覆寫equals時,會測試失敗
  assertTrue(result);
 }



Mix原先的測試方法equals(),雖然是測試成功了,但其涵蓋率只有72.4%,這表示原equals()內,有部份的敘述沒有被測到,測試方法還有待改進。




綠色的部份,是表示有被測試到,黃色的是有敘述的分支,而紅色則是沒有被測到敘述, 因此Mix重構測試方法equals(),希望能達到較高的涵蓋率。







再執行一次測試方法equals(),來查看其結果。

 /**
  * Equals.
  */
 @Test
 public void equals() {
  Role role = new RoleImpl();
  role.setId(1);
  //
  Role role2 = new RoleImpl();
  role2.setId(1);
  //
  System.out.println(role.getId() + ", " + role2.getId());

  boolean result = role.equals(role2);
  System.out.println(result);
  // 尚未覆寫equals時,會測試失敗
  assertTrue(result);

  // 以下為追加的測試代碼
  Role role3 = role;
  result = role.equals(role3);
  assertTrue(result);
  //
  Role role4 = null;
  result = role.equals(role4);
  assertFalse(result);
  //
  Object object = new Object();
  result = role.equals(object);
  assertFalse(result);
  //
  role2.setId(99);
  result = role.equals(role2);
  assertFalse(result);
 }






這次Mix發現,重構測試方法後,Code Coverage代碼涵蓋率已經可以達到100%。




所有的分支點都已經測試過,不在有未測試的敘述,這表示已涵蓋equals()內所有的敘述。




不過是否每個被測方法,Code Coverage代碼涵蓋率都需100%呢?,這倒不一定,因為實務上有ㄧ定執行的困難,所以主要會朝著以下幾個方向,來檢視程式:
  1. 有沒有作Unit Test? 
  2. 還有哪些程式碼沒有被測過? 
  3. 重要的邏輯,有沒有涵蓋多一點情境? 
  4. 發生測試失敗時,失敗的原因點,有沒有被涵蓋到?




  1. 檢視Code Coverage代碼涵蓋率



沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...