ソフトウェアテスト(software testing)とは、コンピューターソフトウェアのバグやプログラミングのミスを発見するための様々な手法やプロセスを指す言葉です。ソフトウェアテストには、コンピューターソフトウェアを実行せずに行う静的テストと、テスト対象のコンピュータプログラムを実行しながら行う動的テストがある。
型チェック(''Type-checking'')は、Wikipediaの抜粋にあるように、実行時またはコンパイル時に行うことができる。コンパイル時に行う場合、コンパイラはソースコードをコンパイルする際にプログラムの型安全性を検証し、プログラムが特定の型安全性プロパティを満たすことを保証する。一般に、静的型チェッカーは、変数が常に同じ型の値を持ち、関数に渡される引数が正しい型を持っていることを単純に検証する。
静的な手法では、開発サイクルの早い段階でバグを発見することができる。これに対し、動的なアプローチでは、プログラムが実行される際に型制約に従うかどうかを検証する。このため、動的型付け言語ではより多くの制約を検証できるはずだが、多くの動的型付け言語では型制約があまり存在しない。Luaは動的型付け言語です。Luaでは、値には型がありますが、変数には型がありません。つまり、変数の値はプログラム実行のある時点では数値であり、別の時点では文字列である可能性があります。
Luaの型システムは、他の多くの言語と比較して非常にシンプルです。演算子の使用時（少なくとも1つが数値でなく、強制的に1つにできない2つの値を加算しようとすると型エラーが発生する）や標準ライブラリの関数呼び出し時（標準ライブラリの関数は正しい型を持っていない引数を拒否して適切なエラーを発生させる）に型チェックが行われる。
Luaには関数の引数の型を指定する機能がないため、関数に渡される引数が適切な型であることを確認するために、type関数を使用すると便利です。これは、プログラム実行中にユーザから与えられた引数が渡されるような関数（例えば、定義済みのLua関数を呼び出す対話型環境）に対して最も有効です。関数に型チェックのコードを追加すると、関数が冗長になり、メンテナンスのオーバーヘッドが増えるためです。
ホワイトボックステスト(white-box testing)とは、ソフトウェアの内部構造に関する知識を用いて、その機能を検証するためのテストケースを作成することを指します。ソフトウェアテストには3つのレベルがありますが、Luaプログラムにとって最も興味深いのはユニットレベルです。なぜなら、Luaプログラムは通常、統合テストやシステムテストが行われるような大きなアプリケーションの一部だからです。
Luaのユニットテストには、複数のフレームワークが用意されています。ユニットレベルでのテストは、ライブラリーに最も適しており、関数に特定の引数を渡すテストケースを作成し、関数が予期せぬ値を返した場合に警告を表示することが一般的です。この場合、新しい機能に対してテストケースを書く必要がありますが、テストが通らなくなるような形で関数の動作が変更された場合、コードに混入したエラーに気づきやすくなるという利点があります。
Luaには複数のユニットテストフレームワークが存在します。そのうちの1つであるbustedは、LuaJITと同様に標準的なLua仮想マシンをサポートし、MoonScriptやTerra（前者はLuaにコンパイルする言語、後者はLuaと相互運用可能な低レベル言語）でも使用することができる。また、Lua用のユニットテストフレームワークであるLuaunitは、完全にLuaで書かれており、依存関係はありません。Shakeは、よりシンプルなテストフレームワークで、当初はKepler Projectに属しており、assertとprint関数を使用していたが、現在は活発に開発されていない。