SlideShare a Scribd company logo
1 of 36
Download to read offline
QuickCheck в PythonQuickCheck в Python
Проверка гипотез и поиск ошибокПроверка гипотез и поиск ошибок
Шорин Александр / @kxepal
О чем пойдет речь:О чем пойдет речь:
Что не так с нашими тестами
Что такое QuickCheck...
...и как его неправильно портировать
Знакомство с Hypothesis
Время офигенных историй
Что не так с нашими тестами?Что не так с нашими тестами?
Простейший примерПростейший пример
def qsort(list_):
if len(list_) <= 1:
return list_
head = qsort([x for x in list_[1:] if x < list_[0]])
tail = qsort([x for x in list_[1:] if x > list_[0]])
return head + [list_[0]] + tail
(да, в жизни все сложнее)(да, в жизни все сложнее)
ТестируемТестируем
def test_empty():
assert qsort([]) == []
def test_sort():
assert qsort([3, 2, 1]) == [1, 2, 3]
def test_sorted():
assert qsort([1, 2, 3]) == [1, 2, 3]
Шаблонная копипастаШаблонная копипаста
Мы можем решить проблему копипасты...Мы можем решить проблему копипасты...
@pytest.mark.parametrize(('value', 'result'), [
([], []),
([1, 2, 3], [1, 2, 3]),
([3, 2, 1], [1, 2, 3]),
])
def test_qsort(value, result):
assert qsort(value) == result
...хотя может показаться, что нет...хотя может показаться, что нет
@pytest.mark.parametrize(('value', 'result'), [
([], []),
([1, 2, 3], [1, 2, 3]),
([3, 2, 1], [1, 2, 3]),
(['a', 'c', 'b'], ['a', 'b', 'c']),
(['a', 'A'], ['A', 'a']),
([[0], [3], [1, 2, 3]], [[0], [1, 2, 3], [3]]),
...
])
def test_qsort(value, result):
assert qsort(value) == result
Можем ли мы проверить все допустимые случаи?Можем ли мы проверить все допустимые случаи?
+----------------------------------------------------------------------+
| ВЕЛИКОЕ ВСЁ |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| +---------------------+
| | Приемлемые данные |
| | Х |
+------------------------------------------------+-------------------^-+
|
Наши тесты -------+
Ошибку в коде мы так и неОшибку в коде мы так и не
нашлинашли
def test_qsort():
> assert qsort([1, 1, 1]) == [1, 1, 1]
E assert [1] == [1, 1, 1]
E Right contains more items, first extra item: 1
E Full diff:
E - [1]
E + [1, 1, 1]
Bug Driven DevelopmentBug Driven Development
Bug. Test. Fix. Repeat.Bug. Test. Fix. Repeat.
РезюмируемРезюмируем
Мы не тестируем наш код, мы закрепляем его
поведение
Мы не способны описать все пограничные
случаи
Баги всегда впереди нас
QuickCheckQuickCheck
Изначально написан на Haskell
Основывается на научно-исследовательских
работах
Позиционируется как библиотека для
автоматического тестирование функций на
основе спецификаций и свойств данных
Портирован на Scala, Erlang, Clojure, JavaScript...
Продвигается компанией Quviq
http://www.cse.chalmers.se/~rjmh/QuickCheck/
Как оно работает (примерно)Как оно работает (примерно)
passed
+-----------------------+
v |
+-----------+ sample +------+ failed +----------+ +--------+
| Generator | --------> | Test | --------> | Shrinker | --> | Report |
+-----------+ +------+ +----------+ +--------+
| ^ sample | ^
| +------------------+ |
| |
+-----------------------------------------------------------+
success
Выглядит просто?Выглядит просто?
Нельзя просто взять и написатьНельзя просто взять и написать
правильный QuickCheckправильный QuickCheck
https://github.com/agrif/pyquickcheck
https://github.com/Cue/qc
https://github.com/dbravender/qc
https://github.com/futoase/PyQCheck
https://github.com/JesseBuesking/pythoncheck
https://github.com/markchadwick/paycheck
https://github.com/msoedov/quick.py
https://github.com/npryce/python-factcheck
https://github.com/Xion/pyqcy
https://github.com/zombiecalypse/qcc
https://pypi.python.org/pypi/pytest-quickcheck
...
Типичные ошибкиТипичные ошибки
Слепое копирование Haskell реализации
Использование типов в качестве генераторов
Отсутствующий или же "глупый" shrinking
Заброшенные или же в зачаточном состоянии
Hypothesis [haɪˈpɒθɪsɪs]Hypothesis [haɪˈpɒθɪsɪs]
Автор: David R. MacIver
https://github.com/DRMacIver/hypothesis
Что умеетЧто умеет
Генерация всех основных типов данных
Рекурсивные типы
State Machine, N-ary деревья
Позволяет создавать свои стратегии без
погружения в детали
Интегрирован с Fake Factory, Django, pytest
Следит за качеством тестов
Запоминает найденные баги
Хорошо настраивается
http://hypothesis.readthedocs.org/en/master/data.htmlhttp://hypothesis.readthedocs.org/en/master/data.html
Генерация данныхГенерация данных
from hypothesis import strategies as st
def nulls(): return st.none()
def booleans(): return st.booleans()
def numbers(): return st.integers() | st.floats()
def strings(): return st.text()
def arrays(elements): return st.lists(elements)
def objects(elements): return st.dictionaries(strings(), elements)
def values():
simple_values = nulls() | booleans() | numbers() | strings()
return (simple_values
| st.recursive(simple_values,
lambda children: arrays(children)
| objects(children)))
Генерация данныхГенерация данных
>>> doc = json_st.objects(json_st.values())
>>> doc.example()
{'G Gu202fn G𝞠u202f_n( n(nn_ n': 9.943339378805967e-309}
>>> doc.example()
{'': None, 'x85': '', 'U00014481': None,
'u3000': -2.45410883359415e-309, ' x85': 1.5564453946197205e-308,
'I': ' ',
'u3000u2029': -9.05230966734913e-309, 'U00014481U00014481 ⁱ': None,
'Nj': -1.80149788818e-311, ' ': -1.414261190585428e+202,
'u2029ⁱNj': ' ', ' u2029': inf, ' ': ' ',
'u3000 ': -1.0065151140507456e+206, 'Nj ': None, ' ⁱ': None,
'IU00014481': -1.2296585975031088e+145, 'x80': ' ',
'x85ⁱ x80x80Nj': -6.438869672267061e+116, ' ': None,
'u3000x80': None, 'u2029x80Nj': -698356955173.6532, ' ': ' ',
' x85': None, 'x85ⁱU00014481': None, ' ': None, 'ⁱ': None,
' u3000 ': ' '}
Поиск ошибокПоиск ошибок
>>> @given(json_st.objects(json_st.values()))
... def test_json(doc):
... assert json.loads(json.dumps(doc)) == doc
>>> test_json()
Falsifying example: test_json(doc={'': nan})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in test_json
File "./hypothesis/core.py", line 583, in wrapped_test
print_example=True, is_final=True
File "./hypothesis/executors/executors.py", line 25, in default_executor
return function()
File "./hypothesis/core.py", line 365, in run
return test(*args, **kwargs)
File "<stdin>", line 3, in test_json
AssertionError
Поиск ошибокПоиск ошибок
>>> @given(json_st.objects(json_st.values()))
... @settings(verbosity=hypothesis.Verbosity.verbose)
... def test_json(doc):
... assert json.loads(json.dumps(doc)) == doc
>>> test_json()
Поиск ошибокПоиск ошибок
Trying example: test_json(doc={})
Trying example: test_json(doc={'': True})
Trying example: test_json(doc={'': None})
Trying example: test_json(doc={'': False})
Trying example: test_json(doc={'': -43203256341979896423482879160843})
Trying example: test_json(doc={'': 24})
...
Trying example: test_json(doc={'': 100440})
Trying example: test_json(doc={'': 30323947834323202215971170911015})
Trying example: test_json(doc={'': 0.0})
Trying example: test_json(doc={'': inf})
Trying example: test_json(doc={'': -inf})
Successfully shrunk example 27 times
Falsifying example: test_json(doc={'': nan})
Исправление ошибокИсправление ошибок
import math
from hypothesis import strategies as st
def numbers():
return st.integers() | st.floats().filter(math.isfinite)
Property-тестированиеProperty-тестирование
@hypothesis.given(st.lists(st.integers()))
def test_qsort(l):
ls = qsort(l)
for i in ls:
assert i in l
l.remove(i)
assert len(l) == 0
assert all(ls[i - 1] <= ls[i] for i in range(1, len(ls)))
Property-тестированиеProperty-тестирование
l = [0]
@hypothesis.given(st.lists(st.integers()))
def test_qsort(l):
ls = qsort(l)
for i in ls:
assert i in l
l.remove(i)
> assert len(l) == 0
E assert 1 == 0
E + where 1 = len([0])
foo.py:18: AssertionError
---------------- Hypothesis ----------------
Falsifying example: test_qsort(l=[0, 0])
База примеровБаза примеров
Hypothesis сохраняет найденные ошибки в SQLite
базу для последующего воспроизведения.
Health CheckHealth Check
Генерируемые данные слишком большие
Слишком строгая фильтрация
Слишком медленная стратегия
Использование random вызовов в коде
Тест возвращает результат
Гибкая настройкаГибкая настройка
Количество найденных успехных примеров
(example)
Количество итераций на тест
Глубина поиска минимального примера
Слишком медленная стратегия
Время выполнения теста
QA контроль
Профили
ПрофилиПрофили
import os
from hypothesis import settings
from hypothesis import Verbosity
settings.register_profile("ci", settings(max_examples=1000))
settings.register_profile("dev", settings(max_examples=10))
settings.register_profile("debug", settings(max_examples=10,
verbosity=Verbosity.verbose))
settings.load_profile(os.getenv('HYPOTHESIS_PROFILE', 'default'))
Что хорошо тестируетсяЧто хорошо тестируется
Алгоритмы
Структуры данных любой сложности
Реализации протоколов, парсеров, базы данных
Любые чистые функции
Детерминированные API
Полезные ссылкиПолезные ссылки
Hypothesis
https://github.com/DRMacIver/hypothesis
Hypothesis Talks
https://github.com/DRMacIver/hypothesis-talks
Conjecture
https://github.com/DRMacIver/conjecture
PYCON UK 2015: Finding more bugs with less work
https://www.youtube.com/watch?v=62ubHXzD8tM
How I handled Erlang R18 Maps with QuickCheck
https://vimeo.com/143849945
СurEr - Concolic Testing
https://www.youtube.com/watch?v=XVOV0KQAf-8
Спасибо за внимание!Спасибо за внимание!

