基于Spring MVC和Mybatis的接口測試框架實現

為什么把Spring MVC引入到接口測試中

在閱讀xx系統(tǒng)的源代碼進行接口測試的過程中,發(fā)現不止此系統(tǒng),主流運用的都是Spring MVC + Mybatis的框架來開發(fā)web。
發(fā)現這是個很有趣的事物,學習了一段時間,認為里面的一些個編程思想可以引入到接口測試中來。比如spring的AOP(面向切面的編程),DI也就是依賴注入或者控制反轉。
聽起來很高大上的詞匯,經過一番實踐,發(fā)現能夠有所理解并且也引入到了接口測試中來。
先以我工程的代碼片段來舉例說明,什么叫Spring的依賴注入。

1.png
2.png
3.png

這里有三張圖,第一張是使用NodeService,從第三張圖中我們可以看到NodeSerice其實就只是一個接口,那么為什么在我的接口測試代碼中可以直接調用它的方法呢:

4.png

從第二張圖中,是這個接口的實現方法。打了一個@Service的注解。這個@Service的注解就是要告訴Spring框架,這是一個JAVA Bean。
那么,神奇的事情發(fā)生了。Spring在我的測試業(yè)務代碼中,使用如下的注解@Autowired,這樣Spring就把NodeServiceImpl的實例給創(chuàng)建出來了。

5.png

這就是所謂的依賴注入,或者是控制反轉。因為實例化NodeServiceImpl的操作Spring幫我們做了,所謂的控制權從我們的業(yè)務測試代碼轉移給了Spring。

那么,這其實就是我理解的AOP,所謂的面向配置或面向切面的編程。在你的業(yè)務代碼里切入一刀,然后把實例注入進去。,這里說說一句話的事兒,說實話這一句話讓我理解了好久。
(其實@Resource也可以,他們有區(qū)別,但是我沒搞清楚具體使用起來的區(qū)別)
往常的做法應該是如下面的示例,需要new一個實例。

6.png

更近一層,既然知道了這樣的編程思想。為啥不能把我們常用的HTTP請求的類給轉化成這樣的呢。答案是肯定的,當然可以。如下面幾幅圖:

7.png
8.png
9.png

就這樣,我們HTTP也是提供給業(yè)務測試的一種Service。

為什么把Mybatis引入到接口測試中

Mybatis是一款輕量級的持久層框架,也是此系統(tǒng)進行Dao訪問用到的框架。我不知道Hibernate,不要問我區(qū)別在哪里,輕在哪里,我只知道很輕便。
依舊舉例說明:
首先,展示一下DB層的JAVA代碼映射,如下面2張圖:

10.png
11.png

Node是xx系統(tǒng)的一張表,格式如下:

12.png

可以看出來Node這個class的所有屬性,就是對節(jié)點表Node的映射。這就是所謂的DB層。
那么Dao層怎么實現的呢,先看圖:

13.png
14.png

只要定義一個NodeMapper的Interface,然后配置一個nodeMapper.xml,然后我們看到Mapper文件引用的就是NodeMapper這個接口,然后下面的id = create, retrieveById,retrieveByName。很明顯,就是這些Interface方法的實現。然后具體內容其實就是帶有變量的SQL語句。

簡單的講,其實Mybatis就是這樣容易。不用你在使用JDBC的方式把SQL語句以String的方式寫入到代碼中。只需要的一個配置文件。這也是所謂的面向切面/配置的編程。

如何搭建環(huán)境實現

如何使上面這些體系運行起來,這里其實就是Spring的配置的問題。

第一部分:將Spring把所有的JAVA Bean掃進來
15.png
第二部分:指定數據源dataSource,也就是MySql連接池
16.png
第三部分:將Mybatis和Spring整合
17.png

SqlSessionFactoryBean這個類是Spring提供應用于建立SQL連接池的。
其中:

  • typeAliasesPackage:它一般對應我們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名作為包括包名的別名。多個package之間可以用逗號或者分號等來進行分隔。
  • MapperScannerConfigurer:
    利用上面的方法進行整合的時候,我們有一個Mapper就需要定義一個對應的MapperFactoryBean,當我們的Mapper比較少的時候,這樣做也還可以,但是當我們的Mapper相當多時我們再這樣定義一個個Mapper對應的MapperFactoryBean就顯得速度比較慢了。為此Mybatis-Spring為我們提供了一個叫做MapperScannerConfigurer的類,通過這個類Mybatis-Spring會自動為我們注冊Mapper對應的MapperFactoryBean對象。

好了。你可以做TestNG的測試業(yè)務代碼編寫了。

如何進行TestNG和Spring的結合

在每一個測試類中按照下面這么配置:

18.png

@ContextConfiguration和AbstractTestNGSpringContextTests就可以做到。
原因是:因為我這個是Maven工程,執(zhí)行的是Maven test命令。而Spring運行test的時候是一個隔離的狀態(tài)。所以沒有辦法注入。
這里找到的答案:
“If you create unit tests, Spring IoC functionality is unavailable(as it was intended by the framework designers), because you are testing your objects in isolation(i.e. you are mocking only minimal set of interfaces which are required for the test to complete). “

[引自]:(http://stackoverflow.com/questions/13092322/spring-testng-integration-tests-injecting-dao-with-annotations-fails)

繼續(xù)你的業(yè)務代碼編寫吧。

其他

IDE的選擇

IntelliJ IDEA真的是太好用了。

  • 天生集成了Maven, Git。并且比如什么markdown語言啊,freeMarker,git的ignore文件這些都是可以智能編寫。
  • 有code inspection功能。你Git push的時候它會有個選項讓你做一下code inspection再說..
  • 而且正如名字所說,智能。聯想功能很強大。
  • 長得好看,速度快..
技巧
  • Alt+F8,呼喚出Maven的window。
  • shift+esc,退出窗口
  • Ctrl+alt+S, 呼喚出Setting配置出現錯誤的時候,
  • alt+Enter,出現錯誤時,它可以給很好聯想出解決辦法的。
  • 可以選擇Eclipse的喜好,默認支持Eclipse的所有快捷鍵。
  • 支持VIM編輯器,對于那些linux大神們,可以用這種全宇宙最強大的編輯器了。我不會用。
  • ....
如何在TestNG中調試

配置maven命令如下
surefire是maven的一個插件,專門用來test的,TestNG的測試一系列比如報告生成啊,什么都是它來做的

19.png

建立一個Remote

20.png

這個5005端口是默認打開的一個用于連接的端口,在下面的圖會有體現。

運行Maven命令

21.png

這個時候test的進程就停在那里了。

運行Remote

22.png

這個時候,只要有斷點,就可以斷下來了。
至于TestNG本身的知識,這里就不多說了,很多注解和屬性我也在使用中。

碰見的坑

  • Spring和TestNG的結合,請參閱前面的章節(jié),如果不這么做,TestNG是不會引入spring的所有配置文件的。
  • TestNG的調試,參閱前面的章節(jié)
  • StringEntity() 和 UrlEncodedFormEntity() 的區(qū)別:

加載HTTP參數的時候,之前用的UrlEncodedFormEntity,參數傳過去不識別。最后發(fā)現問題在這里。

httppost.setEntity(new StringEntity(JSON.toJSONString(params), "UTF-8"));

可以參考:鏈接

有啥問題,可以一起討論學習。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容