對于上面那個程序,如果你測試到了Base.foo()和 Dervied.bar(),表面上看,你測試到了Base::helper()和Derived::helper()方法,達到了分支和語句,甚至路徑覆蓋100%。但是Base::foo()和Base::bar()他們跟Base::helper之間的接口還沒有覆蓋到,所以必須加強測試。
在面向對象中,上下文是設計比較多的,上下文覆蓋是一種收集被測試軟件如何執行數據的方法?梢詰糜诙鄳B、繼承和封裝的特性,也可以擴展到多線程應用。
● 繼承上下文覆蓋(Inheritance Context Coverage):上下文內執行到的判定分支數據量占程序內判定的總數的百分比。
○ 基類的方法在其上下文空間中的執行是完全獨立于基繼承類的上下文空間;繼承類的方法在其上下文空間中的執行也獨立于其基類的上下文空間。
○ 繼承上下文判定覆蓋率=(累加每個上下文內執行到的判定分支數)/(上下文數+上下文內的判定分支總數)
● 基于狀態的上下文覆蓋(State-Base Context Coverage)
○ 基于狀態的類:考慮有狀態依賴行為的類。
◆ 有邊界的棧:“空狀態”、“半空狀態”、“滿狀態”,“空狀態”使用pop()方法就拋出異常,“滿狀態”使用push()方法也會拋出異常。
○ 入口點覆蓋(Entry-Point Coverage)/接口點覆蓋(Interface Coverage):如上面的有邊界棧的類,只測試接口的話,是無法測試邊界值的時候會不會拋出異常。
○ 白盒覆蓋:如判定覆蓋覆蓋的接口不對應于公共接口的特性。而特定的處理是覆蓋不了的。
○ 基于上下文狀態轉移圖:描述狀態及其遷移路線的圖。
○ 基于狀態的上下文覆蓋:對應于被測類對象的潛在狀態。
◆ 基于狀態的上下文入口點覆蓋率=(累加每個狀態內執行到的方法數)/(狀態數*類內方法總數)
● 已定義用戶上下文覆蓋(User-Defined Context Coverage)
○ 基于線程的上下文覆蓋:應用到維護每個線程的獨立的覆蓋率。
其他覆蓋率(著重了解)
● 函數覆蓋:函數覆蓋率=(至少被執行到一次的函數數量)/(系統中函數的總數)
● 指令塊覆蓋(Inheruction Blocks Coverage):指令快覆蓋率=(至少被執行到一次的指令塊數量)/(系統中指令塊總數) 其中:指令塊表示函數內部一系列語句。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/