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...