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


150

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

testOnly *class -- -n Tag

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

testOnly *class -- -X 2

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


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 - это класс теста, а не конкретный метод теста, поэтому выполняются все немаркированные методы.

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


10
для тех, кто сталкивается с «Тесты не были выполнены»: *YourTestClassдолжно быть имя класса. Не имя файла.
— MKatleast3

1
это был testOnly вместо test-only для меня.
— Ян Клеменс Стоффреген,

11

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

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

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

В sbtконсоли

testOnly *LoginServiceSpec

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

sbt "testOnly *LoginServiceSpec"

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"

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.