綠燈 | 紅燈

妙思資訊

2012年4月14日 星期六

來空空,去空空

保持乾淨是Unit Test 的原則之一。
怎麼說呢? 進行測試前,先要有乾淨的環境測試結果才會正確。當測試完後,也要把環璄整理乾淨,留給下個測試者乾淨的空間。

保持乾淨,常常用在對資料庫的資料作測試。進行測試前,要先確保測試Table是空的,然後才開始測試。測試的過程中可能會 Insert 資料或 Update 資料,當測試結束後,就把測試Table中的資料清空。這樣,下一個 Unit Test 才不會被先前測試時所遺留的資料干擾。

如何在每次測試前都有乾淨的Table 呢?

第一種作法就是在每次測試完後,使用SQL 刪除資料,不過這種作法會很累人。

第二種作法就是在每支測試方法上再包一個Transaction,當測試完成後Transaction 自動Rollback,這樣就不會有任何資料被存入,測試Table永遠保持乾淨。

使用Transaction 自動 Rollback 是最佳的方法,可以使用Spring 的 SpringJUnit4ClassRunner 進行設定。先寫一個SpringTXBaseTest,如果有需要Transaction Rollback 的Test 就只要繼承 SpringTXBaseTest 即可。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext*.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
public abstract class SpringTXBaseTest {}

public class DaoTest extends SpringTXBaseTest {

@Autowired
private MemberDao dao;
 
@Test
public void testSelCountByAcc(){
  
String acc="7R6";
ClubMember member=OM.createPersistClubMember(acc);
dao.saveOrUpdate(member);
assertTrue(dao.selCountByAcc(acc)>0);
  
}
}

在DaoTest中的每支Test都有包Transaction,所以testSelCountByAcc()執行完後,就會自動Rollback。如果好奇想要看看資料是否真的可寫入資料庫,只要加上@Rollback(false)即可。確定資料可寫入資料庫後,記得要把資料刪除保持乾淨。

@Rollback(false)
@Test
public void testSelCountByAcc(){
  
String acc="7R6";
ClubMember member=OM.createPersistClubMember(acc);
dao.saveOrUpdate(member);
assertTrue(dao.selCountByAcc(acc)>0);
  
}

沒有留言: