劉 博,李運堅,張 磊
(北京廣利核系統工程有限公司,北京 100094)
單元測試(Component Testing)是在軟件開發過程中必要的基礎測試活動之一,為實現軟件預期的質量和性能提供了有力保障。特別是在核電數字化安全級系統中,單元測試是提前發現軟件缺陷和保證安全系統平臺正常運行的有效措施,在V&V(Verification and Validation)標準 IEEE 1012 Software Verification and Validation[1]與美國核管會審查導則RG1.171[2]中分別強調了單元測試的必要性。
在核電安全級應用軟件中,軟件單元(Software Component)的邊界劃分并無明確規定[3]。單元既可以指一個函數(工程組態中封裝的模塊),如“與門”、“二取一表決器”運算,也可以代表一個基本的軟件功能,如“超溫超壓停堆保護”。通常情況下,為了保證測試的全面性,軟件單元的界定往往更傾向于后者,函數功能則在平臺測試中完成。因此,安全級應用軟件的一個單元會包含大量的輸入信號和控制邏輯運算,輸入信號值域的組合代表不同的工況。如果將每個單元的工況都測試一遍,意味著要窮舉輸入變量的取值組合,測試用例數量將以對數形式增長[4],但組合測試方法則可以有效減少測試用例數量。
Mandl首先將組合測試運用于軟件測試中,對Ada編譯器進行了兩兩組合測試和配對組合測試。在之后的大量研究當中表明,組合測試具有檢測軟件缺陷的能力[5]。根據Kuhn和Reilly對Mozila瀏覽器做的一項測試報告表明,70%的錯誤是由于相關的兩個參數導致的,超過90%的錯誤是由3個以內的參數相互作用而引起的,要發現所有缺陷,覆蓋強度僅需要達到6-way[6-7]。同時,美國國家標準和技術協會(NIST)的Kuhn等人通過4個軟件系統研究組合測試的錯誤檢出率,結果表明3組合覆蓋(3-way covering)的錯誤檢出率超過80%[8]。目前組合測試已廣泛應用于兼容性測試和高度可配置的系統測試等[9]。
本文提出分級組合測試的概念,并以工程實例展示了這種方法生成測試用例的具體過程。
組合測試方法是一種將系統中相互作用的因素值域組合,用盡可能少的測試用例,覆蓋這些因素對系統的影響狀況。例如,數字邏輯圖1,若要發現其中“與門”的缺陷(輸入條件B與輸出短接),一般情況下窮舉需要8(23)個測試用例才能發現錯誤,如表1所示。然而,組合測試只需要運用兩兩覆蓋(pairwise covering)4個測試用例即可,如表2所示。

圖1 數字邏輯圖Fig.1 Digital logic diagram

表1 常規測試方法Tab.1 General testing method

