ScalaTest в sbt: есть ли способ запустить один тест без тегов?

150

Я знаю, что один тест можно запустить, запустив в sbt,

testOnly *class -- -n Tag

Есть ли способ сообщить sbt / scalatest для запуска одного теста без тегов? Например:

testOnly *class -- -X 2

это будет означать «запустить второй тест в классе. Что бы это ни было». У нас есть куча тестов, и никто не удосужился пометить их, так есть ли способ запустить один тест без тега?

Nacht
источник
1
Ваша тема говорит "Scalatest-SBT". Когда sbt дефисен, люди обычно думают о плагине. Но, чтобы уточнить, вы говорите об использовании ScalaTest из современной версии sbt, такой как sbt 0.12, а не joshcough / scalatest-sbt плагин для sbt 0.5.2-p3, написанный 4 года назад. Верный?
Юджин Йокота
Верный. Это старый вопрос, и я с тех пор понял, что нет, это невозможно (насколько я знаю). Я не закрыл его на тот случай, если кому-то действительно удалось найти способ, но мне больше не нужно, чтобы на него отвечали.
Nacht
Об этом есть ветка (с участием как Билла Веннерса, так и Марка Харры) по адресу groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , но решения пока нет
Сет Ти
1
Также есть пример общей поддержки запуска одного теста sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Юджин Йокота
14
Обратите внимание , что если вы работаете из командной строки, вы должны вложить все после того, как sbtв кавычках , напримерsbt "test-only *SingleTestSuite"
Крис Мартин

Ответы:

202

Теперь это поддерживается (начиная с ScalaTest 2.1.3) в интерактивном режиме:

testOnly *MySuite -- -z foo

запускать только тесты, имя которых включает подстроку "foo".

Для точного соответствия вместо подстроки используйте -tвместо -z.

Сет Тису
источник
@SethTisue Можете ли вы опубликовать рабочий пример, который использует -tдля точного соответствия? Я не могу заставить его работать.
rmin
@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (если это поможет вам решить вашу проблему, дайте мне знать, как мне следует обновить мой ответ.)
Сет Тиз
10
Просто чтобы уточнить, если вы запускаете его из командной строки, это должен быть один аргумент: sbt "testOnly * MySuite - -z foo"
Sogartar
2
В случае, если кто-то хочет запустить определенный интеграционный тест (предположительно помещенный под src/it), он должен подготовиться itк testOnly. Например, в командной строке: sbt "it:testOnly *MyIntegrationTestSuite".
лайлайлом
2
Как я могу отфильтровать несколько подстрок? Тесты могут быть сгруппированы в иерархию (WordSpec), а части имени разделены whenи should могут повторяться между тестами. Чтобы выбрать один конкретный тест, мне нужно сказать «имя содержит это И это».
Vituel
98

Я хотел добавить конкретный пример, чтобы сопровождать другие ответы

Вам нужно указать имя класса, который вы хотите протестировать, поэтому, если у вас есть следующий проект (это проект Play):

Play Project

Вы можете протестировать только Loginтесты, выполнив следующую команду из консоли SBT:

test:testOnly *LoginServiceSpec

Если вы запускаете команду вне консоли SBT, вы должны сделать следующее:

sbt "test:testOnly *LoginServiceSpec"
Тайлер
источник
27
Upvote, потому что, по-видимому, необходимы двойные кавычки:sbt "test:testOnly *LoginServiceSpec"
Джейсон Уилер
5
Самый полезный ответ для меня здесь. 👍 Но команды могут быть немного упрощены; в консоли SBT: testOnly *LoginServiceSpecи снаружи:sbt "testOnly *LoginServiceSpec"
Jonik
49

Я не вижу способа выполнить один непомеченный тест в тестовом классе, но я предоставляю свой рабочий процесс, поскольку он кажется полезным для всех, кто сталкивается с этим вопросом.

Из сеанса SBT:

