Тестирование нескольких наборов данных с помощью ScalaTest - PullRequest
8 голосов
/ 20 марта 2011

Есть ли какой-нибудь удобный способ выполнить тесты для нескольких наборов данных - как в параметризованных тестах JUnit?

Ответы [ 3 ]

10 голосов
/ 20 марта 2011

В ScalaTest 1.5 появилась новая функция для тестирования нескольких наборов данных, которую вы можете попробовать в качестве снимка. Это выпущено в scala-tools.org:

идентификатор группы: org.scalatest идентификатор артефакта: самый большой версия: 1.5-SNAPSHOT

Вы добавляете (или импортируете элементы) TableDrivenPropertyChecks, а затем можете определять таблицы следующим образом:

val examples =
  Table(
    ("a", "b", "c", "d"),
    (  1,   1,   1,   1),
    (  1,   1,   1,   1),
    (  1,   1,   1,   1),
    (  1,   1,   1,   1)
  )

Вы передаете список переменных ar ar в Table. Каждый кортеж должен иметь одинаковую арность, в этом случае каждый кортеж имеет арность 4 (4 члена). Первый кортеж - это все строки, и они определяют имена для столбцов. Последующие кортежи определяют каждый ряд данных. Вы можете поместить любой тип в кортеж, но в целом каждый столбец будет содержать один и тот же тип. Хотя, если вы хотите, вы можете иметь столбцы типа Any, которые могут содержать что угодно. Вы можете иметь таблицу от 1 до 22 столбцов. Если вам нужно более 22 столбцов (в настоящее время максимальный размер кортежа в Scala составляет 22), вы можете использовать составной тип в одном или нескольких столбцах.

Как только у вас есть таблица, вы можете проверить их с помощью forAll вот так:

forAll (examples) { (a, b, c, d) =>
  a + b + c + d should equal (4)
}

forAll принимает два списка параметров. Первая - это таблица, а вторая - «функция свойства», которая выражает нечто, что должно быть истинно для каждой строки таблицы. forAll возьмет каждую строку таблицы (конечно, пропуская строку заголовка имен столбцов) и удостоверится, что свойство выполнено. Если этого не произойдет, вы получите хорошее сообщение об ошибке, в котором будет указано, какая строка таблицы вышла из строя, какие значения были у названных столбцов и т. Д.

Таблица представляет собой Seq из кортежей данных, поэтому вы также можете использовать его как Seq. Например, вы можете получить Seq of Option [Exception], указывающий, какие строки потерпели неудачу, например:

for ((a, b, c, d) <- examples) yield {
  failureOf { a + b + c + d should equal (4) }
}

Результирующий Seq содержит один Option для каждой строки данных в таблице, который равен None, если свойство передано для этой строки, и Some [Exception], если свойство не выполнено. Исключение в некоторых содержит все подробности об ошибке.

6 голосов
/ 20 марта 2011

Общие тесты могут быть вам интересны.Они позволяют вам определить некоторый набор тестов, как в этом примере стека:

  def nonEmptyStack(stack: Stack[Int], lastItemAdded: Int) {
    "be non-empty" in {
      assert(!stack.empty)
    }
    "return the top item on peek" in {
      assert(stack.peek === lastItemAdded)
    }
    "not remove the top item on peek" in {
      val size = stack.size
      assert(stack.peek === lastItemAdded)
      assert(stack.size === size)
    }
    "remove the top item on pop" in {
      val size = stack.size
      assert(stack.pop === lastItemAdded)
      assert(stack.size === size - 1)
    }
  }

, а затем в реальной спецификации вы можете использовать его следующим образом:

behave like nonEmptyStack(stackWithOneItem, lastValuePushed)

Другими словами nonEmptyStack - это параметризованный набор тестов, который можно использовать с различными наборами данных, которые вы хотите протестировать.

4 голосов
/ 13 марта 2015

Другая возможность для тестирования на основе данных - использовать следующий синтаксис:

class SampleTest extends FunSuite {      
  val input = List((1, 1), (4, 2), (9, 3))

  input.foreach{i =>
    test(s"Test of math.sqrt(${i._1})") {
      assert(math.sqrt(i._1) === i._2)
    }
  }
}

Тесты по умолчанию выполняются параллельно, если в build.sbt не установлено parallelExecution in Test := false.

...