Think as developer,從深入理解業(yè)務(wù)實現(xiàn)框架開始

引言

這篇文章主要介紹筆者從經(jīng)歷過的項目中琼掠,看到自己或者項目組QA在產(chǎn)品迭代中的軟肋拒垃。認(rèn)為可以通過另外一種思路來改善這些弱點。希望能夠有助于QA最大化的做好質(zhì)量保障工作瓷蛙。

產(chǎn)品迭代中QA自身的Bug(軟肋)是什么悼瓮?

需求偏于口頭傳述

產(chǎn)品的快速迭代,可以迅速滿足用戶需求艰猬,然而卻也有一些后遺癥谤牡,比如部分需求描述偏向于口頭傳述,文檔后于實現(xiàn)姥宝,會給QA工作造成比較大的困難翅萤。所以在堅守一些固有可靠的測試流程之外,我們需要想一些新的辦法腊满。

需求和實現(xiàn)銜接不能達(dá)到無縫連接

測試的起點是明確測試的需求套么,然而有些很具體的問題,需要幫助開發(fā)定位問題的時候碳蛋,需求只定義了一些比較粗的業(yè)務(wù)目標(biāo)胚泌,然而具體實現(xiàn)由開發(fā)掌握。這里的銜接過程肃弟,QA是袖手旁觀呢玷室,還是參與其中。筆者認(rèn)為后者可能可以更深入的接近實現(xiàn)笤受,達(dá)到最大化的質(zhì)量保障穷缤。

是時候開拓一種新思路了。Think as developer箩兽,從閱讀并深入理解業(yè)務(wù)實現(xiàn)框架開始吧津肛。即使代碼并不是出自QA手,用到的開源或者內(nèi)部框架并不熟悉汗贫,那么也要嘗試開始跳出QA的舒適區(qū)身坐,開始更貼合的去理解業(yè)務(wù)邏輯及代碼實現(xiàn)細(xì)節(jié)秸脱。這個過程,QA要重新定位自己部蛇,重新定位質(zhì)量保障的核心競爭力摊唇。

在項目中的具體實踐

有了Think as developer這樣的思路,那么如何具體到 Do as developer涯鲁?筆者在下面2個項目中進(jìn)行了實踐:

  • 某運維監(jiān)控系統(tǒng)Web巷查、APITask模塊源碼閱讀
  • 某智能語音項目Java層源碼閱讀

鑒于目前接觸到的大多PC端的項目,大多是war包形式走的Tomcat撮竿。所以這篇文章主要是面向這類產(chǎn)品的一些閱讀方法和技巧總結(jié)進(jìn)行的一些實踐活動吮便。

也提煉出來了下面3個具體的閱讀技巧,可以更快速有效的作為理解業(yè)務(wù)實現(xiàn)框架的切入點:

下面的篇幅,來具體談?wù)勥@3個閱讀技巧房蝉。

<span id="jump1">一個Web項目的容器啟動的入口是什么僚匆?</span>

記得最早的時候開始研究Java Web的時候,記得看到一個人寫的一句話:
“初學(xué) Java Web 開發(fā)搭幻,請遠(yuǎn)離各種框架咧擂,從 Servlet 開發(fā)”

初學(xué) Java Web 開發(fā),請遠(yuǎn)離各種框架檀蹋,從 Servlet 開發(fā)

Java Web開發(fā)離不開Servlet松申,Servlet的生命周期是有Tomcat/Jetty這樣的Web容器接管,那么web.xml就是所有開始的入口俯逾。這里會配置Servlet贸桶,Filter這樣的組件。

Servlet:通過doGet doPost方法處理請求桌肴,這個方法里有傳統(tǒng)的兩個入?yún)ⅲ?em>HttpServletRequest皇筛,HttpServletResponse來分別處理請求和響應(yīng)。

Filter:在請求被容器發(fā)到servlet之前坠七,會先經(jīng)過配置的filter水醋。所以一般情況下,filter都是做一些白名單驗證彪置,特定的uri要通過openid拄踪,doFilter方法在做。
這個時候web.xml里應(yīng)該會有很多<servlet><filter>標(biāo)簽悉稠,雜亂無章

加入的SpringMVC框架后宫蛆,web.xml就變得簡化無比(只是web.xml),需要關(guān)注的有下面這些:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        classpath:spring-context-web.xml
    </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

以及Servlet的配置:

    <servlet>
        <servlet-name>sentry</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

又出來了兩個配置文件:spring-context-web.xml & spring-mvc-config.xml
一個是通用上下文的猛,一個是初始化MVC上下文耀盗。如下圖

1.png

