Scala: тестирование на основе свойств: как знать все необходимые тестовые случаи при написании теста

Я читаю об тестировании на основе свойств с использованием Scala. язык. На этом слайде они представляют эту концепцию: Для доказательства истинности функции a+b. мы только для того, чтобы доказать, что эти утверждения верны на случайных данных:

  1. a + b = b + a
  2. a + 0 = a
  3. a + 1 + 1 = a + 2

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


person Trần Kim Dự    schedule 12.06.2017    source источник
comment
3. выглядит неправильно   -  person stark    schedule 12.06.2017


Ответы (1)


Прежде всего, я предполагаю, что у вас опечатка в № 3, это должно быть +, а не *.

Чтобы ответить на ваш вопрос, вы наверняка не можете быть уверены, что ваша реализация правильная, если вы докажете эти три свойства. Рассмотрим, например, эту реализацию, которая удовлетворяет всем трем свойствам, но определенно неверна:

def wrongPlus(a: Int, b: Int) = if(a < 3 || b <3) b a+b else 0

Чтобы окончательно доказать (целочисленное) сложение, вам нужна независимая реализация next integer. Тогда по определению:

1. a + 0 = a
2. a + next(b) = next(a + b) 

Если эти свойства выполняются для любых a и b и некоторой операции +, то + действительно является сложением.

person Dima    schedule 12.06.2017
comment
можете ли вы сказать мне значение функции next. кроме того, есть ли какой-либо метод, который мы точно знаем, мы сделали все условия для проверки на основе свойств. спасибо - person Trần Kim Dự; 13.06.2017
comment
next это всего лишь +1. Так определяются натуральные числа. 1 = next(0) — натуральное число, и для каждого натурального N существует ровно одно M=next(N), которое также является натуральным. Два приведенных выше свойства являются определением целочисленного сложения, поэтому вы знаете, что если они выполняются, ваша операция является сложением по определению. Не существует универсального правила, позволяющего выяснить, какие свойства проверять для любой произвольной операции. Вы единственный, кто может узнать свойства вашей операции. - person Dima; 13.06.2017