表2 兩兩覆蓋組合測試Tab.2 Pairwise covering test
表1中第二個測試用例可以檢測出邏輯錯誤,表2中第一個測試用例可以檢測出邏輯錯誤。
根據變量的取值范圍、采用的覆蓋標準和測試強度,可以將組合測試用例分為4類[9]:正交矩陣(Orthogonal Array)、覆蓋矩陣(Covering Array)、混合水平覆蓋矩陣(Mixed Level Covering Array)和可變強度覆蓋矩陣(Variable Strength Covering Array)。
正交測試法是基于數理統計和概率論的一種經驗設計技術,利用已有的標準正交表處理多因素實驗問題[10]。正交表實際是一個二維矩陣(又稱正交矩陣),可以實現兩兩參數覆蓋的測試要求。針對不同的參數數量和值域范圍,選擇適當的正交表,即可得到優化的測試用例。
根據大量理論和實踐證明,正交測試的優勢主要有[11]:(1)保證所有參數變量成對組合;(2)生成的測試集在組合全集中是均勻分布的;(3)與人工生成測試集相比,不會遺漏某些變量組合,可靠性高,實現過程簡單。
正交表構造過程雖然簡單,但是常用的標準正交表不能涵蓋所有因素與水平的情況,因此在選擇正交表的過程中往往需要測試設計人員調整因素與水平的數量,以滿足現有的正交表。特別是對于核電應用軟件,系統中同時包括數字與模擬變量,由于取值范圍不同,構成混合水平正交表,很難從標準正交表中直接查到。例如:L4(23×45),則無法查到完全符合的正交表。
一個值域大小為v的N×k覆蓋矩陣,任意的N×t子矩陣包含了在v值域上所有大小為t的排列,可表示為 CA(N;t,k,v),其中 N 為測試用例數,t為測試強度(strength),k為階數(degree),v稱為序(order)[12]。當一個覆蓋矩陣有最小的行數時,這個最小行數稱為覆蓋數(covering array number),表示為CAN(t,k,v)。
通常情況下,測試強度為2的覆蓋矩陣稱為兩兩覆蓋矩陣(pairwise covering array),即任意兩列變量的取值組合全覆蓋,前提條件要求矩陣的每列參數具有相同的值域。例如表2,是一個標準的覆蓋矩陣,共4個測試用例,測試強度為2,階數是3,序為2,矩陣表示為 CA(4;2,3,2)。
一個值域大小為v的N×k混合水平覆蓋矩陣,任意的N×t子矩陣包含了在相應值域上的所有 t元組,可表示為 MCA(N;t,k,v1,v2…vk)。與正交矩陣和覆蓋矩陣不同的是每列參數的值域可以不同,即,vi代表第 i列參數的取值個數。
混合水平覆蓋矩陣用于不同值域的參數變量進行組合測試。例如,假設表2中輸入變量C的取值范圍為{0,1,2},則可得到混合水平覆蓋矩陣MCA(6;2,3,2,2,3),經過簡化得 MCA(6;2,3,223)。
可變強度覆蓋矩陣 VCA(N;K,(n1,n2,…nk),())是 N ×k的矩陣,N 為矩陣行數,k為輸入參數個數,ni代表第i個參數的值域為參數集合P的某個子集,但子集不構成對集合P的劃分,ti是子集的測試強度。
一般地,強度為t的覆蓋矩陣被稱為t覆蓋矩陣(t-covering array),要求在值域范圍內,任意t個因素之間的取值組合全覆蓋。
分級組合測試是將一個系統劃分成若干次級系統,各次級系統采用不同的測試強度生成測試用例子集后,在次級系統之間再次使用組合測試算法,最終生成單元測試用例。算法架構見圖2.

圖2 分級組合測試架構Fig.2 Structure of multi-level combinatorial test
核電安全級應用軟件邏輯結構較復雜,使用分級組合測試前,必須找到系統的主干邏輯,在此基礎上再劃分次級系統。雖然核電安全級系統輸入信號眾多,但這些信號往往控制一個或幾個執行機構,邏輯結構逐漸收斂,所以大部分系統能夠找到其主干邏輯。
例如,以目前國內某二代改進型壓水堆停堆保護的典型邏輯為例,“中間量程中子通量高時,產生停堆信號”,其主干邏輯是“P10不存在,或沒有手動閉鎖信號時,二選一表決邏輯產生緊急停堆信號”。按照功能需求,將P10、手動閉鎖信號、二選一表決邏輯分別劃分為3個次級系統。見圖3,圖中3個數字分別代表:①實現帶降級“二取一”功能;②產生P10信號;③產生手動閉鎖信號(注:允許信號P—在保護系統中需要設置一些允許功能,在一定條件下自動允許或抑制(閉鎖)某些保護功能,或允許操縱員手動閉鎖某些保護信號或禁止某些保護通道的動作;P10—判斷功率量程中子通量測量值是否低于定值[13])。