那么各有什么用處:

  • ContextLoaderListener初始化的上下文加載的Bean是對于整個應(yīng)用程序共享的,不管是使用什么表現(xiàn)層技術(shù)卦尊,一般如DAO層叛拷、Service層Bean;
  • DispatcherServlet初始化的上下文加載的Bean是只對Spring Web MVC有效的Bean岂却,如Controller忿薇、HandlerMappingHandlerAdapter等等躏哩,該初始化上下文應(yīng)該只加載Web相關(guān)組件署浩。

這里就可以大致知道,之前所有<servlet>需要做的事情扫尺,都被SpringDispatcher servlet統(tǒng)一接管筋栋,可以理解為一個虛擬的路由器,將請求轉(zhuǎn)發(fā)給所有的@Controller正驻。

這里碰見過一個事情:我有個外部的服務(wù)需要初始化弊攘,初始化如下:

    <bean id="qaService" class="com.xxx.utils.qa.qaServiceImpl">
        <constructor-arg index="0" value="${baseURL}" />
        <constructor-arg index="1" value="${token}" />
    </bean>

我用它的地方是在一個Controller里面,然而放在spring-mvc-config.xml就編譯失敗姑曙,說找不到這個Bean襟交。放在spring-context-web.xml就可以。

<span id="jump2">深入Spring MVC + Mybatis的一些成熟的工程架構(gòu)如何配置伤靠?</span>

你的項目目錄應(yīng)該是這樣的:

  • /main/
    controller層捣域,service層及DAO層,以及filter
2.png
  • /Resources
    使用MyBatis的話宴合,這些mapper文件放在這里焕梅,并使用和DAO層一樣的包名。
    然后根據(jù)不同的開發(fā)形纺,測試丘侠,線上環(huán)境放入不同的配置文件。
3.png

至于配置文件如何讀取逐样,一方面Maven編譯打包的時候resource目錄下的文件都會拷貝出來蜗字。另外一方面,區(qū)分環(huán)境變量脂新,在pom.xml<profile>配置即可挪捕,然后通過mvn的 -P參數(shù)來區(qū)分,如圖:

        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/dev</directory>
                    </resource>
                    <resource>
                        <directory>src/main/resources/common</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>test</id>
            /* 同上 */
            <directory>src/main/resources/test</directory>
        </profile>
        <profile>
            <id>online</id>
            ...
            <directory>src/main/resources/online</directory>
            ...
            /* 同上 */
        </profile>
  • 請求如何到達(dá)Controller

這里有個關(guān)鍵注釋:<mvc:annotation-driven/>
因為之前肯定是通過<context:component-scan/>掃描過所有的Controller争便,但是他們只是Bean被構(gòu)造级零,需要通過<mvc:annotation-driven/>標(biāo)簽告訴SpringMVC,請求的處理者。

出處:spring-mvc-difference-between-contextcomponent-scan-and-annotation-driven

  • 請求返回FTL返回及JSON返回

這里要在spring_mvc_config.xml中配置一個beanContentNegotiatingViewResolver奏纪,有兩個屬性:

<property name="defaultContentType" value="application/json" />
.....
<property name="viewResolvers">
.....
<property name="defaultViews">

這兩個resolver的好處在于:Controller的函數(shù)處理鉴嗤,返回String就默認(rèn)是FTL的路徑(也就是前端的路徑),返回void序调,就是json醉锅。不需要@RequestBody注解。

  • Controller 怎么看发绢,怎么寫

了解一些關(guān)鍵注釋的意思硬耍,比如@RequestMapping@RequestParam, @RequestHeader 边酒,@PathVariable经柴, 至于ResponseBody,經(jīng)過上面的講解墩朦,應(yīng)該就不需用了坯认。別的話,多看代碼介杆,多實踐鹃操,不缺這樣的資料。

  • 前端的配置

前端這里有兩個關(guān)鍵配置:

<mvc:resources mapping="/views/**" location="/views/"/>`
<bean
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/views"/>`

因為ServletSpring整體接管之后春哨,所有的請求都被接管荆隘。那么靜態(tài)文件呢?他們又沒有Controller的處理赴背,肯定會404 not found椰拒。

  • 第一個注釋就是解決了這個問題,配置了靜態(tài)文件的本地路徑/views/凰荚,這里根目錄是webapp燃观, 那么所有的CSS,JS便瑟,PNG, 都將在來這里找缆毁。
  • 第二個注釋其實就是配置FreeMarker的模版路徑,一般工程也都放在webapp/views/下到涂。

<span id="jump3">Spring 和SpringMVC是兩件事</span>

