Должен ли я переопределить логику в тесте на основе свойств? - PullRequest
0 голосов
/ 02 июня 2019

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

fun isButtonVisible(fitlers: List<Filters>, results: List<Shop>, isLoading: Boolean) {
  return fitlers.isNotEmpty() && results.isEmpty() && !isLoading
}

Теперь я хотел бы протестировать эту функцию, используя PBT, например:

"the button should be visible if filters is not empty and results is empty and is not loading" {
  forAll { filters: List<Filters>, results: List<Shop>, isLoading: Boolean ->
    val actual = isButtonVisible(filters, results, isLoading)

    // Here reimplement the logic
    val expected = filters.isNotEmpty() && results.isEmpty() && !isLoading

    assertThat(actual).isEqual(expected)
  }
}

Кажется,что я просто переопределил логику снова в моем тесте, это правильно?Если нет, как я могу придумать другие свойства, если логика представляет собой простые комбинации нескольких флагов ?

1 Ответ

0 голосов
/ 03 июня 2019

что не правильно.

вам не нужно рассчитывать ожидаемое значение во время теста, вы должны знать, каким должен быть результат, установить его как таковое и сравнить его с фактическим результатом.

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

"the button should be visible when filters are not empty, results is empty, isLoading is false " {
  forAll { filters: List<Filters>, results: List<Shop>, isLoading: Boolean ->
    val actualVisibleFlag = isButtonVisible(filters, results, isLoading)

    val expectedVisibleFlag = true    
    assertThat(actualVisibleFlag ).isEqual(expectedVisibleFlag )
  }
}

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

Идея заключается в том, что когда у вас есть ошибка, вы можете легко увидеть, какой из существующих тестов не пройден, или вы можете добавить новый, который подчеркивает ошибку.

Если вы вызываете метод, чтобы дать вам результат того, что, по вашему мнению, вы должны получить, ну, как вы узнаете, что метод в любом случае верен? Как вы знаете, это работает правильно для каждой комбинации?

Возможно, вам не хватит меньшего количества тестов, если вы сократите количество флагов, возможно, вам действительно нужно 4 из них?

Теперь, каждый язык / фреймворк имеет (или должен иметь) поддержку матричного типа вещей, чтобы вы могли легко записывать значения для каждой комбинации

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