test:testOnly *YourTestClass

(Звездочка - это подстановочный знак, вы можете указать полный путь com.example.specs.YourTestClass.)

Все тесты в этом классе будут выполнены. Предположительно, вас больше всего волнуют неудачные тесты, поэтому исправьте все неудачные реализации и запустите:

test:testQuick

... который будет выполнять только тесты, которые не удалось. (Повтор самой последней выполненной test:testOnlyкоманды будет таким же, как и test:testQuickв этом случае, но если вы разбите свои тестовые методы на соответствующие тестовые классы, вы можете использовать подстановочный знак, чтобы сделатьtest:testQuick более эффективный способ повторного запуска неудачных тестов.)

Обратите внимание, что номенклатура для теста в ScalaTest - это класс теста, а не конкретный метод теста, поэтому выполняются все немаркированные методы.

Если у вас слишком много тестовых методов в тестовом классе, разбейте их на отдельные классы или пометьте их соответствующим образом. (Это может быть сигналом того, что тестируемый класс нарушает принцип единой ответственности и может использовать рефакторинг.)

cfeduke
источник
10
для тех, кто сталкивается с «Тесты не были выполнены»: *YourTestClassдолжно быть имя класса. Не имя файла.
MKatleast3
1
это был testOnly вместо test-only для меня.
Ян Клеменс Стоффреген,
11

Просто для упрощения примера Тайлера.

test:Префикс не нужен.

Итак, согласно его примеру:

В sbtконсоли

testOnly *LoginServiceSpec

И в терминале:

sbt "testOnly *LoginServiceSpec"
PME
источник
0

Вот Scalatest страница на использовании бегуна и расширенное обсуждение вопроса о -tи -zопций .

Этот пост показывает, какие команды работают для тестового файла, который использует FunSpec.

Вот тестовый файл:

package com.github.mrpowers.scalatest.example

import org.scalatest.FunSpec

class CardiBSpec extends FunSpec {

  describe("realName") {

    it("returns her birth name") {
      assert(CardiB.realName() === "Belcalis Almanzar")
    }

  }

  describe("iLike") {

    it("works with a single argument") {
      assert(CardiB.iLike("dollars") === "I like dollars")
    }

    it("works with multiple arguments") {
      assert(CardiB.iLike("dollars", "diamonds") === "I like dollars, diamonds")
    }

    it("throws an error if an integer argument is supplied") {
      assertThrows[java.lang.IllegalArgumentException]{
        CardiB.iLike()
      }
    }

    it("does not compile with integer arguments") {
      assertDoesNotCompile("""CardiB.iLike(1, 2, 3)""")
    }

  }

}

Эта команда запускает четыре теста в iLikeблоке description (из командной строки SBT):

testOnly *CardiBSpec -- -z iLike

Вы также можете использовать кавычки, так что это также будет работать:

testOnly *CardiBSpec -- -z "iLike"

Это запустит один тест:

testOnly *CardiBSpec -- -z "works with multiple arguments"

Это запустит два теста, которые начинаются с «работает с»:

testOnly *CardiBSpec -- -z "works with"

Я не могу получить -tвозможность запуска каких-либо тестов в CardiBSpecфайле. Эта команда не запускает никаких тестов:

testOnly *CardiBSpec -- -t "works with multiple arguments"

Похоже, -tопция работает, когда тесты не вложены в describeблоки. Давайте посмотрим на другой тестовый файл:

class CalculatorSpec extends FunSpec {
  it("adds two numbers") {
    assert(Calculator.addNumbers(3, 4) === 7)
  }
}

-t можно использовать для запуска одиночного теста:

testOnly *CalculatorSpec -- -t "adds two numbers"

-z также может использоваться для запуска одиночного теста:

testOnly *CalculatorSpec -- -z "adds two numbers"

Смотрите этот репозиторий, если вы хотите запустить эти примеры.

полномочия
источник