Каковы различия между средами BDD для Java? [закрыто]

Существует много способов сделать.

1) Использовать символы. Тем не менее, это не даст вам никакой безопасности типов, кроме того, что вы не принимаете несимволы, где ожидается символ. Я просто упоминаю об этом здесь для полноты. Вот пример использования:

def update(what: Symbol, where: Int, newValue: Array[Int]): MatrixInt =
  what match {
    case 'row => replaceRow(where, newValue)
    case 'col | 'column => replaceCol(where, newValue)
    case _ => throw new IllegalArgumentException
  }

// At REPL:   
scala> val a = unitMatrixInt(3)
a: teste7.MatrixInt =
/ 1 0 0 \
| 0 1 0 |
\ 0 0 1 /

scala> a('row, 1) = a.row(0)
res41: teste7.MatrixInt =
/ 1 0 0 \
| 1 0 0 |
\ 0 0 1 /

scala> a('column, 2) = a.row(0)
res42: teste7.MatrixInt =
/ 1 0 1 \
| 0 1 0 |
\ 0 0 0 /

2) Использование класса Enumeration:

object Dimension extends Enumeration {
  type Dimension = Value
  val Row, Column = Value
}

или, если вам необходимо сериализовать или отобразить его:

object Dimension extends Enumeration("Row", "Column") {
  type Dimension = Value
  val Row, Column = Value
}

Это можно использовать следующим образом:

def update(what: Dimension, where: Int, newValue: Array[Int]): MatrixInt =
  what match {
    case Row => replaceRow(where, newValue)
    case Column => replaceCol(where, newValue)
  }

// At REPL:
scala> a(Row, 2) = a.row(1)
:13: error: not found: value Row
       a(Row, 2) = a.row(1)
         ^

scala> a(Dimension.Row, 2) = a.row(1)
res1: teste.MatrixInt =
/ 1 0 0 \
| 0 1 0 |
\ 0 1 0 /

scala> import Dimension._
import Dimension._

scala> a(Row, 2) = a.row(1)
res2: teste.MatrixInt =
/ 1 0 0 \
| 0 1 0 |
\ 0 1 0 /

К сожалению, это не гарантирует, что все совпадения учитываются. Если бы я забыл поставить Row или Column в матче, компилятор Scala не предупредил бы меня. Таким образом, это дает мне некоторую безопасность типа , но не настолько, насколько это возможно.

3) Объекты объекта:

sealed abstract class Dimension
case object Row extends Dimension
case object Column extends Dimension

Теперь, если я (f9]:

match
MatrixInt.scala:70: warning: match is not exhaustive!
missing combination         Column

    what match {
    ^
one warning found

Используется почти так же, как и для import:

scala> val a = unitMatrixInt(3)
a: teste3.MatrixInt =
/ 1 0 0 \
| 0 1 0 |
\ 0 0 1 /

scala> a(Row,2) = a.row(0)
res15: teste3.MatrixInt =
/ 1 0 0 \
| 0 1 0 |
\ 1 0 0 /

Тогда вы можете подумать, зачем использовать Enumeration вместо объектов case. На самом деле, случайные объекты имеют много преимуществ, например, здесь. Класс Enumeration, однако, имеет множество методов Collection, таких как элементы (итератор на Scala 2.8), который возвращает Iterator, map, flatMap, filter и т. Д.

Этот ответ является по существу выбранными частями из этой статьи в моем блоге.

120
задан Peter O. 13 January 2012 в 17:05
поделиться

4 ответа

Изначально я создавал свой BDD с помощью простого jUnit, но в последнее время я смотрел на JDave , потому что он почти 1: 1 по сравнению с тем, что я делал с jUnit. Он также работает поверх jUnit, поэтому он уже работает в Eclipse, а также его легко настроить для работы в системах непрерывной интеграции, таких как Hudson. Не могу сравнить это с другими, но мой опыт работы с JDave пока хорош.

О, и это никогда не было глупой идеей использовать моки! Они не привязаны конкретно к TDD / BDD, их цель - облегчить бремя тестирования в целом.

7
ответ дан 24 November 2019 в 01:41
поделиться
[

] Вау, я вижу, что тема горячая, много хороших ответов... [

] [

] Ирония в сторону, я недавно открыл BDD и нашел эту концепцию интересной. Эй, это заставляет писать и тесты... и спецификации! Как ни удивительно, но в некоторых проектах последние тоже могут отсутствовать... Или просто не хватает точности, которую BDD заставляет вводить.[

] [

]Статья []Behavior Driven Development[] обобщает концепцию и дает ссылки на некоторые хорошие статьи (например, написанную Эндрю Гловером). Более того, к теме этого потока, она дает довольно полный (я полагаю) список BDD-фреймворков, большое количество которых предназначено для Java[
]. Это не решает проблему выбора фреймворка, но, по крайней мере, облегчит поиск...[

] [

]Поскольку BDD в значительной степени полагается на читабельность тестового кода, я полагаю, что хорошим критерием выбора является быстрый просмотр туров/учебника и выяснение, какой из них кажется более подходящим вашему стилю. Другим критерием может быть тот факт, что вы знакомы с инструментами фреймворка (юнит-тест, издевательство), использование с IDE и т.д.[

].
6
ответ дан 24 November 2019 в 01:41
поделиться

Какую среду BDD лучше всего использовать с Java? Почему? Каковы плюсы и минусы каждого фреймворка?

Вот интересная ссылка о Concordion vs.Приемочное тестирование на основе огурца и Java

Я нашел здесь пару из них, но не уверен, какой из них выбрать.

Действительно, посмотрите на упомянутый выше.

Имеет ли смысл использовать фреймворк BDD, если я уже использую имитирующую библиотеку (например, Mockito)?

Краткий ответ: да, определенно. На самом деле приемочное тестирование с использованием фреймворка BDD и изолированное модульное тестирование с использованием фиктивных объектов настолько различаются, что я не понимаю вопроса. Приемочное тестирование - это тестирование методом черного ящика, тесты используются для проверки того, что бизнес-функция работает, и в идеале они написаны бизнес-аналитиком. Модульные тесты изолированно с использованием макетов - это тестирование методом белого ящика, тесты используются для проверки работоспособности модуля и написаны разработчиками. Оба они полезны, но имеют совершенно разные цели. Другими словами, использование Mockito вообще не заменяет структуру BDD, и обратное тоже верно.

20
ответ дан 24 November 2019 в 01:41
поделиться

Моя команда уже некоторое время использует JBehave . Он использует простые текстовые файлы для хранения спецификаций. Каждый шаг (Given, When, Then) затем выполняется определенным методом, который может извлекать параметры из шага. Сценарии могут быть с отступом и хорошо отформатированы, что очень помогает, если клиенты хотят их проверить.

Есть и некоторые проблемы. Мы перешли на Java 6. Иногда некоторые шаги сценария игнорируются во время выполнения. Это может вызвать большие проблемы с выяснением того, где ошибка.

3
ответ дан 24 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: