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!
Другие вопросы по тегам