Logtalk: как лучше всего запустить все тестовые наборы?

В примерах кода Logtalk каждый пример предоставляет свой собственный набор тестов, который можно запустить в "автономном" режиме (один набор тестов одновременно).

Но, как говорится в заголовке, меня интересуют лучшие подходы к тестированию всех наборов тестов (все загруженные объекты наследуются lgtunit в моем приложении) сразу, и иметь одну единственную сводку всех выполненных тестов в конце (всего пройдено / пропущено / не выполнено).

Например, в SWI-Prolog, run_tests/0 запустить все тестовые блоки

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

Для автоматизации есть logtalk_tester Скрипт оболочки Bash, включенный в дистрибутив Logtalk, который дает вам единую сводку. Для запуска всех тестов для всех загруженных объектов, расширяющих lgtunitЧастичное решение может быть целью, такой как:

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

Но это не даст вам ни одного резюме. Решение состоит в том, чтобы определить итоговый объект, определяющий logtalk::message_hook/4 Предикат Hook перехватывает и собирает всю необходимую информацию, а затем суммирует ее. Вы можете проверить условия сообщения в 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...

Другие вопросы по тегам