#unit-testing #racket #testcase #test-suite
#модульное тестирование #racket #тестовый набор #набор тестов
Вопрос:
У меня есть следующий пример тестового кода:
;; UNIT TESTS
(define (check-equal?-with-output a b failure-msg)
(display "checking for equality:") (newline)
(display a) (newline)
(display b) (newline)
(check-equal? a b failure-msg))
(define (run-test-newlines a-test-suite)
(for-each
(λ (elem)
(display elem) (newline))
(run-test a-test-suite)))
(define exercise-test
(test-suite
"exercise test"
#:before (λ () (display "before") (newline))
#:after (λ () (display "after") (newline))
(test-case
"test case for reverse using fold right"
(check-equal?-with-output
(reverse-fold-right (list 1 2 3))
(list 3 2 1)
"the procedure reverse-fold-right does not work correctly"))
(test-case
"test case for reverse using fold left"
(check-equal?-with-output
(reverse-fold-left (list 1 2 3))
(list 3 2 1)
"the procedure reverse-fold-left does not work correctly"))
))
(run-test-newlines exercise-test)
Однако, когда запускается набор тестов, он печатает только то, является ли что-то успешным или неудачным, но не сообщения об ошибках, как показано в документации для check-eq?
. Как я могу заставить его печатать это сообщение и в случае сбоя?
Ответ №1:
Если вы используете наборы тестов, они по умолчанию не будут отображать, что с ними не так. Как вы заметили, они будут выводить только сбой, но не причину.
Если вы хотите хороший результат, вы можете (require rackunit/text-ui)
. Это даст вам (run-tests)
функцию, которая принимает имя теста.
Пример кода:
(define-test-suite logging-suite
"Logging test suite"
(test-case
"Test we ignore bad input in the log"
(check equal? (convert-xinput-log
'(
"bad data :O"
"key release 28"
"key release 26"
"key press 45646"
"key release 39"
"key release 28"))
'("t" "e" "r" "t"))))
(run-tests logging-suite)
Это даст результат, подобный следующему:
--------------------
logging-suite > Test we ignore bad input in the log
Test we ignore bad input in the log
FAILURE
name: check
location: tests.rkt:30:4
params: #<procedure:equal?>
'("t" "e" "s" "t")
'("t" "e" "r" "t")
Check failure
--------------------
0 success(es) 1 failure(s) 0 error(s) 1 test(s) run
Надеюсь, это поможет 🙂