一個電商專案的Web服務化改造6:單元測試4步走,構造資料、執行操作、斷言、回滾

小雷FansUnion發表於2016-05-01
  最近一直在做一個電商專案,需要把原有單系統架構的專案,改造成基於服務的架構,SOA。
    有點挑戰,做完了,會有很大進步。

    單元測試,在很早之前的文章已經介紹過。 
    可以在這裡看到相關的幾篇文章:
http://blog.csdn.net/FansUnion/article/category/1333595/2

    在這次Web服務化改造中,理論上有4層需要測試。
1. Mybatis的mapper層,mapper.java和,mapper.xml,
2. 負責資料組裝的Dao層,Dao.java。
3.負責業務邏輯的Service層,Service.java。
4.經過Dubbo包裝之後的WebService層,WebService.java。

  考慮到實際情況,mapper層沒有寫相關的單元測試,只寫了另外3層的。
  同時需要注意到的是,Service層和WebService層,內部程式碼可以說是完全一樣,唯一不同的是,Service呼叫的是原生程式碼,而WebService呼叫的是遠端的程式碼。

    Dao層的單元測試:初始化資料,然後就是“單元測試標準4步”,構造資料-執行操作-斷言-回滾。
初始化:Spring和JUnit結合提供了註解支援,配置dataSource.xml就可以了。
構造資料:手動構造brand物件
執行操作:我們自己寫的add、get等方法
斷言:增加add之後,資料庫中的資料和我們插入的資料,是否完全一樣
回滾:執行操作之後,資料庫回滾。也就是說,單元測試,不會“汙染”資料庫。
    


Service層的單元測試
 
     Service層和Dao層流程基本一致,初始化+標準4步。
    不同點service初始化,需要配置spring上下文,上下文檔案中,再引入dataSource.xml。
   spring-context-nodubbo.xml
   <context:component-scan base-package="cn.fansunion.webservice.service">
</context:component-scan>
   <import resource="classpath*:spring-dataSource.xml" />
    




Dubbo的WebService的單元測試
 總體流程,和Service一模一樣。
需要注意的地方: 
1.引入的context不一樣,裡面有dubbo配置。
   這個地方的單元測試,注入的bean,是dubbo包裝的。
  而service層,是本地的bean。
   
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	   xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
	   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	   ">
	   
	<dubbo:application name="ws-demo" />

	<dubbo:registry address="N/A" />

	<dubbo:reference id="brandService" interface="cn.fansunion.webservice.service.front.BrandService" version="1.0.0"
				   url="webservice://127.0.0.1:9000/cn.fansunion.webservice.service.front.BrandService"/>
				   
	<dubbo:reference id="redmanService" interface="cn.fansunion.webservice.service.front.RedmanService" version="1.0.0"
				   url="webservice://127.0.0.1:9000/cn.fansunion.webservice.service.front.RedmanService"/>
</beans>



2.呼叫dubbo服務時,“事務”不再自己本地的控制範圍內,因此,執行操作之後,資料無法回滾。
單元測試結束,資料庫中多了“髒資料” ,需要手動清除。
因此,我覺得dubbo服務方,應該使用單元測試專門配置的庫。 
    //設定自動回滾
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
//@Transactional  
//測試遠端的Dubbo管理的Service
@ContextConfiguration(locations={"classpath:spring-context-dubbo.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseServiceTest 

3.有相關人士認為,dubbo的WebService沒有提供服務,因為service經過測試了,dubbo就是簡單的包裝了下,只有1個是對的,其它的就沒啥問題。
  我本人認為這純粹是“過於自信” 、“僥倖”的心理,單元測試本身的目的之一,就是讓程式自動化地發現問題,至少要在預期之內。
當程式有所改動,重新執行一遍測試,就可能發現新的問題。

  或者說,這是個概率問題。service層是對的,dubbo包裝的WebService很可能不會有問題,但我認為它不可能做到“100%” 。
  

建言:多寫點單元測試,真是提高開發質量的好方法。怎麼測試自己寫的程式碼,保障程式碼質量,有規律可循。

個人觀察:人類世界,就沒有幾件事是一定會發生的。一定發生的事,通常帶有附加條件。

相關文章