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 的信息的好资源,它提供了与软件测试相关的以下材料。 其中一些页面包括指向其他页面或可以用于各种任务的项目的链接。