ScalaTest in 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 роки тому. Правильно?
Євген Йокота

Правильно. Це давнє питання, і я відтоді зрозумів, що ні, це неможливо (наскільки я знаю). Я не закривав це на випадок, якщо хтось насправді зумів знайти спосіб, але мені більше не потрібно на це відповідати.
Нахт

Про це є тема (за участі як Білла Веннерса, так і Марка Харра) на groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , але рішення поки немає
Seth Tisue

1
Існує також загальна підтримка запуску одного тестового sbt # 911 ( github.com/sbt/sbt/isissue/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 . (якщо це допоможе вам вирішити свою проблему, дайте мені знати, як я повинен оновити свою відповідь.)
Seth Tisue

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
Оновлення, оскільки, очевидно, необхідні подвійні цитати: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
це було тестовий тільки замість тестування лише для мене.
Ян Клеменс Стоффреген

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блоці опису (з командного рядка 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.