Testing | Class-Level Unit Testing
Software testing course notes from CCU, lecturer Nai-Wei Lin.
這章節主要開始介紹從 Class 層級的 Unit testing。
Class level 開始不再把 Method 看作單一的個體,而是以狀態的角度來查看一個 Class 在不同狀態下是否能符合規格。
6.1 UML State Machine Diagram
在這個章節就是介紹什麼是 State Machine Diagram,以及相關的名詞與概念
這裡可以參照 UML 中的 State diagram, UML 2 Tutorial - State Machine Diagram
- Finite State Machines(FSM, 有限狀態機)用來描述 Object 隨時間變化的動態行為模型
- FSM 視為對 Object 的一種局部視圖
- 每個 Object 都作為一個獨立的實體,透過 Event 與 Action 來做出反應與外部通訊
6.1.1 Events
- 事件代表 Object 可以偵測到的改變,例如:
- 一個 Object 對另一個 Object 的呼叫或 Signal 的接收
- 特定的 Variable 的變化或時間的流逝
- 任何可以影響一個 Object 的事物都可以被視為 Event
- Event 發生在某一時刻,他並不具有持續性
Event Type
- Call event:
- 一個 Object 接受明確的同步呼叫請求,op(a : T)
- Change event:
- Boolean expression 的值發生變化,when(exp)
- Single event:
- Object 收到一個明確,並被命名的異步通訊(Async),sname(a : T)
- Time event:
- 絕對時間或相對時間的流逝,after(time)
以之前的例子來說,receive order, rejected, approved 都是 Event
6.1.2 State
Finit state machine 定義了數個 State,一個 State 可以用三種互補的方式來描述:
- 一組性質相似的 Object values
- Object 等待某個事件或多個事件發生的時間段
- Object 執行某個持續進行的活動得時間段
6.1.3 Transitions
- 離開一個 State 的轉換定義了 Object 在該 State 中對於 Event 發生的回應
- 通常情況下一個轉換
e(a : T)[guard]/activity
包含:- Event trigger(事件觸發器):
e(a : T)
- Guard condition(守衛條件):
[guard]
- Effect(效果):
activity
- Target state(目標狀態)
- Event trigger(事件觸發器):
Event Triggers
- Event triggers(事件觸發器)指定了能夠觸發轉換的事件
- 如果該 Event 包含參數,這些參數在轉換的過程中可能會產生某些效果
Guard condition
- 一個轉換可能有 Guard condition(守衛條件),這是一個 Boolean expression
- 他可能引用被轉換的 Object 的 attributes, parameters
- 當觸發事件發生時就評估 Guard condition
- 如果為 true 則轉換發生; false 則不發生
- 同個事件可以觸發單一 State 中的多個轉換
- 但是使用相同事件的轉換之間必須有不同的 Guard condition
- 而一個 Guard condition set 將涵蓋所有可能性,確保 event 會觸發某個轉換
- 一個事件中只有一個轉換可能被觸發
Effects
- 當一個轉換觸發時,他的 Effects(效果)將被執行
- 效果可以是一個 Action 或 Activity
- Action: 可以是一個基本的計算,例如:
- assignment statement
- simple arithmetic computation
- sending a signal
- calling an operation
- createing/destorying an object
- getter/setter
- Activity: 一連串的 Actions
- Action: 可以是一個基本的計算,例如:
Change of State
- 當一個 Effect 執行完畢,則 State 就將改變到 Target state
6.1.4 Activites in State
一個 State 中也可以包含一系列的 Activity:
- Entry activity: that is executed when a state is entered –entry/activity.
- Exit activity: that is executed when a state is exited –exit/activity.
- Internal activity: that is executed after the entry activity and before the exit activity –e(a:T)[guard]/activity.
6.4 State Type
FSM 中的 State 可以分為以下幾類
- Initial state/Final state: 一個 Psudo state(偽狀態),用來表示 State machine 的開始與結束
- Terminate: 表示 State machine 的銷毀或結束,包含釋放部分資源,清除狀態等
- Simple State: 沒有子結構的 State
- Nonorthogonal State: 包含一個或多個子狀態的複合狀態,狀態活動時代表其中至少有一個子狀態處於活動狀態
- Orthogonalstate: 包含兩個或更多子狀態的複合狀態,狀態活動時代表其中所有子狀態都處於活動狀態
上圖左邊是 Nonorthogonal state,右邊是 Orthogonal state
6.2 Test Coverage Criteria
關於測試覆蓋標準的詳細說明可以參考 Test Coverage Criteria 這裡主要以 All-definition-use coverage 來說明
- Control flow
- All-state coverage: 所有的 State 都被執行到的路徑
- All-transition coverage: 所有的 Transition(邊界)都被執行到的路徑
- Data flow
- All-definition coverage: 所有的 Definition 都被執行到的路徑
- All-use coverage: 所有的 Use 都被執行到的路徑
- All-definition-use coverage: 所有的 Definition 與 Use 都被執行到的路徑
- Both
- All-path coverage: 所有的路徑都被執行到,但如果有無限迴圈的話就無法完成
6.2.1 Testing Paths
Definition-Use Pairs
- The value of a definition of a variable may be used by several different uses of the variable.
- A use of a variable may use the value defined by several different definitions of the variable.
- Each definition and each of its uses compose a definition-use pair.
- The set of definition-use pairs includes all the data flow relations.
All-definition-use coverage 的測試流程如下:
- 找出所有的 Associations:
- 每個 Definition 與 Use 之間都會有一個 Association
- 使用圖形演算法找出路徑,這裡使用 BFS
- 找到一條路徑後就標記該條路徑覆蓋到的 Association
- 直到所有的 Association 都被標記為止
- 不是所有 Association 都是可行的,這裡可以使用手動判斷或是使用演算法來判斷
要注意這裡所說的都是 Nonorthogonal state
6.2.1 Orthogonal States
因為 Orthogonal State 中的 concurrency(並行)特性會使得測試變得複雜,所以需要將 Orthogonal State 轉換成 Nonorthogonal State 來進行測試。
- 如果一條路徑包含了 Orthogonal State 可以將 State 中的每個完整子路徑都視為一條路徑來擴展成一組完整路徑集合
- 因為 Orthogonal State 中的 Concurrency 特性,我們需要將 Orthogonal State 轉換成 Nonorthogonal State
Orthogonal States to Nonorthogonal States
- 假設有一個 Orthogonal State 有 n 個區域,並且 ni 中有 mi 個狀態
- 每個新狀態都是一個 n-tuple( x1, …, xi, xn ), xi 是第 i 個區域中的舊狀態
- 如果在第 i 個區域中存在從 xi1 到 xi2 的轉換,那就存在一個 ( x1, …, xi1, xn ) 到 ( x1, …, xi2, xn ) 的轉換
上圖將上方的 Orthogonal State 中的所有狀態可能同時發生的情況都列出來,然後組成下方的 Nonorthogonal State
6.3 Constriant Logic Graph
如果直接從 State Diagram 來進行走訪與測試的話會需要很多而外的處理,所以更簡單的方式是將 State Diagram 轉換成 Constriant Logic Graph 來進行走訪。
假如有一個 stack 的 State machine 如圖左,將其轉換為右圖的 CLG 後會更好的找出 Associations 與路徑
這樣做的好處是可以專注在 Graph traversal algorithm,將所路徑上的 Expression 收集後再處理成 CLP 就可以找出 test case, 不用再像 State Diagram 需要處理複雜的 Node 結構。
Last Edit
12-12-2023 17:37