コンテンツにスキップ

Lua/付録:ソフトウェアのテスト

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Lua

ソフトウェアテスト(software testing)とは、コンピューターソフトウェアのバグやプログラミングのミスを発見するための様々な手法やプロセスを指す言葉です。ソフトウェアテストには、コンピューターソフトウェアを実行せずに行う静的テストと、テスト対象のコンピュータプログラムを実行しながら行う動的テストがある。

型チェック

[編集]
プログラミング言語において、コンピュータープログラムが構成する変数、式、関数、モジュールなどの様々な構成要素に、型と呼ばれる性質を割り当てる規則の集合体が型システムである。型システムの主な目的は、コンピュータープログラムの異なる部分間のインタフェースを定義し、その部分が一貫した方法で接続されているかどうかをチェックすることによって、コンピュータープログラムのバグを減らすことである。このチェックは、静的(コンパイル時)、動的(実行時)、あるいは静的チェックと動的チェックの組合わせで行われることがある。型システムには、コンパイラの最適化を可能にする、多重ディスパッチを可能にする、文書化を可能にする、など他の目的もある。
—Wikipedia, Type system

型チェック(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に属しており、assertprint関数を使用していたが、現在は活発に開発されていない。


参考文献

[編集]

Luaに関する情報を探すのに最適なリソースであるlua-users wikiでは、ソフトウェアテストに関連する以下のような資料を提供しています。これらのページの中には、様々なタスクに役立つ他のページやプロジェクトへのリンクで構成されているものもあります。