3

Logtalk コード例では、各例は「スタンドアロン」モードで実行可能な独自のテスト スイートを提供します (一度に 1 つのテスト スイート)。

しかし、タイトルが示すように、すべてのテスト スイート(アプリで継承されるすべてのロード済みオブジェクトlgtunit) を一度にテストし、最後にすべてのテスト実行の 1 つの要約 (合格/スキップ/スキップの合計) を持つ最善のアプローチに興味があります。失敗した)。

たとえば、SWI-Prolog では、run_tests/0すべてのテスト ユニットを実行します。

4

2 に答える 2

1

以下は、登録されたすべてのテスト スイートを実行するためのランナー オブジェクトの最初の実装です: https://github.com/koryonik/logtalk-experiments/tree/master/test-runner

使い方は簡単です:

読み込まれたすべての lgtunit テスト スイートを実行するだけです。

test_runner::autoregister_tests, % register all loaded lgtunit objects
test_runner::run_tests.

または、実行するテスト スイートを手動で登録します。

test_runner::register_tests(test_suite_obj1),
test_runner::register_tests(test_suite_obj2),
test_runner::run_tests. %run the 2 test suites
于 2016-02-20T19:55:35.337 に答える
1

自動化のためにlogtalk_tester、単一の要約を提供する Logtalk ディストリビューションに含まれる Bash シェル スクリプトがあります。を拡張するすべてのロード済みオブジェクトに対してすべてのテストを実行するlgtunit場合、部分的な解決策は次のような目標になる可能性があります。

?- forall(extends_object(TestObject, lgtunit), TestObject::run).

しかし、これは単一の要約を提供しません。logtalk::message_hook/4解決策は、すべての関連情報をインターセプトして収集し、それを要約するフック述語を定義する要約オブジェクトを定義することです。ファイル内のメッセージ用語を確認できlgtunit/lgtunit_messages.lgtます。傍受したいのは ですtests_results_summary(Total, Skipped, Passed, Failed, Note)。何かのようなもの:

:- object(test_summary).

    :- public(report/0).
    report :-
        % compute totals from result_/4 and report them
        ...

    :- private(result_/4).
    :- dynamic(result_/4).

    :- multifile(logtalk::message_hook/4).
    :- dynamic(logtalk::message_hook/4).
    logtalk::message_hook(tests_results_summary(Total,Skipped,Passed,Failed,_), _, lgtunit, _) :-
        assertz(result_(Total,Skipped,Passed,Failed)).

:- end_object.

run_all/0場合によっては、上記のソリューションなどを使用して、このオブジェクトに述語を追加することもできます。マルチファイル述語も動的です。したがって、すべてのテストを実行して結果を要約する場合にのみアクティブになるように、その定義をアサートおよび撤回できます。

ところで、上記の行に沿って完全に開発され文書化されたソリューションは、Logtalk に素晴らしい貢献をするでしょう...

于 2015-11-02T10:52:56.777 に答える