More Related Content

What's hot

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgYuri Zhloba
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream APICEE-SEC(R)
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorFedor Lavrentyev
 
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Andrey Karpov
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

What's hot (20)

Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbg
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
XML Magic
XML MagicXML Magic
XML Magic
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev FedorProgramming Java - Lecture 02 - Objects - Lavrentyev Fedor
Programming Java - Lecture 02 - Objects - Lavrentyev Fedor
 
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

Viewers also liked

«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&CoMail.ru Group
 
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru GroupMail.ru Group
 
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...Mail.ru Group
 
«Пиринговый веб на JavaScript», Денис Глазков
«Пиринговый веб на JavaScript», Денис Глазков«Пиринговый веб на JavaScript», Денис Глазков
«Пиринговый веб на JavaScript», Денис ГлазковMail.ru Group
 
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...Mail.ru Group
 
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Mail.ru Group
 
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)Mail.ru Group
 
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)Mail.ru Group
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2Badoo Development
 
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...Mail.ru Group
 
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Mail.ru Group
 
Profiling and optimizing go programs
Profiling and optimizing go programsProfiling and optimizing go programs
Profiling and optimizing go programsBadoo Development
 
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...Mail.ru Group
 
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтов
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтовАлександр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтов
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтовMail.ru Group
 
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...Mail.ru Group
 
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...Mail.ru Group
 
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»Mail.ru Group
 
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)Mail.ru Group
 
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...Mail.ru Group
 

