JUnit и Clojure модульное тестирование

Я создаю библиотеку, содержащую как Clojure, так и код Java, и хотел бы иметь возможность запускать один тестовый пакет JUnit по всей базе кода. Кажется, что это должно быть возможно, так как они оба работают на JVM, и есть хороший Clojure/Java interop.

Однако в настоящее время код Clojure кажется предпочтительным для модульного тестирования, выполненного с помощью clojure.test API, с помощью "(run-all-tests)" и друзей.

Есть ли хороший способ обернуть эти теги Clojure в какой-то оболочке, чтобы их можно было автоматически вызывать из JUnit?

(когда я говорю автоматически, я имею в виду, не прибегая к ручному решению написания тестового примера JUnit для обертывания и вызова каждого тестового примера Clojure отдельно:-))

Ответ 1

Проще всего было бы позвонить run-all-tests из одного теста JUnit. Вы можете захватить вывод и посмотреть на последнюю строку, которая указывает количество проходов/сбоев/ошибок. Если вы видите ошибку или ошибку, вы можете сделать сбой теста JUnit.

Однако, если вы хотите взаимодействовать с каждым тестом Clojure, вам придется реализовать аналогичную функциональность с тем, что найдено в clojure.test. То есть для каждого значения в каждом пространстве имен найдите функцию, сохраненную в метазначении :test. Это значение является вашей тестовой функцией.

Строки 661-686 test.clj дают хороший обзор того, как тесты хранятся и затем выполняются в clojure.

Ответ 2

В настоящее время нет интеграции JUnit, о которой я знаю. Помимо вызова run-all-тестов из одного теста JUnit, предложенного @psyllo, вы можете построить более полную интеграцию следующим образом:

  • Создайте функцию, которая генерирует экземпляр junit.framework.Test для каждого метода тестирования, определенного в clojure. Посмотрите clojure.test/test-ns на то, как найти все методы тестирования.
  • Сделайте экземпляр junit.framework.TestSuite, который добавляет все те сгенерированные тесты для определенного ns и AOT, компилирует класс этого класса.
  • Вы можете вызвать класс класса из java/junit.