Swi prolog Logtalk:运行所有测试套件的最佳方式是什么?

Swi prolog Logtalk:运行所有测试套件的最佳方式是什么?,swi-prolog,logtalk,Swi Prolog,Logtalk,在Logtalk代码示例中,每个示例都提供了自己的测试套件,可以在“独立”模式下运行(一次一个测试套件) 但是,正如标题所说,我对一次测试所有测试套件(所有加载的对象在我的应用程序中继承lgtunit)的最佳方法感兴趣,并且在最后有一个所有测试执行的摘要(总通过/跳过/失败) 例如,在SWI Prolog中,run\u tests/0运行所有测试单元。对于自动化,logtalk发行版中包含了一个logtalk\u testerBash shell脚本,它为您提供了一个摘要。对于扩展lgtunit

在Logtalk代码示例中,每个示例都提供了自己的测试套件,可以在“独立”模式下运行(一次一个测试套件)

但是,正如标题所说,我对一次测试所有测试套件(所有加载的对象在我的应用程序中继承
lgtunit
)的最佳方法感兴趣,并且在最后有一个所有测试执行的摘要(总通过/跳过/失败)


例如,在SWI Prolog中,
run\u tests/0
运行所有测试单元。

对于自动化,logtalk发行版中包含了一个
logtalk\u tester
Bash shell脚本,它为您提供了一个摘要。对于扩展
lgtunit
的所有加载的对象运行所有测试,部分解决方案可能是一个目标,例如:

?- forall(extends_object(TestObject, lgtunit), TestObject::run).
但这不会给你一个总结。解决方案是定义一个summary对象,该对象定义
logtalk::message\u hook/4
hook谓词来截取和收集所有相关信息,然后对其进行汇总。您可以检查
lgtunit/lgtunit\u messages.lgt
文件中的消息术语。您要截取的是
测试\u结果\u摘要(总计、跳过、通过、失败、注意)
。比如:

:- 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做出很好的贡献…

这里是运行所有已注册测试套件的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

谢谢,我将根据您的建议尝试解决方案,并在确定后与您分享。