2015-11-02 2 views
3

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

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

Например, в SWI-Prolog, run_tests/0 выполните все тестовые единицы.

ответ

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 
1

Для автоматизации есть logtalk_tester Сценарий оболочки Bash, включенный в дистрибутив Logtalk, который дает вам одно резюме. Для выполнения всех тестов для всех загруженных объектов, простирающихся 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 предикат этого объекта с использованием, например, решение выше. Многозначный предикат также является динамическим. Таким образом, вы можете утверждать и отклонять свое определение так, чтобы оно было активным только тогда, когда вы хотите запускать все тесты и суммировать результаты.

Btw, полностью разработан и документ решения по линии выше, будет сделать хороший вклад в Logtalk ...

+1

Спасибо, я попробую решение на основе вашего предложения и поделись им как только ОК. – Koryonik

Смежные вопросы