Пример fuzz testing для поиска URL в тексте
                        Николай Ходов (nkhodov@gmail.com)
Fuzz testing
Условное деление
Задача
●   В произвольном тексте:




●   Найти все URL'ы
Бесплотные попытки
                     А как же вот это?!
                 ●   ya.ru
                 ●   It.s.bori.ng
                 ●   vk.com/durov
                 ●   Google.com/#plus-plus
                 ●   //st.domain.com/?q=1
https?://(.*?)   ●   И еще миллионы
                     вариантов...
Пишем регулярку



                                              RFC 1738
                              +


(https?://)?<domain>{1,3}.<TLD>(/<path>)*(?<query_string>?)(#<hashtag>?)?
Тестируем вручную
●   self.assertEqual(strip_links('word1 https://ya.ru word2'), 'word1
    word2')
●   self.assertEqual(strip_links('word1 domain.arpa/test.link word2'),
    'word1 word2')
●   self.assertEqual(strip_links('word1 ya.ru/yandsearch?
    sdfsdfsdf=1fsdf word2'), 'word1 word2')
●   self.assertEqual(strip_links('word1 naked.domain.asia word2'),
    'word1 word2')
●   …
●   На 15 строке мозг усиленно отказывается что-либо
    придумывать.
Пусть тестирует сам компьютер!
Fully Random URL


   Kwh89 ydhfj 09 u ><LAKSUy236 v




Текст должен остаться неизменным
Баги
●   Домены не могут начинаться на “-” (тире)
●   RFC не последняя инстанция (//)
●   Разные наборы символов для query string и
    для пути
Надежность
●   Не дает 100%-покрытия на границах (где
    обычно все самое вкусное)
●   Не факт, что будут выявлены критичные
    баги
●   Но...
●   Вы можете прогнозировать поведение
    программы в стресс-режиме
Применимость
●   Применим на стыках взаимодействия
    программ (форматы файлов, передача
    данных, внешние события)
●   Очень сильно помогает выявить на раннем
    этапе то, что может “завалить” программу в
    боевом режиме
Вопросы?

Пример fuzzy testing для поиска URL в тексте

  • 1.
    Пример fuzz testingдля поиска URL в тексте Николай Ходов (nkhodov@gmail.com)
  • 2.
  • 3.
  • 4.
    Задача ● В произвольном тексте: ● Найти все URL'ы
  • 5.
    Бесплотные попытки А как же вот это?! ● ya.ru ● It.s.bori.ng ● vk.com/durov ● Google.com/#plus-plus ● //st.domain.com/?q=1 https?://(.*?) ● И еще миллионы вариантов...
  • 6.
    Пишем регулярку RFC 1738 + (https?://)?<domain>{1,3}.<TLD>(/<path>)*(?<query_string>?)(#<hashtag>?)?
  • 7.
    Тестируем вручную ● self.assertEqual(strip_links('word1 https://ya.ru word2'), 'word1 word2') ● self.assertEqual(strip_links('word1 domain.arpa/test.link word2'), 'word1 word2') ● self.assertEqual(strip_links('word1 ya.ru/yandsearch? sdfsdfsdf=1fsdf word2'), 'word1 word2') ● self.assertEqual(strip_links('word1 naked.domain.asia word2'), 'word1 word2') ● … ● На 15 строке мозг усиленно отказывается что-либо придумывать.
  • 8.
    Пусть тестирует самкомпьютер! Fully Random URL Kwh89 ydhfj 09 u ><LAKSUy236 v Текст должен остаться неизменным
  • 9.
    Баги ● Домены не могут начинаться на “-” (тире) ● RFC не последняя инстанция (//) ● Разные наборы символов для query string и для пути
  • 10.
    Надежность ● Не дает 100%-покрытия на границах (где обычно все самое вкусное) ● Не факт, что будут выявлены критичные баги ● Но... ● Вы можете прогнозировать поведение программы в стресс-режиме
  • 11.
    Применимость ● Применим на стыках взаимодействия программ (форматы файлов, передача данных, внешние события) ● Очень сильно помогает выявить на раннем этапе то, что может “завалить” программу в боевом режиме
  • 12.