圖3 CPR1000中間量程中子通量高停堆邏輯Fig.3 Trip logic of CPR1000 high neutron flux intermediate range
次級系統①為“二取一”邏輯,由于帶有降級功能,不能單純運用組合測試,否則生成的用例不能保證覆蓋所有降級功能,見表3.為了保證測試用例完全覆蓋“降級功能”,采用人工選取與組合測試相結合的方法生成次級系統①的測試用例。

表3 帶降級邏輯的“二取一”功能需求Tab.3 Requirement specifications of 1/2with degradation
這里介紹的方法是將旁通信號(F1、F2)與表決信號(A、B)分別討論。旁通信號的所有組合形式見表4.表決信號采用兩兩組合覆蓋,見表5.完成之后,將每種降級類型分別與表決信號組合,最終形成次級系統①的測試用例子集,見表6.降級類型Ⅱ有兩種旁通信號組合,用例子集中至少選用其中一種組合形式。
鑒于P10信號的重要性與邏輯結構的復雜性,需要單獨進行測試。然而,P10與“中間量程中子通量高,保護停堆功能”有重要交互接口,故作為樁函數出現在單元測試用例中,值域范圍{0,1}。

表4 旁通信號組合Tab.4 By-pass signal combination

表5 表決信號組合(兩兩組合覆蓋)Tab.5 Voting signal combination(pairwise covering)

表6 次級系統①測試用例子集Tab.6 Test cases of sub-system ①
次級系統③的功能是產生手動閉鎖信號,邏輯中沒有涉及典型工藝,不需要再次分級或采用其他輔助方法生成測試用例,可直接選擇pairwise covering,或者3-way covering以達到更高的測試強度。表7為采用pairwise covering生成的測試用例子集,達到任意兩個輸入變量的值域組合全部覆蓋。

表7 次級系統③測試用例子集Tab.7 Test cases of sub-system ③
①、②、③三個次級系統的測試用例子集運用組合測試的方式生成覆蓋矩陣,得到最終的單元測試用例。當測試強度為pairwise covering,生成混合覆蓋矩陣 MCA(48;2,3,12,2,4),見表 8.如果測試強度為3-way covering,則生成混合覆蓋矩陣MCA(96;3,3,12,2,4)。
“V&V Smart”工具可一次性完成以上步驟。輸入每個次級模塊的輸入變量后,直接輸出最終單元測試用例。軟件操作界面如圖4.除變強度組合測試外,此軟件同時適用于非經典組合測試,如:種子組合[14],參數之間的限制[15]等。

圖4 V&V Smart工具Fig.4 V&V Smart tool
分級組合測試算法的優勢主要有3點:
(1)減少測試用例數量。如果采用窮舉法,本文中的測試單元將生成256(28)個測試用例。如果使用分級組合測試,見表8,只生成了48個測試用例,減少用例81.25%。同時,覆蓋了表4中的3種降級類型、表5中表決信號的4種組合方式與表7中兩兩信號之間的全部組合,滿足測試需求。
(2)靈活調整測試強度。根據次級模塊在被測單元中的重要性程度,指定不同的測試強度,合理調整測試重點。如,次級系統①加入人工輔助分析,充分覆蓋測試需求;或次級系統③可選擇更高的測試強度。
(3)算法簡單,易于軟件實現。分級組合測試算法原理簡單,可以借助軟件實現計算過程,本文利用自行開發的工具“V&V Smart”自動生成單元測試用例。
針對核電安全級應用軟件輸入變量較多,設計單元測試用例困難特點,研究了被工業界廣泛應用的組合測試方法[5]后,在實際項目背景下提出了分級組合測試的概念。分級組合測試在保證覆蓋測試需求的前提下,不僅可以減少測試用例數量,而且算法簡單,易于軟件實現,為核電應用軟件的單元測試提供了一種可行的實現方法。
未來的研究方向主要包括以下幾個方面:(1)針對核電系統的特點,選擇適合項目的組合測試用例生成算法,例如貪心算法[16]、元啟發式搜索方法[17]、完備搜索算法等[18]。不同算法對覆蓋率、生成用例速度和數量的要求各不相同,通過實際項目檢驗每種算法的適用性。(2)分級組合測試面對某些核電典型邏輯仍需要人工分析,例如:次級模塊①“帶降級的二取一邏輯”。如果可以統一算法,不再需要測試人員分析,將提高測試效率。(3)組合測試具有較高的錯誤檢出率是通過實驗得出的結論[19],如何建立可靠性模型定量的分析組合測試對核電應用軟件可靠性的影響,是一個值得研究的方向。

