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

时间:2015-11-02 10:16:13

标签: swi-prolog logtalk

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

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

例如,在SWI-Prolog中,run_tests/0运行所有测试单元。

2 个答案:

答案 0 :(得分:1)

对于自动化,Logtalk发行版中包含logtalk_tester Bash shell脚本,可为您提供单个摘要。要为扩展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谓词添加public func allSubclassesOf(baseClass: AnyClass) -> [AnyClass] 谓词。上面的解决方案。多文件谓词也是动态的。因此,您可以断言和撤消其定义,以便只有在您想要运行所有测试并汇总结果时它才会处于活动状态。

顺便说一下,上面提到的一个完全开发的文档解决方案将对Logtalk做出很好的贡献...

答案 1 :(得分: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