Skip to content

Latest commit

 

History

History

test

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

テストスクリプトについて

テストは TAP(Test Anything Protocol)1 を用いて行います.

How to Run

Run make check at the root directory of the project.

概要

Automake の TAP を用いて,自動的にテストを行います.

system_check では,

  • <testname>.lmntest ファイルは,LMNtal のプログラムだけでなく, 実行結果の予想などを含みます.

    • そのままではコンパイルできません.
  • <testname>.lmntest ファイルは, system_check/Makefile.am

    %.il: %.lmntest
      awk -f create_testdata.awk | \        ## Create a test program.
      $(LMNC) --stdin-lmn $(LMNCFLAGS) >$@  ## Compile with a compiler.

    によって,

    1. create_testdata.awk スクリプトによって, テストが成功した場合に最終状態のプロセスに ok を含むような, LMNtal プログラムへと作り替えられます.

    2. プログラムに変更があった場合は, コンパイラによってこの LMNtal プログラムは il ファイルにコンパイルされます.

  • check.pl は, 作成された il ファイルを slim に与えて実行し, 結果に ok があるかどうかを検査します.

statespace では,

  • 非決定実行したい LMNtal プログラムをおいておき, そのまま il ファイルにコンパイルします.
  • check.pl が, コンパイルされた il ファイルと,全状態数と,最終状態数を受け取り,状態空間をチェックします.

library_check では,

  • --use-builtin-rule をつけて実行したい LMNtal プログラムをおいておき, 単にそれがそのまま実行されます.
  • 実行結果の検査などは現在行っていません.
    • TODO: system_check を参考に,実行結果の確認まで行うようにする.

Advanced Usage

それぞれのディレクトリの中のテストのみ実行する.

  • library_check などのディレクトリに入って,make check-TESTS を実行する.

新たなテストを作成する手順

system_check にテストを追加する場合について,解説します.

新たなテストが必要な場合は,

  1. system_check ディレクトリ以下に, 新しくディレクトリ <dirname> を作って,または既存のディレクトリの中に,
    1. <testname>.lmntest ファイル(テストスクリプト)を新たに作成してください.
      • E.g., system_check/testsuite/append/append1.lmntest
        append(c(1,c(2,c(3,n))),c(4,c(5,n)),result), ( append(X,Y,Z), n(X) :- Y=Z ), ( append(X,Y,Z), c(A,X1,X) :- c(A,Z1,Z), append(X1,Y,Z1) ).
        result(c(1,c(2,c(3,c(4,c(5,n))))))
        ok
      • 構成
        1. 1 行目にテストしたい LMNtal プログラム,
        2. 2 行目に LMNtal プログラムの予想される出力,
        3. 3 行目に ok または ng を記述してください.
          • ok ならば, 1 行目の結果が 2 行目と等しいとき,
          • ng ならば, 1 行目の結果が 2 行目と異なるときにテストに成功します.
        4. 4 行目以降には,LMNtal コメント以外は書かないでください.
    2. check.sh (テストを実行するプログラム)を新たに生成, または既存のファイルに変更を加えてください.
      • TAP に従って結果を出力するシェルスクリプトです.
      • E.g., system_check/testsuite/append/check.sh
        #!/bin/sh
        ./check.pl \
            /testsuite/append/append1 \
            /testsuite/append/append2 \
            /testsuite/append/append3 \
            /testsuite/append/append4
      • check.sh ファイルでは, ./check.pl を呼び出し, その引数として, テストしたい <testname>.lmntest ファイルのパス (e.g., /testsuite/append/append1.lmntest) から .lmntest を除いたもの (e.g., /testsuite/append/append1) を全て与えてください.
  2. system_check/Makefile.am
    1. TESTS 変数に, 追加した check.sh スクリプトへのパス を追加してください.
      • E.g., TESTS = testsuite/<dirname>/check.sh
    2. check_DATA 変数に, 追加した <testname>.lmntest ファイルへのパス を追加してください.
      • E.g., check_DATA = testsuite/<dirname>/<testname>.lmntest

オプションの指定

Compiler option は <testdir>/Makefile.am で, LMNCFLAGS で指定している.

Runtime option は, <testdir>/check.pl で, slim_CHECK_OPTIONS 環境変数を読み込んで指定している.

  • E.g., system_check/check.pl

    $options = $ENV{slim_CHECK_OPTIONS};
  • 例えば,--history-management を用いながらテストしたい場合は,

    export slim_CHECK_OPTIONS="--history-management"

    してから make check する.

Directory Structure

system_check/testsuite

  1. append
    • Appending a list to a list.
  2. basic
    • 簡単な LMNtal プログラム
  3. count
    • ???
  4. cslmntal
    • Test some CSLMNtal programs. E.g., Skiplists.
  5. guard_float
    • ???
  6. guard_ground
    • ???
  7. guard_ground_multi
    • ???
  8. guard_int
    • ???
  9. guard_string
    • ???
  10. guard_unary
    • ???
  11. hyperlink
    • ???
  12. mem_name
    • ???
  13. miscellaneous
    • ???
  14. proccxt
    • ???
  15. proccxt_free
    • ???
  16. proxyatom
    • ???
  17. rulecxt
    • ???
  18. simpagation
    • ???
  19. unification
    • ???
  20. uniq
    • ???

library_check/testsuite

  1. integer
    • ???
  2. set
    • Test set module.
  3. statespace
    • ???

statespace/testsuite

  1. advanced
    • ???
  2. basic
    • ???
  3. hyperlink
    • Test hyperlinks

歴史的経緯

元々のテストスクリプトは LMNtal 処理系用のテストスクリプトを流用したもので, 以下のような欠点がありました.

  • テストが走るたびに lmn ファイルをコンパイルする
  • テストの結果如何にかかわらず PASS: 1 のみを表示する
  • ~.log にテスト結果が出力される

1回のテストに5分程度かかるため, 自動テストの利点があまり発揮できていませんでした.

そこで, Automake の TAP を用いてよりテストの利便性を高めました.

  • コンパイルを毎回しなくとも良いように, テストケースごとにファイルに分け, make によって監視しています.

Footnotes

  1. https://www.gnu.org/software/automake/manual/html_node/Using-the-TAP-test-protocol.html