概述
數據驅動在PS產品線是一種常見的自動化方式,由于想法自然、設計簡單、收益顯著,是一種自動化的常見方案。然而數據驅動卻存在著一些缺點讓我們很頭疼,首先是數據的維護問題,我們需要保存大量的輸入和預期輸出,模塊一旦涉及功能上的升級,我們就需要手動添加測試用例來保證自動化工具的case覆蓋率和有效性,同時隨著模塊不斷地升級,數據集不斷增大,自動化的執行時間也越來越長;其次是數據驅動在回歸測試方面引用廣泛,但在新功能測試方面顯得不是很有效,新功能測試一般來講注重的是策略的分析和數據的構造,而數據驅動的思想則不能夠很好地支持數據的自動構造,最主要的數據構造過程還是需要手動完成;再次,數據驅動最大的問題就是數據失效問題,一般一個測試點需要對應多組數據,如果模塊的一次升級在某個功能點上發生變化,那么對應測試點的幾組數據全部都需要修改,前面提到數據驅動的數據集會不斷增大,所以數據失效引起的維護成本是不可忽略的,隨時間的推移,會越來越大,并且一旦模塊功能發生重大升級(如切詞升級),很可能引起大片數據的失效,導致工具運行時出現大片的“FAIL”,這時的數據維護成本會急劇上升。在這里我們提出一種基于特征驅動的自動化方案,能夠較好解決上述數據驅動方式的三個不足,大大減輕了數據成本的維護工作量,測試工程師的焦點更關注于策略本身,而不必手動構造、添加大量的 case。我們首先在架構、代碼較為清晰的DA模塊上做了嘗試,通過該自動化思想下的指引做了DA模塊的自動化改造,通過投入試用后發現,相比之前的數據驅動方式,測試效率有了明顯的提升。
關鍵詞
自動化方案,數據驅動,特征驅動,數據維護
介紹
所謂特征驅動,是指通過數據的特征來驅動case的驗證。所謂基于特征驅動的自動化方案,是指通過保存每個功能點數據的特征來實現case的回歸自動化,通過構造特征來實現case的新能能自動化。那么何為特征呢?其實很簡單,就是指數據的一些特定屬性??匆粋€DA的數據驅動case,構造輸入: “無料アニメ畫像掲示板”& 構造預期輸出:“R_IBD 11”,這個query之所以返回R_IBD是因為滿足兩個屬性 —— 論壇屬性和寫真屬性,那么這個數據驅動的case,我們就可以改寫為,輸入特征:“isForum=1,isPhoto=1”& 預期輸出:“R_IBD 11”。
從case書寫的角度看,似乎兩者并沒有什么本質的區別,只不過一邊是真實的query,一邊是一串符號,但帶來的變化是不可忽視的,第一,case的可讀性增強,顯然,“isForum=1,isPhoto=1”清楚表達了輸入數據的特點以及策略的思想,而單純一個query放在那兒,只能靠感覺來判斷這個輸入數據的策略預期;第二,case的表達性增強,用集合論的術語來講,數據驅動中一組case表示的只是一個元素,而特征驅動中一組case表示的是一個集合,換句話說,“isForum=1,isPhoto=1”不僅代表了“無料アニメ畫像掲示板”,而且代表了所有滿足論壇屬性和寫真屬性的 query;第三,case的有效性加強,直接使用輸入數據來存儲,一旦切詞程序、屬性詞典等其他因素發生變化,保存數據就可能失效,而屬性表達的是數據之上的高級特征,不存在特征失效的問題,除非策略發生了變化或者出現了沖突,即便出現策略沖突情況時,case的可讀性也會發揮作用,不會在追查問題上耗費大把的時間。
那么在使用了特征表示case以后,如何進行測試點的驗證呢?有了一系列特征表示輸入,我們首先要通過一個轉換工具將特征還原為輸入數據,然后再將輸入數據導入到數據驅動模式下的自動化。其中重點問題在于如何將特征還原為數據,我們的思路是準備一個比較大的數據集合,如果我們需要構造query就應獲取一個比較龐大的query集合,如果需要構造網頁就先獲取一個比較龐大的url集合,這樣我們不需要直接去構造我們想要的數據,而是通過特征從這個數據集當中選取出來即可。當然,有可能滿足特征的數據不在這個集合當中,而從實際的情況看,基本不存在這個問題,那query集合舉例,從線上隨機獲取的10w左右的query,基本就能覆蓋到大多數的特征,100w基本已經覆蓋完畢,從另一種角度上去看,如果從10w隨機query中都選取不到,那么我們可以認為策略的影響面已經小于0.001%,要么這個策略本身有問題,要么這個策略其實可以忽略了。
應用
依據特征驅動的思想,首先在架構清晰、代碼簡潔的DA模塊下進行了嘗試。DA是一個典型的對query進行分析的模塊,能夠根據線下挖掘或實時挖掘得到的一些專名/屬性詞典,判斷query的時效性、圖片、視頻需求以及同義詞、term重要性等信息。DA的現有自動化工具是一個非常完整的基于數據驅動的自動化工具,能夠保存query和對應的預期分析結果,并且能夠支持相應屬性詞典的構造,從數據驅動自動化的實現角度可以說非常完整。但不足之處正如前面所提到的幾個數據驅動的弱點,需要人工編輯大量的用例數據以及相應的詞典,并且升級過程時常會伴有輸入數據的失效問題,雖然自動化工具有效提高了自動化率,但顯然仍需消耗大量人力在數據的維護上。
將數據驅動改造為特征驅動,首先需要將數據進行抽象化,所謂抽象化,就是將數據用更淺顯易懂且方便的方式表示,同時大大降低對數據的維護成本。根據DA輸入數據以及測試方案的特點,可以考慮將query的某些query級、term級屬性抽象出來,用特征來表示輸入數據。
收益
由維護大量的輸入數據轉變為功能點相關的輸入特征,極大簡化了數據的維護方式,降低了維護成本。
通過一個特征可以抽取出多組數據,測試充分性得到了加強。
數據的失效性問題得到了很好地解決,有效防止了策略升級引起的輸入數據的大面積失效。
總結
特征驅動是一種建立在數據驅動之上的一種自動化方案,其思想是通過特征代替原數據來減少維護成本。通過實踐,該方案思想主要適用于數據處理密集型的模塊,在復雜數據處理的功能測試方面表現良好。10年首先在DA模塊上進行了試用,根據DA的策略分析進行了對DA自動化方面的改造,并在10年Q2將自動化工具投入使用,投入的第一個項目就發現了7例bug,其中特征構造時間為5分鐘,運行時間為10分鐘,DA模塊的整體測試效率和項目周期都得到了很大程度上的改善。
原文轉自:http://www.anti-gravitydesign.com