Emacsはこの良い例です。
Emacs Lispテストはskip-unless
、let-bind
機能検出およびテストフィクスチャを使用して実行します。
場合によっては、前提条件が欠落しているためにテストを実行しても意味がありません。必要なEmacs機能がコンパイルされていない可能性があります。テスト対象の関数は、テストマシンでは使用できない外部バイナリを呼び出す可能性があります。この場合、マクロskip-unless
を使用してテストをスキップできます。
(ert-deftest test-dbus ()
"A test that checks D-BUS functionality."
(skip-unless (featurep 'dbusbind))
...)
テストの実行結果は環境の現在の状態に依存するべきではなく、各テストはその環境をそれが見つかったのと同じ状態のままにしておくべきです。特に、テストはEmacsカスタマイズ変数やフックに依存してはいけません。 Emacsの状態またはEmacsの外部の状態(ファイルシステムなど)に変更を加える必要がある場合、成功したか失敗したかにかかわらず、戻る前にこれらの変更を元に戻す必要があります。
テストは環境に依存するべきではありません。そのような依存関係があると、テストが不安定になったり、特定の状況でのみ発生し、再現が困難な障害につながる可能性があります。もちろん、テスト対象のコードには、その動作に影響する設定がある場合があります。その場合、テストlet-bind
期間中に特定の構成をセットアップするには、そのようなすべての設定変数をテストするのが最善です。また、テストではさまざまな構成を設定し、それぞれでテスト対象のコードを実行できます。
SQLiteも同様です。これがデザインです:
sqlite3_open()→新規または既存のSQLiteデータベースへの接続を開きます。sqlite3のコンストラクター。
sqlite3→データベース接続オブジェクト。sqlite3_open()によって作成され、sqlite3_close()によって破棄されます。
sqlite3_stmt→準備されたステートメントオブジェクト。sqlite3_prepare()によって作成され、sqlite3_finalize()によって破棄されます。
sqlite3_prepare()→SQLテキストをバイトコードにコンパイルし、データベースのクエリまたは更新の作業を行います。sqlite3_stmtのコンストラクター。
sqlite3_bind()→アプリケーションデータを元のSQLのパラメーターに保存します。
sqlite3_step()→sqlite3_stmtを次の結果行または完了まで進めます。
sqlite3_column()→sqlite3_stmtの現在の結果行の列値。
sqlite3_finalize()→sqlite3_stmtのデストラクタ。
sqlite3_exec()→1つ以上のSQLステートメントの文字列に対してsqlite3_prepare()、sqlite3_step()、sqlite3_column()、およびsqlite3_finalize()を実行するラッパー関数。
sqlite3_close()→sqlite3のデストラクタ。
Tokenizer、Parser、およびCode Generatorコンポーネントは、SQLステートメントを処理し、それらを仮想マシン言語またはバイトコードの実行可能プログラムに変換するために使用されます。大まかに言うと、これらの上位3層はsqlite3_prepare_v2()を実装しています。上位3層で生成されたバイトコードは準備されたステートメントです。仮想マシンモジュールは、SQLステートメントのバイトコードを実行します。Bツリーモジュールは、データベースファイルを、順序付けられたキーと対数パフォーマンスを備えた複数のキー/値ストアに編成します。Pagerモジュールは、データベースファイルのページをメモリにロードし、トランザクションを実装および制御し、クラッシュまたは停電後のデータベース破損を防止するジャーナルファイルを作成および維持します。OSインターフェースは、SQLiteを異なるオペレーティングシステムで実行するように適合させるためのルーチンの共通セットを提供する薄い抽象概念です。大まかに言うと、下の4つのレイヤーはsqlite3_step()を実装します。
仮想テーブルは、開いているSQLiteデータベース接続に登録されているオブジェクトです。SQLステートメントの観点から見ると、仮想テーブルオブジェクトは他のテーブルまたはビューのように見えます。しかし、舞台裏では、仮想テーブルのクエリと更新は、データベースファイルの読み取りと書き込みの代わりに、仮想テーブルオブジェクトのコールバックメソッドを呼び出します。
仮想テーブルは、メモリ内のデータ構造を表す場合があります。または、SQLite形式ではないディスク上のデータのビューを表す場合があります。または、アプリケーションが仮想テーブルのコンテンツをオンデマンドで計算する場合があります。
以下に、仮想テーブルの既存および想定される使用例を示します。
全文検索インターフェース
Rツリーを使用した空間インデックス
SQLiteデータベースファイル(dbstat仮想テーブル)のディスクコンテンツをイントロスペクトします
コンマ区切り値(CSV)ファイルの内容を読み書きする
データベーステーブルであるかのように、ホストコンピューターのファイルシステムにアクセスする
Rなどの統計パッケージ内のデータのSQL操作を有効にする
SQLiteは、以下を含むさまざまなテスト手法を使用します。
独自に開発された3つのテストハーネス
展開された構成での100%ブランチテストカバレッジ
何百万ものテストケース
メモリ不足テスト
I / Oエラーテスト
クラッシュおよび電力損失テスト
ファズテスト
境界値テスト
無効化された最適化テスト
回帰テスト
不正なデータベーステスト
assert()およびランタイムチェックの広範な使用
バルグラインド分析
未定義の動作チェック
チェックリスト
参照資料