Статьи

Тестирование вашего плагина с несколькими версиями игры

Итак, вы написали плагин для Play … вы уверены, что он работает?

Недавно я подарил Deadbolt некоторую любовь, и как часть работы я добавил тестовое приложение для функционального тестирования. Это приложение, которое использует все функции Deadbolt и управляется HTTP-вызовами REST-Assured. Первоначально он был основан на Play 2.3.5, но при этом игнорируются поддерживаемые версии Play с 2.3.1 по 2.3.4. Кроме того, эти трудолюбивые люди из команды Play в Typesafe продолжают выпускать новые версии с полным набором функций.

Кроме того, требуется поддержка Scala 2.10.4 и 2.11.1, поэтому необходимо тестирование кросс-версии Scala.

Очевидно, что тестирование вашего плагина на одной версии Play недостаточно. Кажется, что какая-то непрерывная интеграция может помочь нам здесь …

Опираясь на Трэвис CI

Deadbolt основан на  Travis CI , отличной платформе CI, бесплатной для проектов с открытым исходным кодом. Это запускает тесты и публикует версии снимков в Sonatype. Я не буду вдаваться в подробности, потому что в Cake Solutions уже есть отличное руководство. Вы можете найти руководство здесь: http://www.cakesolutions.net/teamblogs/publishing-artefacts-to-oss-sonatype-nexus-using-sbt-and-travis-ci-here…

Я внес некоторые изменения в скрипт сборки, потому что код плагина не находится на верхнем уровне хранилища; скорее он расположен на один уровень ниже. Репозиторий выглядит так:

deadbolt-2-java
  |-code        # plugin code lives here
  |-test-app    # the functional test application

В результате файл .travis.yml, который определяет сборку, выглядит следующим образом.

language: scala
jdk:
- openjdk6
scala:
- 2.11.1
script:
- cd code
- sbt ++$TRAVIS_SCALA_VERSION +test
- cd ../test-app
- sbt ++$TRAVIS_SCALA_VERSION +test
- cd ../code
- sbt ++$TRAVIS_SCALA_VERSION +publish-local
after_success:
- ! '[[ $TRAVIS_BRANCH == "master" ]] && { sbt +publish; };'
env:
global:
- secure: foo
- secure: bar

Это устанавливает версию Java (люди злятся, когда я не предоставляю Java 6-совместимые версии), и определяет сценарий как процесс сборки. Обратите внимание на  cd команды, используемые для переключения между каталогом плагина и каталогом test-app.

Этот сценарий уже охватывает требование кросс-версии Scala — добавление к команде префикса с +, например  +test, выполнит эту команду для всех версий Scala, определенных в вашем build.sbt. Важно отметить, что хотя в .travis.yml определен только Scala 2.11.1, сам SBT позаботится об установке текущей версии сборки на основе build.sbt.

crossScalaVersions := Seq("2.11.1", "2.10.4")

Тестирование нескольких версий Play

Однако версия Play, используемая тестовым приложением, все еще жестко запрограммирована в 2.3.5 в test-app / project / plugins.sbt.

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.5")

К счастью, файлы .sbt — это не просто файлы конфигурации, а настоящий код. Это означает, что мы можем изменить версию Play в зависимости от свойств среды. Значение по умолчанию 2.3.5 дается, чтобы позволить тестам запускаться локально без необходимости устанавливать версию.

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % System.getProperty("playTestVersion", "2.3.5"))

Наконец, мы обновляем .travis.yml, чтобы воспользоваться этим.

language: scala
jdk:
- openjdk6
scala:
- 2.11.1
script:
- cd code
- sbt ++$TRAVIS_SCALA_VERSION +test
- cd ../test-app
- sbt ++$TRAVIS_SCALA_VERSION -DplayTestVersion=2.3.1 +test
- sbt ++$TRAVIS_SCALA_VERSION -DplayTestVersion=2.3.2 +test
- sbt ++$TRAVIS_SCALA_VERSION -DplayTestVersion=2.3.3 +test
- sbt ++$TRAVIS_SCALA_VERSION -DplayTestVersion=2.3.4 +test
- sbt ++$TRAVIS_SCALA_VERSION -DplayTestVersion=2.3.5 +test
- cd ../code
- sbt ++$TRAVIS_SCALA_VERSION +publish-local
after_success:
- ! '[[ $TRAVIS_BRANCH == "master" ]] && { sbt +publish; };'
env:
global:
- secure: foo
- secure: bar

Это означает, что во время сборки выполняются следующие шаги:

  • sbt ++ $ TRAVIS_SCALA_VERSION + test

    • Запустите тесты плагинов для Scala 2.11.1
    • Запустите тесты плагинов для Scala 2.10.4
  • sbt ++ $ TRAVIS_SCALA_VERSION -DplayTestVersion = 2.3.1 + test

    • Запустите функциональные тесты тестового приложения для Scala 2.11.1 и Play 2.3.1.
    • Запустите функциональные тесты тестового приложения для Scala 2.10.4 и Play 2.3.1.
  • sbt ++ $ TRAVIS_SCALA_VERSION -DplayTestVersion = 2.3.2 + test

    • Запустите функциональные тесты тестового приложения для Scala 2.11.1 и Play 2.3.2.
    • Запустите функциональные тесты тестового приложения для Scala 2.10.4 и Play 2.3.2.
  • sbt ++ $ TRAVIS_SCALA_VERSION -DplayTestVersion = 2.3.3 + test

    • Запустите функциональные тесты тестового приложения для Scala 2.11.1 и Play 2.3.3.
    • Запустите функциональные тесты тестового приложения для Scala 2.10.4 и Play 2.3.3.
  • sbt ++ $ TRAVIS_SCALA_VERSION -DplayTestVersion = 2.3.4 + test

    • Запустите функциональные тесты тестового приложения для Scala 2.11.1 и Play 2.3.4.
    • Запустите функциональные тесты тестового приложения для Scala 2.10.4 и Play 2.3.4.
  • sbt ++ $ TRAVIS_SCALA_VERSION -DplayTestVersion = 2.3.5 + test

    • Запустите функциональные тесты тестового приложения для Scala 2.11.1 и Play 2.3.5.
    • Запустите функциональные тесты тестового приложения для Scala 2.10.4 и Play 2.3.5.

Если все эти шаги пройдены,  after_success будет выполнена ветка сценария сборки. Если какой-либо из этапов завершится неудачно, сборка будет нарушена и снимки не будут опубликованы

Вы можете взглянуть на хранилище, используя этот подход здесь:  https://github.com/schaloner/deadbolt-2-java .

Полученная сборка Travis доступна здесь:  https://travis-ci.org/schaloner/deadbolt-2-java .