【问题标题】:Logtalk : what is the best way to run all test suites?Logtalk:运行所有测试套件的最佳方式是什么?
【发布时间】:2024-01-02 15:43:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: swi-prolog logtalk


    【解决方案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 谓词。上面的解决方案。多文件谓词也是动态的。因此,您可以断言和收回其定义,以便它仅在您想要运行所有测试并汇总结果时才处于活动状态。

    顺便说一句,按照上面的思路,一个完全开发和记录的解决方案将对 Logtalk 做出很好的贡献......

    【讨论】:

    • 谢谢,我会根据您的建议尝试解决方案,并在确定后分享。
    【解决方案2】:

    这是运行所有已注册测试套件的 runner 对象的第一个实现: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
    

    【讨论】:

      最近更新 更多