2011-01-30 3 views
14

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

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

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

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

+2

я бы, вероятно, склоняюсь к мавена на Leiningen –

+2

вы можете легко настроить Maven для этого .. начать с [это] (http://stackoverflow.com/questions/2574649/testing-clojure-in-maven) вопрос.. – Nevena

ответ

3

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

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

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

2

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

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