Обычно я использую sbt testOnly "Unit.*", но это работает в контексте проекта. Я не могу найти документацию, показывающую, как это сделать, когда уже есть банка.
Задачи семейства test
в SBT (с testOnly
в качестве примера) работают с задачей compile
, которая возвращает список скомпилированных файлов через экземпляр sbt.inc.Analysis
. Я не мог понять, как изменить его и внедрить измененный экземпляр Analysis в testOnly
, чтобы он знал, что тест, который я собираюсь запустить, существует.
Я предлагаю другое решение - трюк.
Упакуйте классы тестов в банку с задачей test:package
следующим образом:
[test-lib]> test:package
[info] Updating {file:/Users/jacek/sandbox/so/test-lib/}test-lib...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/so/test-lib/target/scala-2.10/test-classes...
[info] Packaging /Users/jacek/sandbox/so/test-lib/target/scala-2.10/test-lib_2.10-0.1-SNAPSHOT-tests.jar ...
[info] Done packaging.
[success] Total time: 9 s, completed Mar 4, 2014 11:34:13 PM
Когда у вас есть тестовая банка, вы можете выполнить тестовую среду в командной строке без SBT (я предполагаю, что вы используете ScalaTest с учетом scalest, но я буду использовать Specs2). Прочтите документацию по тестовой среде, чтобы узнать, как это сделать, а для Specs2 это specs2.run
, как описано в Консольный вывод.
Выполнение тестов из тестовой банки требует определения правильного ПУТИ К КЛАССУ, который может быть или не быть легко правильным. Вот где SBT может быть очень полезен — для управления зависимостями и, следовательно, CLASSPATH.
Создайте еще один проект SBT и сохраните тестовый файл jar в подкаталоге lib
, чтобы он был в CLASSPATH (как описано в Неуправляемые зависимости).
Зависимости в lib идут по всем путям к классам (для компиляции, тестирования, запуска и консоли).
Добавьте пример build.sbt
, в котором вы определяете свою тестовую среду как зависимость от проекта. Для Specs2 это выглядит следующим образом (я использовал конфигурацию по умолчанию, как описано на домашней странице Specs2):
libraryDependencies += "org.specs2" %% "specs2" % "2.3.8" % "test"
scalacOptions in Test ++= Seq("-Yrangepos")
Хитрость заключается в том, чтобы выполнить основной класс тестовой среды, например. specs2.run
для Specs2, как если бы класс выполнялся в командной строке. SBT помогает с test:runMain
.
[my-another-project]> test:runMain specs2.run HelloWorldSpec
[info] Running specs2.run HelloWorldSpec
HelloWorldSpec
The 'Hello world' string should
+ contain 11 characters
+ start with 'Hello'
+ end with 'world'
Total for specification HelloWorldSpec
Finished in 62 ms
3 examples, 0 failure, 0 error
Exception: sbt.TrapExitSecurityException thrown from the UncaughtExceptionHandler in thread "run-main-0"
[success] Total time: 5 s, completed Mar 4, 2014 11:15:14 PM
Не беспокойтесь об этом Exception
, поскольку он исходит от SBT, который перехватывает exit
из Specs2 (после выполнения теста), поэтому SBT остается в рабочем состоянии.
person
Jacek Laskowski
schedule
02.03.2014
dist
jar-файлы, но ссылка @DaveSwartz может помочь в этом. - person Rob Starling   schedule 03.03.2014sbt test:dist
? Разве это не включает тесты в (тестовой) дистрибутивной банке? - person Jacek Laskowski   schedule 03.03.2014