專利名稱:一種使用多函數契約測試JavaScript函數正確性的方法
技術領域:
本發明屬于計算機軟件測試領域,特別是涉及ー種JavaScript函數正確性的測試設計、實現和運行方法。
背景技術:
JavaScript語言是一種廣泛應用于互聯網應用程序的腳本語言,JavaScript語言具有很好的表達能力和靈活性,使用JavaScript語言可以提高軟件系統的開發效率和開發速度,提高軟件系統的可讀性和可重用性。函數是(function)是JavaScript語言的第一類對象,JavaScript程序由ー組函數組成,如果能夠測試JavaScript函數自身的正確性和JavaScript函數組合的正確性,就 可以有效的測試JavaScript程序的正確性。JavaScript語言支持動態類型(dynamical Iy typed)和隱式類型轉換(impliedtype conversion),這兩個語法特征使得JavaScript函數的相關變量在運行時類型和行為不確定,影響JavaScript函數自身的正確性和函數組合的正確性。現有的函數測試方法基于單ー的函數契約,只能規約和測試類型確定的函數上下文,不能匹配JavaScript語言的動態類型和隱式類型轉換的語法特征,無法有效測試JavaScript函數的正確性。
發明內容
本發明的目的之ー是通過設計多個函數契約,匹配目標函數的相關變量在運行時的可能類型和可能值,解決由于動態類型和隱式類型轉換引起的JavaScript函數測試困難問題。本發明的目的之一是通過JavaScript語言的運行時求解函數(eval)將提出的多個函數契約轉換為普通的JavaScript程序代碼,在不改變現有JavaScript語言語法的前提下,生成相應的測試代碼。本發明的目的之ー是使用JavaScript語言的面向方面擴展庫jQuery-AOP監控目標JavaScript函數的運行,生成JavaScript函數的運行時監控代碼。本發明的目的之ー針對提出的函數契約設計、提出的函數契約測試代碼和提出的運行時監控代碼,提出ー個函數契約檢測算法,當目標JavaScript函數被調用時,按照一定的步驟對目標JavaScript函數的正確性進行測試。為了實現上述目的,本發明所采取的技術方案是ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于包括以下步驟步驟SOl :根據目標JavaScript函數的函數上下文中相關變量在運行時的可能類型和可能值設計多個函數契約,對于目標函數的類型正確性和行為正確性分別進行規約,步驟S02 :將步驟SOl設計得到的多個函數契約轉換為普通的JavaScript對象數組,并生成對目標函數運行時的監控代碼,步驟S03 :當目標JavaScript函數被調用時,運行時監控代碼根據提出的契約檢測算法測試目標JavaScript函數的正確性,在發現特定類型的錯誤時拋出相應的異常。前述ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟SOl目標函數設計多個函數契約的具體步驟為每ー個函數契約包含函數名稱、類型約束和行為約束三個組成部分,類型約束對目標函數的相關變量的可能類型進行規約,行為約束對目標函數的可能行為進行規約,類型約束和行為約束必須是匹配的。前述ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于所述類型約束包含兩個部分類型約束的前置條件和類型約束的后置條件,類型約束的前置條件對目標函數執行前的相關變量的可能類型進行規約,類型約束的后置條件對目標函數執行后的相關變量的可能類型進行規約。
前述ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于行為約束包括兩個部分行為約束的前置條件和行為約束的后置條件,行為約束的前置條件對目標函數執行前的程序狀態進行規約,行為約束的后置條件對目標函數執行后的程序狀態進行規約。前述ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟S02生成對目標函數運行時的監控代碼的具體步驟為步驟i01 :根據SOl步驟中的函數契約設計生成ー個JavaScript對象-函數契
約對象,函數契約對象由三個部分組成函數名稱、類型約束數組和行為約束數組,類型約束數組包含這個函數的所有類型約束,行為約束數組包含這個函數的所有行為約束,類型約束數組和行為約束數組是一一對應的;步驟i02 :定義ー個函數契約對象數組,將步驟iOl生成的所有函數契約對象放在這個數組中;步驟i03 :逐個訪問步驟i02生成的函數契約對象數組,解析目標函數的類型約束和行為約束,通過字符串連接運算生成一個字符串,字符串是目標函數的監控代碼的字符串形式;步驟i04 :利用JavaScript語言運行時求解函數eval ()求解步驟i03生成的字符串,生成目標JavaScript函數的運行時監控代碼,這些運行時監控代碼使用JavaScript語言的面向方面擴展庫jQuery-AOP監控目標函數的運行。前述ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟S03測試目標JavaScript函數的正確性具體步驟為步驟pOl :從函數契約對象數組中取出目標函數的函數契約對象,繼續執行步驟p02 ;步驟P02 :順序訪問函數契約對象的類型約束數組,判斷是否還有類型約束沒有檢測如果不存在,則說明當前函數上下文無法匹配目標函數的任意ー個函數契約,拋出類型異常;如果存在,則從類型約束數組中順序取出下ー個類型約束,繼續執行步驟P03 ;步驟P03 :取出選中類型約束的前置條件,根據函數上下文中相關變量的實際類型,判斷類型約束的前置條件是否滿足如果不滿足,則說明當前函數契約不匹配當前的函數上下文,返回步驟P02 ;如果滿足,繼續執行步驟p04 ;
步驟P04 :根據選中類型約束在類型約束數組中的索引值,取出對應的函數契約對象中的行為約束數組中的行為約束,繼續執行步驟P05 ;步驟p05 :取出選中行為約束中的前置條件,利用JavaScript語言的運行時求解函數evalO檢測行為約束的前置條件是否滿足如果不滿足,則發生行為錯誤,拋出行為異常;如果滿足,則繼續執行步驟P06 ;步驟p06 :執行目標JavaScript函數;步驟P07 :判斷選中函數契約的類型約束的后置條件是否滿足如果不滿足,則發生類型錯誤,拋出類型異常;如果滿足,則進入步驟P08 ; 步驟p08 利用JavaScript語言的運行時求解函數eval ()檢測行為約束的后置條件是否滿足如果不滿足,則發生行為錯誤,拋出行為異常;如果滿足,則目標 JavaScript函數行為正常,判定目標JavaScript函數被正確調用。本發明的有益效果是本發明通過提出函數契約設計、提出函數契約測試代碼和提出運行時監控方法,并結合一個函數契約檢測算法,當目標JavaScript函數被調用時,按照一定的步驟對目標JavaScript函數的正確性進行測試,能夠匹配JavaScript語言的動態類型和隱式類型轉換的語法特征,解決了由于動態類型和隱式類型轉換引起的JavaScript函數測試困難問題。
圖I為本發明提出的使用多函數契約測試JavaScript函數正確性的設計、實現和檢測過程框圖。圖2為本發明提出的將多函數契約設計轉換為JavaScript對象數組,并解析JavaScript對象數組生成目標函數運行時監控代碼的步驟框圖。圖3為本發明提出的運行時函數契約檢測算法步驟,在運行時對JavaScript函數的行為正確性進行檢測的流程框圖。
具體實施例方式下面結合附圖對本發明做進ー步的描述。下面結合圖I說明本發明提出使用多函數契約進行JavaScript函數測試的設計、實現和檢測過程ー種使用多函數契約測試JavaScript函數正確性的方法,其特征在于包括以下步驟步驟SOl :根據目標JavaScript函數的函數上下文中相關變量在運行時的可能類型和可能值設計多個函數契約,對于目標函數的類型正確性和行為正確性分別進行規約,步驟S02 :將步驟SOl設計得到的多個函數契約轉換為普通的JavaScript對象數組,并生成對目標函數運行時的監控代碼,步驟S03 :當目標JavaScript函數被調用時,運行時監控代碼根據提出的契約檢測算法測試目標JavaScript函數的正確性,在發現特定類型的錯誤時拋出相應的異常。步驟S02中為了規約目標JavaScript函數的類型正確性和相應的行為正確性,為每ー個目標函數設計多個函數契約,每ー個函數契約包含函數名稱、類型約束和行為約束三個組成部分,類型約束對目標函數的相關變量的可能類型進行規約,行為約束對目標函數的可能行為進行規約,類型約束和行為約束必須是匹配的。類型約束包含兩個部分類型約束的前置條件(pre-condition)和類型約束的后置條件(post-condition),類型約束的前置條件對目標函數執行前的相關變量的可能類型進行規約,類型約束的后置條件對目標函數執行后的相關變量的可能類型進行規約;行為約束也包括兩個部分行為約束的前置條件和行為約束的后置條件,行為約束的前置條件對目標函數執行前的程序狀態進行規約,行為約束的后置條件對目標函數執行后的程序狀態進行規約。下面結合圖2說明如何將目標函數的多個函數契約設計轉換為JavaScript對象數組,并生成目標函數的運行時監控代碼。步驟iOl :根據
函數契約設計生成ー個JavaScript對象-函數契約對
象,函數契約對象由三個部分組成函數名稱、類型約束數組和行為約束數組,類型約束數組包含這個函數的所有類型約束,行為約束數組包含這個函數的所有行為約束,類型約束 數組和行為約束數組是一一對應的。步驟i02 :定義ー個函數契約對象數組,將步驟iOl生成的所有函數契約對象放在這個數組中,定義ー個長度可變的數組,具體語句如下var moduleContracts=newArray (),步驟i03 :逐個訪問步驟i02生成的函數契約對象數組,解析目標函數的類型約束和行為約束,通過字符串連接運算生成一個字符串,字符串是目標函數的監控代碼的字符串形式,字符串格式按照jQuery-AOP監控JavaScript函數的around語法形式,具體連接過程如下
權利要求
1.一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于包括以下步驟 步驟SOl :根據目標JavaScript函數的函數上下文中相關變量在運行時的可能類型和可能值設計多個函數契約,對于目標函數的類型正確性和行為正確性分別進行規約, 步驟S02 :將步驟SOl設計得到的多個函數契約轉換為普通的JavaScript對象數組,并生成對目標函數運行時的監控代碼, 步驟S03 :當目標JavaScript函數被調用時,運行時監控代碼根據提出的契約檢測算法測試目標JavaScript函數的正確性,在發現特定類型的錯誤時拋出相應的異常。
2.根據權利要求I所述一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟SOl目標函數設計多個函數契約的具體步驟為每一個函數契約包含函數名稱、類型約束和行為約束三個組成部分,類型約束對目標函數的相關變量的可能類型進行規約,行為約束對目標函數的可能行為進行規約,類型約束和行為約束必須是匹配的。
3.根據權利要求2所述一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于所述類型約束包含兩個部分類型約束的前置條件和類型約束的后置條件,類型約束的前置條件對目標函數執行前的相關變量的可能類型進行規約,類型約束的后置條件對目標函數執行后的相關變量的可能類型進行規約。
4.根據權利要求3所述一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于行為約束包括兩個部分行為約束的前置條件和行為約束的后置條件,行為約束的前置條件對目標函數執行前的程序狀態進行規約,行為約束的后置條件對目標函數執行后的程序狀態進行規約。
5.根據權利要求4所述一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟S02生成對目標函數運行時的監控代碼的具體步驟為 步驟i01 :根據SOl步驟中的函數契約設計生成一個JavaScript對象-函數契約對象,函數契約對象由三個部分組成函數名稱、類型約束數組和行為約束數組,類型約束數組包含這個函數的所有類型約束,行為約束數組包含這個函數的所有行為約束,類型約束數組和行為約束數組是一一對應的; 步驟i02 :定義一個函數契約對象數組,將步驟iOl生成的所有函數契約對象放在這個數組中; 步驟i03 :逐個訪問步驟i02生成的函數契約對象數組,解析目標函數的類型約束和行為約束,通過字符串連接運算生成一個字符串,字符串是目標函數的監控代碼的字符串形式; 步驟i04 :利用JavaScript語言運行時求解函數eval ()求解步驟i03生成的字符串,生成目標JavaScript函數的運行時監控代碼,這些運行時監控代碼使用JavaScript語言的面向方面擴展庫jQuery-AOP監控目標函數的運行。
6.根據權利要求5所述一種使用多函數契約測試JavaScript函數正確性的方法,其特征在于步驟S03測試目標JavaScript函數的正確性具體步驟為 步驟p01 :從函數契約對象數組中取出目標函數的函數契約對象,繼續執行步驟p02 ; 步驟p02 :順序訪問函數契約對象的類型約束數組,判斷是否還有類型約束沒有檢測如果不存在,則說明當前函數上下文無法匹配目標函數的任意一個函數契約,拋出類型異常;如果存在,則從類型約束數組中順序取出下一個類型約束,繼續執行步驟P03 ; 步驟P03 :取出選中類型約束的前置條件,根據函數上下文中相關變量的實際類型,判斷類型約束的前置條件是否滿足如果不滿足,則說明當前函數契約不匹配當前的函數上下文,返回步驟P02 ;如果滿足,繼續執行步驟p04 ; 步驟P04:根據選中類型約束在類型約束數組中的索引值,取出對應的函數契約對象中的行為約束數組中的行為約束,繼續執行步驟P05 ; 步驟p05 :取出選中行為約束中的前置條件,利用JavaScript語言的運行時求解函數eval ()檢測行為約束的前置條件是否滿足如果不滿足,則發生行為錯誤,拋出行為異常;如果滿足,則繼續執行步驟P06 ; 步驟p06 :執行目標JavaScript函數; 步驟P07 :判斷選中函數契約的類型約束的后置條件是否滿足如果不滿足,則發生類型錯誤,拋出類型異常;如果滿足,則進入步驟P08 ; 步驟p08 :利用JavaScript語言的運行時求解函數eval ()檢測行為約束的后置條件是否滿足如果不滿足,則發生行為錯誤,拋出行為異常;如果滿足,則目標JavaScript函數行為正常,判定目標JavaScript函數被正確調用。
全文摘要
本發明公開了一種使用多函數契約測試JavaScript函數正確性的方法,包括以下步驟根據目標JavaScript函數上下文中相關變量的運行時可能類型和可能值,設計多個函數契約;將設計完成的多個函數契約轉換為JavaScript對象數組,并生成目標JavaScript函數的運行時監控代碼;當目標JavaScript函數被調用時,運行時監控代碼根據一個契約檢測算法檢測目標JavaScript函數的正確性,在發現特定類型的錯誤時拋出相應的異常。本發明測試方法能夠匹配JavaScript語言的動態類型和隱式類型轉換的語法特征,當目標JavaScript函數被調用時,可以有效測試目標JavaScript函數的正確性。
文檔編號G06F11/36GK102768643SQ20121021605
公開日2012年11月7日 申請日期2012年6月27日 優先權日2012年6月27日
發明者呂嘉, 吳明暉, 金永霞 申請人:河海大學常州校區