Property-based testing

31
ScalaCheck Пётр Громов, JetBrains, IntelliJ IDEA [email protected]

Transcript of Property-based testing

ScalaCheckПётр Громов, JetBrains, IntelliJ IDEA

[email protected]

ScalaCheckПётр Громов, JetBrains, IntelliJ IDEA

[email protected]

Тестирование свойствПётр Громов, JetBrains, IntelliJ IDEA

[email protected]

План

1. Как мы тестировали свойства

2. Как вы тоже можете

FileIndex

FileIndex ≠

Text on disk

Text in memory

AST in memory

Text on disk

Text in memory

AST in memory

Any thread

GC

Encoding settings

Language levelsettings

Property-Based TestingQuickCheck (Haskell): Claessen & Hughes, 2000

ScalaCheck, ClojureCheck, test.check, Hypothesis (Python), FsCheck, rubycheck, QCheck/ML...

Сценарии vs свойства

Свойства сортировки

forAll { ints: List[Int] => ints.sorted.size == ints.size}

Свойства сортировки

forAll { ints: List[Int] => isNonDecreasing(ints.sorted)}

Свойство Идеи

Не падать!

ДействияLoad text/ASTModify file/text/ASTSaveForce reindexForce GCChange settingsи другие

Запускать в случайном порядке

И оно падает!

И печатает последовательность действий!

http://risovach.ru/kartinka/1423546

Минимизация aka shrinking

QuickCheck/ScalaCheck делает это сам

>500 => 3

Тестировать свойства полезно

Но сложно

Где брать свойства?● из тестов● из списка

Свойства из тестовassertEquals("Masha loves Vasya", translate("Маша любит Васю"))

forAll(accNouns) { noun: String => translate("Маша любит " + noun) == "Masha loves " + translate(noun)}

Свойства из списка

1. Идемпотентность2. Инкрементальность3. Обратимость4. Эквивалентность5. Потокобезопасность6. Устойчивость

1. Идемпотентность

f(x)=f(...(f(x))...)

Сортировка, форматтер, optimize imports, make

2. Инкрементальность

modify(f(x), y)=f(x+y)

data structures, reparse, make

3. Обратимость

f(g(x))=x

сериализация, parser

4. Эквивалентность

Differential testingf(x)=g(x)

data structures, compilers (Yang et al, 2011)

6. Устойчивость

f(x) ≠ ⊥

индексы, Riak (Hughes, 2014)

QuickCheck

Мои предложения

1. google “QuickCheck language”2. Придумать и написать свойство3. Придумать и написать генератор

a. Подумать о минимизации4. Запустить5. Если упало, добавить тест, починить и

goto 46. Добавить в continuous integration

Ваши предложения?