Набор тестов Racket для печати сообщений об ошибках тестового набора

#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
  

Надеюсь, это поможет 🙂