這里碰見過一個事情:我有個外部的服務(wù)需要初始化脊框,初始化如下:

    <bean id="qaService" class="com.xxx.utils.qa.qaServiceImpl">
        <constructor-arg index="0" value="${baseURL}" />
        <constructor-arg index="1" value="${token}" />
    </bean>

我用它的地方是在一個Controller里面,然而放在spring-mvc-config.xml就編譯失敗践啄,說找不到這個Bean浇雹。具體為啥,可以參考上一節(jié)屿讽。因為這些Bean并不是有SpringMVC通過@Service標(biāo)簽來統(tǒng)一注入管理昭灵。那么它的初始化過程應(yīng)該要放入spring-context-web.xml,在SpringMVC介入之間就需要實例化。否則當(dāng)然只是一個接口烂完。

所以到這里為止试疙,相信已經(jīng)對此種類型的項目有了一個基本的閱讀技巧。下一章窜护,來說一下筆者在這些基礎(chǔ)之上效斑,實踐得到的一些感悟非春。

<span id="jump">實踐所得</span>

  • 能夠迅速上手項目柱徙,并快速理解項目基本邏輯及架構(gòu)。
    在我新接手的一個某智能語音機(jī)器人項目中奇昙,在沒有任何需求設(shè)計接口文檔的情況下护侮,要開展測試工作,只能先從源碼開始储耐,之前的經(jīng)驗幫助了我羊初,理清楚了所有接口的處理邏輯(畢竟是半路接手項目,只能先解決問題為先)什湘〕ぴ蓿基本上一兩天功夫就可以把源碼大體邏輯以及框架讀懂(當(dāng)然,大型的項目要花更長的時間)闽撤。當(dāng)時的幾個思維導(dǎo)圖之一如下:
4.png

然后就開始?xì)g快的寫接口測試用例得哆。

  • QA不僅僅要整體業(yè)務(wù)上有宏觀把控。出現(xiàn)微觀上bug哟旗,也能做出Root Cause的前瞻分析贩据,能夠迅速定位問題。**
  • 略深入理解SpringSpringMVC闸餐。
  • 找到快速融入研發(fā)團(tuán)隊的切入點饱亮。其實似乎是沒法量化的,然而個人在團(tuán)隊中起到的化學(xué)反應(yīng)相信都能感受到舍沙。

結(jié)語

筆者認(rèn)為在項目質(zhì)量保障過程中近上,提升QA戰(zhàn)斗力,需要開拓新思路拂铡。提出Think as developer壹无,以及Do as developer在某一類項目中的一些具體技巧。為讀者提供另外一種思維方式和媳。

所以白盒與黑盒不是測試手段格遭,而是測試思維。過度關(guān)注開發(fā)細(xì)節(jié)的白盒測試沒有意義留瞳,從需求出發(fā)更加的符合實際中的測試拒迅。

引自 鏈接

業(yè)務(wù)理解第一,業(yè)務(wù)理解第一,業(yè)務(wù)理解第一璧微。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末作箍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子前硫,更是在濱河造成了極大的恐慌胞得,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屹电,死亡現(xiàn)場離奇詭異阶剑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)危号,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門牧愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人外莲,你說我怎么就攤上這事猪半。” “怎么了偷线?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵磨确,是天一觀的道長。 經(jīng)常有香客問我声邦,道長乏奥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任翔忽,我火速辦了婚禮英融,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歇式。我一直安慰自己驶悟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布材失。 她就那樣靜靜地躺著痕鳍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪龙巨。 梳的紋絲不亂的頭發(fā)上笼呆,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音旨别,去河邊找鬼诗赌。 笑死,一個胖子當(dāng)著我的面吹牛秸弛,可吹牛的內(nèi)容都是我干的铭若。 我是一名探鬼主播洪碳,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叼屠!你這毒婦竟也來了瞳腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤镜雨,失蹤者是張志新(化名)和其女友劉穎嫂侍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荚坞,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挑宠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了西剥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痹栖。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞭空,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疗我,我是刑警寧澤咆畏,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站吴裤,受9級特大地震影響旧找,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦牺,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一钮蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剖膳,春花似錦魏颓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仑濒,卻和暖如春叹话,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墩瞳。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工驼壶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喉酌。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓热凹,卻偏偏與公主長得像箩溃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碌嘀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涣旨,服務(wù)發(fā)現(xiàn),斷路器股冗,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法霹陡,類相關(guān)的語法,內(nèi)部類的語法止状,繼承相關(guān)的語法烹棉,異常的語法,線程的語...
    子非魚_t_閱讀 31,599評論 18 399
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,653評論 0 3
  • 總是需要溫暖 哪怕是一點點自以為是的紀(jì)念
    我是ko楊凱倫的原配閱讀 126評論 0 0