表8 單元測試用例Tab.8 Component test cases
[1]Software Engineering Standards Committee of the IEEE Computer Society.IEEE Std 1012-2004,IEEE Standard for Software Verification and Validation[S].
[2]Regulatory Guide 1.171,U.S.Nuclear Regulatory Commission[S].
[3]IEC 60880 Nuclear power plants-instrumentation and control systems important to safety-Software aspects for computer-based systems performing category A functions[S].2006.
[4]GODBOLE A P,SKIPPER D E,SUNLEY R A.t-Covering arrays:Upper bounds and Poisson approximations[J].Combinatorics,Probability and Computing,1996,5:105-117.
[5]YAN J,ZHANG J.Combinatorial Testing:Principles and Methods[J].Journal of Software,2009,20(6):1393-1405.
[6]KUHN D R,WALLACE D R,GALLO A M.Software Fault Interactions and Implications for Software Testing[J].IEEE Transactions on Software Engineering,2004,30(6):418-421.
[7]KUHN R,LEI Y,KACKER R.Practical combinatorial testing:Beyond pairwise[J].IT Professional,2008,10(3):19-23.
[8]CHEN C,WANG F T,ZHAO S C.Orthogonal Test and Its Application in Software Test Case Design[J].Computer Applications and Software,2008,25(7):158-160.
[9]CHEN X,GU Q,WANG X P,CHEN D X.Research Advances in Interaction Testing[J].Computer Science,2010,37(3):1-5.
[10]LEE Copeland.A Practitioner's Guide to Software Test Design[M].London:Artech House,2003.
[11]TANG H X,FANG M Y,LIU M,et al.Test Case Generation for Software Based on Orthogonal Experiment Design[J].Computer Engineering and Design,2008,29(14):3673-3676
[12]NIE C H,XU B W,SHI L.A new pairwise covering test data generation algorithm for the system with many 2-level factors[J].Chinese Journal of Computers,2006,29(6):841-848.
[13]廣東核電培訓中心.900MW壓水堆核電站系統與設備[M].北京:原子能出版社,2005.
[14]DALAL S R,JAIN A,KARUNANITHI N,et al.Model-Based testing in practice[C]//the Int'21 Conf on Software Engineering.New York:ACM Press,1999:285-294.
[15]CZERWONKA J.Pairwise testing in real world:Practical extensions to test case generators[C]//Butt D,Gens C,eds.Proc of the 24th Pacific Northwest Software Quality Conf,2006.
[16]COHEN D M,DALAL S R,FREDMAN M L,et al.The AETG system:An approach to testing based on combinatorial design[J].IEEE Trans.on Software Engineering,1997,23(7):437-443.
[17]CZERWONKA J.Pairwise Testing[EB/OL].[2011-9-14].http://www.pairwise.org/
[18]YAN J,ZHANG J.Backtracking algorithms and search heuristics to generate test suites for combinatorial testing[C]//Wong J,ed.Proc.of the IEEE Annual Int’1 Computer Software and Applications Conf(COMPSAC).Los Alamitos:IEEE Press,2006:385-394.
[19]WANG Z Y,XU B W,NIE C H.Survey of Combinatorial Test Generation[J].Journal of Frontiers of Computer Science and Technology,2008,2(6):571-588.