大家肯定知道測試代碼是不能隨意編寫的,并且在編寫測試代碼時也不是抱著一種隨意的態度,但是你編寫出來的測試代碼以及測試代碼運行的情況卻表現出了一種隨意性和無序性。因為你可能并沒有弄清楚測試的真正意圖所在。
本人曾經看到過有關驗收測試的這樣一個案例,驗收測試者使用昂貴的商用測試工具對一個具有圖形界面的軟件進行測試。測試的方法是通過編寫測試腳本驅動鼠標在圖形界面上隨機的點擊(當然每一次的點擊,都點到了圖形界面上可以接收事件的區域),然后等待著被測試軟件的崩潰。當然這種測試方法可以作為驗收測試的一個方面,但是決不是唯一的一個方面。還有更重要的內容被忽視了。
測試的目的是用來檢驗軟件系統是否滿足了需求。所以,你的測試代碼一定要明確的表達出這一點來。就那上面的案例來說,如果測試者真正從用戶的需求出發,那么他寫出來的測試腳本肯定不會是那樣的,而應該是每一個測試用例都清晰的刻畫了一項用戶的需求,然后檢驗系統是否實現了用戶期望的功能。這樣的測試才是有明確目的,才是最有效的測試。和把界面邏輯和應用邏輯隔離,采用明確表現用戶需求測試用例進行測試相比,上面的測試方法不能不說是隨意了一點。
在針對類進行的單元測試中,也經常會看到一些錯誤的測試方法。很多的測試者往往針對類中的每個特定的實現細節進行測試。類中的特定的實現細節是很容易變化的,在快速的迭代式開發中更是如此。一旦你測試的類中的某個實現細節發生了變化,你原先的測試代碼就要進行相應的更改,否則就失去了意義。這種頻繁更改的代價是巨大的。類是一種抽象,它反映了更高層面的內聚性,它應該有明確的職責和定義良好的服務接口,它的職責和對外的接口相對于內部的實現細節來說要穩定的多,并且我們要驗證的正是這個類是否具備了它的職責。因此,在對類進測試時,我們應該針對類的接口來驗證類是否實現了它的職責而不是其他。這樣寫出來的測試代碼要穩定的多,也有效的多。
細想一下,造成容易陷入針對實現細節測試的原因主要是由于先實現了類,然后才去進行測試。如果先實現了類的功能,然后在去對類進行測試,潛意識中就會不由自主的想去驗證已經完成的類的某種實現細節。如果能夠在編寫實際類前,首先編寫針對該類的測試代碼,情況就會有很大的不同,因為這會迫使你從類的使用者的角度去考慮問題。結果就是會把關注點放在類的易用性上,放在類的職責上面,放在類提供服務的接口上面,而不是某種實現細節。
總之,測試代碼的編寫應該從被測試的對象是否滿足需要的層面進行,而不是其他。
誤區之四:單元測試和驗收測試沒有什么區別
和誤解之三一樣,可能很多人并不承認這一點。但是他們卻又不能比較清楚的說出二者的差別來。這樣,在他們進行測試代碼的編寫時就會比較迷茫。本小節結試圖給出一些區分單元測試和驗收測試的一些原則來。
我們還以經常用來和軟件進行類比的建筑為例,首先給大家一個感性的認識。單元測試可以類比為一個建筑的質檢人員對建筑進行的檢測,他關注的重點是建筑的內部結構、地基、框架以及墻壁是否垂直等。他的檢測是要保證建筑的各個部分是正常的、安全的,換句話說,就是要保證施工滿足建筑上面的質量標準。驗收測試可以類比為建筑的使用者來對建筑進行的檢測。首先,他認為這個建筑是滿足規定的工程質量的,這是有建筑的質檢人員來保證的。使用者關注的重點是住在這個建筑的中的感受。他關心建筑的外觀是否美觀、各個房間的大小是否合適,窗戶的位置是否合適,是否能夠滿足家庭的需要等。這里,建筑的使用者執行的就是驗收測試,他是從用戶的角度出發的。建筑的質檢人員執行的就是單元測試,他是從構建者的角度出發的。
正是這種角度的不同決定了單元測試和驗收測試之間的區別。它們是對系統的不同的方面進行的測試,二者是互相補充的。不管我們在系統的構建中使用了多么聰明的方法,不管我們的系統是多么的靈活,但是首先我們的產品必須是可用的,否則我們所做的就是浪費時間,從這一點上來說驗收測試要比單元測試顯得更加重要。
還以上一小節給出的案例為例,案例中所使用的測試方法僅僅是從系統是否健壯的角度出發進行的,即使系統從不崩潰也不能證明那是一個可用的系統。因為測試根本就不是從用戶使用的角度出發的,測試者本應該和用戶一起來編寫驗收測試。單元測試保證我們把事情作對,而驗收測試則保證我們做正確的事情。
關于單元測試和驗收測試之間的明確劃分,沒有一個通用的標準,只有通過自己的不斷實踐來增加這方面的經驗。你進行的有關測試的實踐越多,你就會越清晰的感覺到單元測試和驗收測試之間的界限所在。下面給出一些指導原則,在你編寫測試代碼時可能會有幫助。
如果一個單元測試要跨越類的邊界,那么它可能應該是一個驗收測試
如果一個單元測試變的非常復雜,那么它可能應該是一個驗收測試
如果一個單元測試經常要隨著用戶需求的變化而改變,那么它可能應該是一個驗收測試
如果一個單元測試比它要測試的代碼本身要難以編寫,那么它可能應該是一個驗收測試
結論
測試是用來保證軟件開發過程的高效性,以及保證開發出來的軟件產品的高質量和可用性的。軟件開發本身就是一件非常困難的事情,這也決定了有效的測試決不是簡單的依靠一些測試工具就可以進行的。在使用工具的同時,我們更要加強關于測試的培訓、教育,使大家對于測試首先有一個正確的認識。只有這樣,我們才能夠更加有效、高效的使用工具,才能夠使測試真正起到它應有的作用。希望本文能夠對大家在進行測試方面的工作時有所幫助。
文章來源于領測軟件測試網 http://www.kjueaiud.com/