Viewers also liked (20)

«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
 
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
«Advanced {product_name} configuring», Алексей Макеев, Mail.Ru Group
 
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
Александр Лисаченко, Alpari, «Решение вопросов сквозной функциональности в пр...
 
«Пиринговый веб на JavaScript», Денис Глазков
«Пиринговый веб на JavaScript», Денис Глазков«Пиринговый веб на JavaScript», Денис Глазков
«Пиринговый веб на JavaScript», Денис Глазков
 
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
Максим Попов, Mail.Ru Group, «Асинхронные запросы в MySQL или когда PDO стано...
 
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
 
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
«Свой PhoneGap за 15 минут», Алексей Охрименко (IPONWEB)
 
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
«Компонентная верстка с AngularJS», Андрей Яманов (CTO TeamHunt)
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2
 
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
Сергей Николенко, Deloitte Analytics Institute, Высшая Школа Экономики, «От н...
 
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
Сергей Герасимов (ВМК МГУ), Александр Мещеряков (Институт космических исследо...
 
Profiling and optimizing go programs
Profiling and optimizing go programsProfiling and optimizing go programs
Profiling and optimizing go programs
 
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...
Ростислав Яворский, Высшая Школа Экономики, «Как использовать анализ сетевых ...
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтов
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтовАлександр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтов
Александр Щусь, Mail.Ru Group, Детектирование взломов почтовых аккаунтов
 
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
Иван Лобов, Data-Centric Alliance, «Текущие тенденции в сфере исследования гл...
 
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...
Александр Семёнов, МТС, Высшая Школа Экономики, «Анализ социальных сетей в те...
 
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»
Роман Чеботарёв, КРОК, «Выбираем метрику оценки качества модели»
 
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)
«Pocker - GUI для Docker», Владимир Василькин (ALMWorks, Санкт-Петербург)
 
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
Определение качества сетевого соединения в iOS-почте, Даниил Румянцев, разраб...
 

