Lua 程式設計/附錄:軟體測試
術語軟體測試是指用於發現計算機軟體中的錯誤和程式設計錯誤的一系列方法和流程。 軟體測試可以靜態進行,在這種情況下稱為靜態測試,無需執行計算機軟體,也可以動態進行,在這種情況下稱為動態測試,在被測試的計算機程式執行時進行。
在程式語言中,型別系統是用來給各種構造,例如變數、表示式、函式 或 模組,一個計算機程式是由這些構造組成的,分配一個稱為型別 的屬性的一組規則。 型別系統的主要目的是透過定義計算機程式的不同部分之間的介面,然後檢查這些部分是否以一致的方式連線,從而減少計算機程式中的錯誤。 這種檢查可以在靜態(在編譯時)或動態(在執行時)進行,也可以作為靜態和動態檢查的組合進行。 型別系統還有其他目的,例如,使某些編譯器最佳化成為可能,允許多重分派,提供一種形式的文件等。—維基百科, 型別系統
正如維基百科摘錄所說,型別檢查可以在執行時或編譯時進行。 如果它是在編譯時進行的,則編譯器在編譯原始碼時將驗證程式的型別安全性,並保證程式滿足某些型別安全性屬性 - 通常,靜態型別檢查器只會驗證變數始終具有相同型別的變數,並且傳遞給函式的引數將具有正確的型別。
靜態方法允許在開發週期的早期發現錯誤。 相反,動態方法包括在程式執行時驗證程式是否遵循型別約束。 雖然這意味著動態型別檢查器應該能夠驗證更多約束,但大多數動態型別語言並沒有很多型別約束。 Lua 是一種動態型別語言:在 Lua 中,值具有型別,但變數沒有。 這意味著變數的值在程式執行的某個點可能是一個數字,而在另一個點可能是一個字串。
與大多數其他語言相比,Lua 的型別系統非常簡單。 它在使用運算子時執行型別檢查(例如,嘗試新增兩個值,其中至少一個不是數字,也不能強制轉換為數字,將引發型別錯誤),以及在呼叫標準庫函式時(標準庫函式拒絕不具有正確型別的引數,並引發相應的錯誤)。
由於 Lua 沒有用於為函式引數指定型別的功能,因此type 函式可以用於驗證傳遞給函式的引數是否為適當的型別。 這對於將由使用者在程式執行時提供的引數傳遞給函式的函式(例如,在用於呼叫預定義 Lua 函式的互動式環境中)最為有用,因為在函式中新增型別檢查程式碼會使它們更冗長,並增加維護開銷。
術語白盒測試是指使用對軟體內部工作原理的瞭解來建立測試用例以驗證其功能的做法。 它在三個級別的軟體測試中都很重要,但對於 Lua 程式來說,最有趣的是單元級別,因為 Lua 程式通常是一個更大應用程式的一部分,其中將進行整合和系統測試。
Lua 中有多個框架可用於單元測試。 單元級別的測試最適合庫,因為它通常包括編寫測試用例,這些測試用例將特定引數傳遞給函式,並在函式返回意外值時提供警告。 這需要為新功能編寫測試用例,但它也有助於在程式碼中引入的錯誤更容易被注意到,當它們以修改函式行為的方式修改函式行為時,這些錯誤會導致測試不再透過。
Lua 中有多個單元測試框架。 其中之一,busted,支援標準 Lua 虛擬機器以及 LuaJIT,也可以與 MoonScript 和 Terra 一起使用,前者是一種編譯成 Lua 的語言,後者是一種與 Lua 可互操作的低階語言。 Lua 的另一個單元測試框架 Luaunit 完全用 Lua 編寫,沒有依賴項。 Shake 是一個更簡單的測試框架,最初是 Kepler Project 的一部分,它使用assert 和print 函式,但不再積極開發。
lua-users wiki 是一個查詢有關 Lua 的資訊的好資源,它提供了與軟體測試相關的以下材料。 其中一些頁面包括指向其他頁面或可以用於各種任務的專案的連結。