asdf: тест-система из Makefile не возвращает код возврата ошибки
Мои юнит-тесты работают нормально, но make test
цель не вернет код ошибки, если тесты не пройдены (echo $?
0) (это происходит при возникновении ошибки lisp).
Это не хорошо для системы CI.
Мое основное определение системы заканчивается in-order-to
:
:in-order-to ((test-op (test-op "mysystem/test"))))
Моя тестовая система имеет perform
один:
:perform (test-op (o s)
(uiop:symbol-call '#:mysestem.test '#:test-all)))
где test-all
это функция, которая запускает тестовые наборы Fiveam с run! 'test-suite
,
Цель make:
test:
# (with proper indentation…)
$(LISP) --non-interactive \
--eval "(asdf:load-asd \""$(ASD_PATH)"\")" \
--eval "(ql:quickload :mysystem/test)" \
--eval "(asdf:test-system \"mysystem\")"
Обратите внимание, что следовать рекомендациям ASDF в
(symbol-call :fiveam #':run! :test-suite)))
ошибки: "Функция: запустить! не определена".
Как нам это сделать?
Спасибо.
2 ответа
Проблема в том, что, как указывает user5747548 , возвращается true независимо от того, что возвращается.
Я использую ров вместо пяти утра, иrove:run
на самом деле возвращаетсяnil
если тесты не пройдены. Поэтому мой обходной путь — вызвать его напрямую (вместо ) и использоватьuiop:quit
чтобы получить правильный код возврата:
sbcl --non-interactive \
--eval '(ql:quickload :mysystem)' \
--eval '(asdf:load-system :rove)' \
--eval '(uiop:quit (if (rove:run "mysystem/tests") 0 1))'
Я решил не пытаться встроить эту логику, потому что большую часть времени использую интерактивно.
Однако я не могу придумать ни одного решения, которое не было бы обходным путем.asdf:test-system
просто проходя мимо чего угодноtest-op
возвраты (или что-то в этом роде) кажутся единственным правильным решением.
Там, кажется, опечатки:
'#:mysestem.test
⇒'#:mysystem.test
#':run!
⇒'#:run!