Orthogonal Array

02 July 2020

目標

這是一種產生testcase的方式,想辦法在資源有限的狀況下,用少量的testcase來達到最大的conditionon/decision coverage

困難點

在做軟體的code/condition coverage測試時,常常因為變數太多,有太多可能值導致不太可能做到100% coverage,舉例而言,假設有10個變數,每個變數值有可能是0 ~ 100,那就可以說有100^10種組合,總共要生出這麼多testcase才能保證所有情況都測到,但這測資數量大到天方夜譚,不可能測試所有狀況。

orthogonal Array功能

因此Orthogonal Array提供了一種方法,能夠用少量的testcase來達到pairwise factor達到100% coverage,即測試的任兩個變數、參數,他們在測資裡的各種組合都能找到。

舉例而言,若有3個變數A,B,C,D各個數值有可能是0 or 1,總共應該有16種組合,OA能夠利用8個testcase之類的來達到AB,AC,AD,BC,BD,CD所有組合都能測到,但不能保證ABC,ABD之類的三種以上的組合每種都有測到。

缺點

只能達到任兩個變數的condition 100% coverage,如果有三個以上的變數,只能保證任兩個有100% coverage,不能保證3個變數的所有組合都有

作法

表示法: \(L_n(2^m)\)
n: n筆testcase
m: m個factors

定義

Orthogonal array是要產生testcase,因此最重要的是要先決定有哪些變數、參數可以給值,這些變數通稱為factors

factors level: 變數的可能值的數量,通常我們會把它弄成\(2^n\)次方,例如假設有7個可能值,我們會說這個factor的factor level為8

1. 先決定N

N = X * Y

X: 擁有最多可能值得factors,取他的factor level
Y: 擁有第二多可能值得factors,取他的factor level

2. 建立新的column,擴增OA

  1. 先建立一個column,0,1輪留給值
  2. 把原本column大小擴增一倍,並把值複製一次如上圖第二張,此時就會有兩個column,並且row數量變成原來兩倍
  3. 再建立column(F3),F3每個欄位值基本上就是F1 ^ F2的結果

Orthogonal Array的功能基本上就是這樣,然後不斷重複上述三個步驟,把row的數量擴增到第一步的N數量相同。接續應該是

  1. 把現在OA的row數擴增一倍(上述步驟2),就是上述第二步,把前面F1到F3的column值都複製到新增的那個row。
  2. 建立F4,F4的值就是0,1輪留給值
  3. F5就是F1 ^ F4
  4. F6是F2 ^ F4
  5. F7是F3 ^ F4

基本上xor部分就是拿第五步(or第二步)新增的那個column跟前面原有的column做xor,產生的值就是新的column。 當F3,F4做完後,就可以回到第4步在擴張,然後再拿原有的column跟第6步建立的column xor產生新column

此時column數量很有可能遠超過你實際的factors數(原因是factor level可以很大,但是現階段每個欄位值只會是0 or 1),這樣的狀況就是其實要多個column才能表示一個factor,故column數此時會很多。

3. 合併column以符合目前factor數量

了維持pairwise的100% coverage,合併factor時有條件:

  1. 一次一定是3個column合成成一個
  2. 3個column一定要符合3個column A,B,C {A xor B = C, B xor A = C, C xor A = B}
  3. 合併後的column的值為根據原本3個column得值做一個mapping,如(0,0,0)-> 0 (0,1,1) -> 1這種mapping方式來給值,所以原本兩個testcase假設都是(0,0,0),那合併成一個column後,給值兩個testcase必須要是相同的值。所以3個column假設8個testcase,合併後的column應該也只有4個值,不會是0到7。
  4. 合併後的column,就可以assign給factor,如果testcase太多,可以把某些合併column的mapping map成dummy or no care

因此就算某個factor的factor level假設只有3(可能值為0,1,2),此時他還是會佔據3個column,除了0,1,2值外,剩下多的testcase可以是no care,反正已經保證pairwise 100% coverage了。