qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          測試數據建模

           現在很多軟件應用,都設計成2部分:應用程序Application + 數據庫DB。要對這種類型的應用軟件進行測試,“測試數據”這個概念就非常的關鍵。測試用例中的“前置條件”,基本就是圍繞測試數據來設計的。以淘寶網的測試為例,驗證每個功能點時,最重要的就是準備好各種類型的數據對象,比如:不通信用級別的賣家,不同類目屬性的商品等等。

            熟練的測試工程師手里都會保存一批測試數據(比如賬號、商品),并且分類管理,不同場景的測試用例,都會有專門的測試數據來支持。在ta的心里,存在著一套完整的測試設計方案,在工作中也會顯得游刃有余。要達到這種狀態,需要經過一段時間的積累,需要“磨合”。對測試數據的控制力,也是測試工程師的重要能力之一,可惜這種能力很難被識別,被比較。

            最近2年,軟件測試工作在逐漸向開發團隊轉移,由以前的測試團隊“全包”,變成了現在的“半包”。很多觀點也認為,開發團隊來做測試工作,有著得天獨厚的優勢,因為開發對應用程序的結構最熟悉,哪里容易出現問題也最清楚。當然也有很多開發表示反對,原因大概有下面幾個:

            ● 沒時間,能把代碼寫完就不錯了

            ● 開發工程師沒有測試工程師的那種思維方式

            ● 測試數據準備起來比較困難

            這里的“測試數據問題”是客觀存在的,但不僅僅是這么簡單的一句話可以概括,需要深入分析。我們觀察開發工程師在做測試工作的時候,在測試數據方面會遇到下面幾個問題:

            1、對于一些比較復雜的測試場景,搞不清應該構造哪些測試數據對象,最后只好隨便抓一個來測試,只要沒拋異常,就算pass;

            2、就算搞清了測試數據的需求,去哪找這些數據,仍然是一個大問題,最后還是隨便抓一個來測試;

            3、就算把所有的測試數據都做好,如何根據測試場景隨機應變的使用,如何維護這些數據始終有效,也非常不容易;

            分析到這里我們發現,測試工程師對測試數據的控制能力,真的不簡單,開發工程師在工作中一般沒有接受過類似的訓練,所以很容易陷入“測試數據”的泥潭。而且,這個問題跟人的能力有關,不是單純依靠工具能解決的。

            關于“測試數據建模”,主要是解決上面的第一個問題:當我們要測試一個功能點,或者一系列場景的時候,需要設計出怎樣的測試數據組合。

             我們先假設一個最簡單的場景,這個場景只需要用到1個數據對象:USER,那么這里的測試數據,就是USER的每個屬性的枚舉值:性別、年齡、狀態、等 級,我們用一句話就可以概括一個數據對象,比如:女性user、20歲的user、狀態是已認證的user。測試用例可以這樣寫,但是實際測試時,熟練的 測試工程師并不會分別測試,而是把多種情況組合在一起,比如:20歲的已經認證的女性user。每個人的組合方式都不一樣。有一種算法叫做 “Pairwise Testing”,可以比較科學的組合多個屬性的枚舉值。但是有經驗的測試工程師發現,年齡和性別的邏輯關系很密切,這里的組合需要特別的設計,依靠 Pairwise的基礎設計還遠遠不夠,需要引入業務邏輯的分析。

            所以同樣的測試用例,不同的工程師在測試時,花費的時間,得出的結 果,會有很大的不同。僅僅一個數據對象,就會產生這么復雜的情況,那么請設想一下,如果一個場景需要用到5個數據對象,并且它們之間存在復雜的邏輯關系 時,測試工程師需要面臨怎樣的困難局面,我們已經無法用一句話來概括測試數據的具體值。這里“測試數據建模”的概念就自然的引出了,建模的目的,就是我們 可以很容易的描述清楚,復雜場景下的測試數據是怎樣的。

            很多工程師習慣用思維導圖來進行測試數據的設計,比如上文那個例子,大家會看到這樣的設計圖:

            但是在真實的測試場景中,我們使用的是matrix來組織測試數據,如下:



            灰色的cell代表在這個場景下,該屬性隨便取什么值。在這個案例里,我們發現性別和年齡關系密切,而狀態和等級關系密切,所以測試數據需要分開設計,我們建立A、B兩個模型:

            A模型是:

              ● user.性別 : {"男" , "女" , "不知道"}
              ● user.年齡 : {"10" , "20" , "30" , "40"}

            B模型是:

              ● user.狀態 : {"未認證" , "認證" , "刪除" }
              ● user.等級 : {"新人" , "熟練手" , "磚家" }

            每個模型都必須有一個唯一的名稱,目的是為了方便測試設計和交流。比如這個Test Suite(一組Test Case的集合)需要使用A模型,那個Test Suite需要B模型。這里的A、B只是一個代號,真實工作中可以根據產品特點重新定義命名規則。

            測試數據模型的真正內涵是:把業務邏輯關聯最強的數據對象屬性聚在一起建立group,并列舉出需要的屬性值,方便測試用例的設計,更為重要的 是,模型讓開發和測試在圍繞“測試數據問題”進行討論的時候,有一個標準。由于模型里面已經封裝了很多信息,只要指明模型的名稱,交流就變得更加簡單了。

            當然文章里這個案例的邏輯非常簡單,實際工作中并不需要測試數據建模,不過當數據對象比較多時,價值就能體現出來了。比如淘寶的下單,可能就會出現這樣的數據模型:

            ● 商品.價格 : {"",""}
            ● 賣家.狀態 : {"",""}
            ● 買家.所在地 : {"",""}
            ● 類目.XXX : {"",""}

            復雜的數據模型,可能會有10個以上的數據對象屬性。不過我們不能把所有對象屬性,都堆在一個模型里,那樣沒有任何意義,我們需要根據業務邏輯 對屬性進行分類,建立不同的模型,比如優惠、運費計算是不同的業務邏輯,因此需要建不同的模型。而圍繞優惠這個概念,還會根據不同屬性組合關系,建立多個 模型。

            我想每個測試場景,需要建立的數據模型并不會很多,2、3個左右。數據模型必須是常用的,這樣才有實際意義。時間久了,研發團隊每個成員的腦海 里,對于測試數據模型的概念,會越來越深刻,甚至對于模型里的某個Test Case,如果被執行的次數夠多的話,也會被大家記住。到時候Test Case也會需要名稱,為了方便大家記憶交流。

            在實際工作中,開發工程師經常反映,要執行某個Test Case,只修改某個數據對象(比如user)的屬性,根本不夠,必須要把多個數據對象(比如user、order、item)同時修改,才能完成。這其 實就是一個典型的需求:這個Case需要一個復雜的測試數據模型。

            當測試數據模型被大家接受以后,我們就可以圍繞模型做一些工具開發,來簡化準備測試數據的工作。如果工具只能分別修改某個對象的屬性,那么可用 性就不會太好,需要人為進行組合操作。如果工具能以測試數據模型為單元,就可以很快生成數據模型里的某個Test Case,這樣會大大簡化測試準備工作。

            需要說明的是,本文是基于工作現狀的推理,這種建模方式僅僅是“原型”,還缺少一些最佳實踐。如果本文的論述能引起你的共鳴,歡迎你在自己的產品測試中試一試。

          posted on 2013-01-10 13:41 順其自然EVO 閱讀(225) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 滨州市| 桐乡市| 洱源县| 博爱县| 莎车县| 浏阳市| 土默特左旗| 蒙城县| 英德市| 台山市| 陵川县| 江都市| 新建县| 资源县| 英德市| 汕头市| 永修县| 武宁县| 包头市| 奈曼旗| 称多县| 阿坝县| 泗阳县| 白银市| 隆林| 特克斯县| 新田县| 清水河县| 山丹县| 铜陵市| 肥乡县| 新野县| 铁岭市| 武汉市| 蒙自县| 垣曲县| 扶余县| 阿巴嘎旗| 海城市| 即墨市| 个旧市|