Similar to «QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Rambler&Co

QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQAFest
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.PyNSK
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptInterSystems
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreAlexander Schepanovski
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliaminComputer Science Club
 
lab1 math computational
lab1 math computationallab1 math computational
lab1 math computationaldinhtruonglam1
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Technosphere1
 
Learning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинLearning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинMail.ru Group
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповetyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsIosif Itkin
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 

Similar to «QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Rambler&Co (20)

QA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverageQA Fest 2017. Иван Цыганов. Не смешите мой coverage
QA Fest 2017. Иван Цыганов. Не смешите мой coverage
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Статический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object ScriptСтатический анализатор кода для InterSystems Caché Object Script
Статический анализатор кода для InterSystems Caché Object Script
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its Underscore
 
20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin20100927 28 reqformalization-kuliamin
20100927 28 reqformalization-kuliamin
 
lab1 math computational
lab1 math computationallab1 math computational
lab1 math computational
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Python
PythonPython
Python
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
 
Learning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинLearning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван Сметанин
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate Programs
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Rambler&Co

  • 1. QuickCheck в PythonQuickCheck в Python Проверка гипотез и поиск ошибокПроверка гипотез и поиск ошибок Шорин Александр / @kxepal
  • 2. О чем пойдет речь:О чем пойдет речь: Что не так с нашими тестами Что такое QuickCheck... ...и как его неправильно портировать Знакомство с Hypothesis Время офигенных историй
  • 3. Что не так с нашими тестами?Что не так с нашими тестами?
  • 4. Простейший примерПростейший пример def qsort(list_): if len(list_) <= 1: return list_ head = qsort([x for x in list_[1:] if x < list_[0]]) tail = qsort([x for x in list_[1:] if x > list_[0]]) return head + [list_[0]] + tail (да, в жизни все сложнее)(да, в жизни все сложнее)
  • 5. ТестируемТестируем def test_empty(): assert qsort([]) == [] def test_sort(): assert qsort([3, 2, 1]) == [1, 2, 3] def test_sorted(): assert qsort([1, 2, 3]) == [1, 2, 3] Шаблонная копипастаШаблонная копипаста
  • 6. Мы можем решить проблему копипасты...Мы можем решить проблему копипасты... @pytest.mark.parametrize(('value', 'result'), [ ([], []), ([1, 2, 3], [1, 2, 3]), ([3, 2, 1], [1, 2, 3]), ]) def test_qsort(value, result): assert qsort(value) == result
  • 7. ...хотя может показаться, что нет...хотя может показаться, что нет @pytest.mark.parametrize(('value', 'result'), [ ([], []), ([1, 2, 3], [1, 2, 3]), ([3, 2, 1], [1, 2, 3]), (['a', 'c', 'b'], ['a', 'b', 'c']), (['a', 'A'], ['A', 'a']), ([[0], [3], [1, 2, 3]], [[0], [1, 2, 3], [3]]), ... ]) def test_qsort(value, result): assert qsort(value) == result
  • 8. Можем ли мы проверить все допустимые случаи?Можем ли мы проверить все допустимые случаи? +----------------------------------------------------------------------+ | ВЕЛИКОЕ ВСЁ | | | | | | | | | | | | | | | | | | | | +---------------------+ | | Приемлемые данные | | | Х | +------------------------------------------------+-------------------^-+ | Наши тесты -------+
  • 9. Ошибку в коде мы так и неОшибку в коде мы так и не нашлинашли def test_qsort(): > assert qsort([1, 1, 1]) == [1, 1, 1] E assert [1] == [1, 1, 1] E Right contains more items, first extra item: 1 E Full diff: E - [1] E + [1, 1, 1]
  • 10. Bug Driven DevelopmentBug Driven Development Bug. Test. Fix. Repeat.Bug. Test. Fix. Repeat.
  • 11. РезюмируемРезюмируем Мы не тестируем наш код, мы закрепляем его поведение Мы не способны описать все пограничные случаи Баги всегда впереди нас
  • 12. QuickCheckQuickCheck Изначально написан на Haskell Основывается на научно-исследовательских работах Позиционируется как библиотека для автоматического тестирование функций на основе спецификаций и свойств данных Портирован на Scala, Erlang, Clojure, JavaScript... Продвигается компанией Quviq http://www.cse.chalmers.se/~rjmh/QuickCheck/
  • 13. Как оно работает (примерно)Как оно работает (примерно) passed +-----------------------+ v | +-----------+ sample +------+ failed +----------+ +--------+ | Generator | --------> | Test | --------> | Shrinker | --> | Report | +-----------+ +------+ +----------+ +--------+ | ^ sample | ^ | +------------------+ | | | +-----------------------------------------------------------+ success
  • 15. Нельзя просто взять и написатьНельзя просто взять и написать правильный QuickCheckправильный QuickCheck https://github.com/agrif/pyquickcheck https://github.com/Cue/qc https://github.com/dbravender/qc https://github.com/futoase/PyQCheck https://github.com/JesseBuesking/pythoncheck https://github.com/markchadwick/paycheck https://github.com/msoedov/quick.py https://github.com/npryce/python-factcheck https://github.com/Xion/pyqcy https://github.com/zombiecalypse/qcc https://pypi.python.org/pypi/pytest-quickcheck ...
  • 16. Типичные ошибкиТипичные ошибки Слепое копирование Haskell реализации Использование типов в качестве генераторов Отсутствующий или же "глупый" shrinking Заброшенные или же в зачаточном состоянии
  • 17. Hypothesis [haɪˈpɒθɪsɪs]Hypothesis [haɪˈpɒθɪsɪs] Автор: David R. MacIver https://github.com/DRMacIver/hypothesis
  • 18. Что умеетЧто умеет Генерация всех основных типов данных Рекурсивные типы State Machine, N-ary деревья Позволяет создавать свои стратегии без погружения в детали Интегрирован с Fake Factory, Django, pytest Следит за качеством тестов Запоминает найденные баги Хорошо настраивается http://hypothesis.readthedocs.org/en/master/data.htmlhttp://hypothesis.readthedocs.org/en/master/data.html
  • 19. Генерация данныхГенерация данных from hypothesis import strategies as st def nulls(): return st.none() def booleans(): return st.booleans() def numbers(): return st.integers() | st.floats() def strings(): return st.text() def arrays(elements): return st.lists(elements) def objects(elements): return st.dictionaries(strings(), elements) def values(): simple_values = nulls() | booleans() | numbers() | strings() return (simple_values | st.recursive(simple_values, lambda children: arrays(children) | objects(children)))
  • 20. Генерация данныхГенерация данных >>> doc = json_st.objects(json_st.values()) >>> doc.example() {'G Gu202fn G𝞠u202f_n( n(nn_ n': 9.943339378805967e-309} >>> doc.example() {'': None, 'x85': '', 'U00014481': None, 'u3000': -2.45410883359415e-309, ' x85': 1.5564453946197205e-308, 'I': ' ', 'u3000u2029': -9.05230966734913e-309, 'U00014481U00014481 ⁱ': None, 'Nj': -1.80149788818e-311, ' ': -1.414261190585428e+202, 'u2029ⁱNj': ' ', ' u2029': inf, ' ': ' ', 'u3000 ': -1.0065151140507456e+206, 'Nj ': None, ' ⁱ': None, 'IU00014481': -1.2296585975031088e+145, 'x80': ' ', 'x85ⁱ x80x80Nj': -6.438869672267061e+116, ' ': None, 'u3000x80': None, 'u2029x80Nj': -698356955173.6532, ' ': ' ', ' x85': None, 'x85ⁱU00014481': None, ' ': None, 'ⁱ': None, ' u3000 ': ' '}
  • 21. Поиск ошибокПоиск ошибок >>> @given(json_st.objects(json_st.values())) ... def test_json(doc): ... assert json.loads(json.dumps(doc)) == doc >>> test_json() Falsifying example: test_json(doc={'': nan}) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test_json File "./hypothesis/core.py", line 583, in wrapped_test print_example=True, is_final=True File "./hypothesis/executors/executors.py", line 25, in default_executor return function() File "./hypothesis/core.py", line 365, in run return test(*args, **kwargs) File "<stdin>", line 3, in test_json AssertionError
  • 22. Поиск ошибокПоиск ошибок >>> @given(json_st.objects(json_st.values())) ... @settings(verbosity=hypothesis.Verbosity.verbose) ... def test_json(doc): ... assert json.loads(json.dumps(doc)) == doc >>> test_json()
  • 23. Поиск ошибокПоиск ошибок Trying example: test_json(doc={}) Trying example: test_json(doc={'': True}) Trying example: test_json(doc={'': None}) Trying example: test_json(doc={'': False}) Trying example: test_json(doc={'': -43203256341979896423482879160843}) Trying example: test_json(doc={'': 24}) ... Trying example: test_json(doc={'': 100440}) Trying example: test_json(doc={'': 30323947834323202215971170911015}) Trying example: test_json(doc={'': 0.0}) Trying example: test_json(doc={'': inf}) Trying example: test_json(doc={'': -inf}) Successfully shrunk example 27 times Falsifying example: test_json(doc={'': nan})
  • 24. Исправление ошибокИсправление ошибок import math from hypothesis import strategies as st def numbers(): return st.integers() | st.floats().filter(math.isfinite)
  • 25. Property-тестированиеProperty-тестирование @hypothesis.given(st.lists(st.integers())) def test_qsort(l): ls = qsort(l) for i in ls: assert i in l l.remove(i) assert len(l) == 0 assert all(ls[i - 1] <= ls[i] for i in range(1, len(ls)))
  • 26. Property-тестированиеProperty-тестирование l = [0] @hypothesis.given(st.lists(st.integers())) def test_qsort(l): ls = qsort(l) for i in ls: assert i in l l.remove(i) > assert len(l) == 0 E assert 1 == 0 E + where 1 = len([0]) foo.py:18: AssertionError ---------------- Hypothesis ---------------- Falsifying example: test_qsort(l=[0, 0])
  • 27. База примеровБаза примеров Hypothesis сохраняет найденные ошибки в SQLite базу для последующего воспроизведения.
  • 28. Health CheckHealth Check Генерируемые данные слишком большие Слишком строгая фильтрация Слишком медленная стратегия Использование random вызовов в коде Тест возвращает результат
  • 29. Гибкая настройкаГибкая настройка Количество найденных успехных примеров (example) Количество итераций на тест Глубина поиска минимального примера Слишком медленная стратегия Время выполнения теста QA контроль Профили
  • 30. ПрофилиПрофили import os from hypothesis import settings from hypothesis import Verbosity settings.register_profile("ci", settings(max_examples=1000)) settings.register_profile("dev", settings(max_examples=10)) settings.register_profile("debug", settings(max_examples=10, verbosity=Verbosity.verbose)) settings.load_profile(os.getenv('HYPOTHESIS_PROFILE', 'default'))
  • 31. Что хорошо тестируетсяЧто хорошо тестируется Алгоритмы Структуры данных любой сложности Реализации протоколов, парсеров, базы данных Любые чистые функции Детерминированные API
  • 32.
  • 33.
  • 34.
  • 35. Полезные ссылкиПолезные ссылки Hypothesis https://github.com/DRMacIver/hypothesis Hypothesis Talks https://github.com/DRMacIver/hypothesis-talks Conjecture https://github.com/DRMacIver/conjecture PYCON UK 2015: Finding more bugs with less work https://www.youtube.com/watch?v=62ubHXzD8tM How I handled Erlang R18 Maps with QuickCheck https://vimeo.com/143849945 СurEr - Concolic Testing https://www.youtube.com/watch?v=XVOV0KQAf-8