
Aragaer
13.02.2016
17:24:39
у меня вон в моем проекте все тесты проходят, но внезапно словил где-то нуллпоинтер (ну .. жава, не питон, но суть та же)
ща буду смотреть по цепочке, где такое могло случиться, но вместо дебага это будут ассерты же
а когда закончу, этот тест останется жить

Whore Amazing
13.02.2016
17:45:34
я понимаю.

Google

Pavel
13.02.2016
18:03:07
"я хочу написать функцию, которая будет вычислять мегарезультат. Если вызвать с аргументом 0, то вернет 0, поэтому напишу такой тест. Фэйл - еще нет никакой функции. Пишу функцию, в ней pass. Фэйл - None это не 0. Заменяю на return 0, тест пройден. Но я-то знаю, если я напишу тест, что от 1 оно равено 2, то пофейлится. Пишу. Фейл. Заменяю на if arg==1: return 2; return 0
вот этот вечный пример в тдд вымараживает.
"у меня функция считае x^2, поэтому я пишу if x==0 return 0, if x==1 return 1, if x==2 return 4, все тесты зелёные, потом я отдаю в тест x=3 всё падает и я наконец-таки пишу нормальный код. "
Ёба, да напиши ты сразу нормально, зачем эти промежуточные итерации? ТДД придумали для дебилов, которые не могут код сразу написать, а рожают через муки, промежуточные этапы и примерные приближения?
я не против тестов вообще, но подход "test first" - для меня очень спорен.

Artem
13.02.2016
18:06:15
самое время упомянуть https://hypothesis.readthedocs.org/

Aragaer
13.02.2016
18:08:01
Ващета я сказал - если я смотрю на код и вижу, что могу придумать кейз, когда он фейлится, я пишу такой тест. А после двух ифов я переписываю и делаю квадрат.
а тдд да, идеально подходит для случаев "я еще не знаю, что я там хочу, но на выходе хочу видеть вот такой результат"

Pavel
13.02.2016
18:11:31

Violett
13.02.2016
18:12:01
Спс ребята, отличный чат, читаю вас каждый день

Pavel
13.02.2016
18:12:11
но к слову, после пары статей я не сильно-то и искал.

finkel
13.02.2016
18:18:50
есть еще бдд

Pavel
13.02.2016
18:19:52
есть еще бдд
это там где тесты пишутся в свободной писменной форме?

finkel
13.02.2016
18:20:34
ну тесты по разному можно писать, но подход в том что ты не конкретный метод тестишь а функционал
типа "зашел на страницу, получил ответ 200ок, увидил форму регистрации с такими то полями"

Google

Pavel
13.02.2016
18:22:46
ну это уже интеграционные тесты, маленько более сложнее, чем юниттесты. Чуть другое, дополняющее, но не отменяющее.

finkel
13.02.2016
18:26:14
ну да, интеграционные тесты

Aragaer
13.02.2016
18:38:26
бдд это тесты от поведения. А конкретная реализация может быть разной. Есть например тесты по таблицам, но обычно вспоминают про язык gerkin, который через Given-When-Then
и там не совсем свободная форма - каждой "фразе" теста соответствует действие на нормальном языке программирования, поэтому при написании таких тестов ты по сути составляешь их из набора фиксированных формулировок
для питона я использовал с этой целью behave. Есть другие реализации, но именно behave мне понравился больше других

Pavel
13.02.2016
18:40:53

Aragaer
13.02.2016
18:40:59
нормально
опять же есть вариант "лондонское тдд", где двойной цикл тдд - поведенческие тесты снаружи, юнит тесты внутри. И логично их писать в разных фреймворках
не особо ограничивает, но такие тесты больше интеграционные - ты не будешь писать "когда я вызываю функцию f с аргументом 5"
зато будет "если есть текстовый файл с содержимым абвгд и я выполняю приложение, то появляется другой файл с содержимым йклмн"
и надо адекватно создавать энвайронмент, который такое сможет обработать

Pavel
13.02.2016
18:43:57
но зачем ещё один язык программирования тестов, если их уже есть целая прорва?

Aragaer
13.02.2016
18:44:13
у меня например был тест для веба, там через селениум тыркался интерфейс и была проверка openid, так пришлось писать свою минимальную реализацию опен айди
а он уже давно существует
и он читабелен для простых смертных
писать на нем простые смертные не смогут на самом деле
но если программер сядет вместе с простым смертным, простой смертный будет озвучивать свои хотелки, а программер сразу переводить их в геркин и записывать, то они друг друга поймут

Pavel
13.02.2016
18:45:24
а чё бы код веб-сервисов не делать читабельными для простых смертных? ?

Whore Amazing
13.02.2016
18:45:37
получится 1С

Aragaer
13.02.2016
18:46:10
простой смертный придет в ужас от @handler(/admin) def admin: return "hello, world"

Google

Aragaer
13.02.2016
18:46:39
а вот When I go to '/admin' Then I see "hello, world" - это ок

Pavel
13.02.2016
18:49:01
Если люди нашли применение этому в своей практике, то ок. Пусть хоть как тесты пишут, в прозе, в картинках, в обычном коде - главное чтобы тесты были. ?

Aragaer
13.02.2016
18:50:09
вот я слышал про тулзу fitnesse или типа того. Там создаются таблички типа как в вики и транслируются в тесты
простой смертный зашел в вики по проекту и видит ожидаемый результат. А тулза делает проверку в точности по этой таблице

Pavel
13.02.2016
18:51:31
геркин для тех, кто не осилил его не сложный англиский?

Игорь
13.02.2016
18:55:41
Скажите вот про тесты и тдд

Aragaer
13.02.2016
18:56:29
геркин можно и по-русски на самом деле

Игорь
13.02.2016
18:56:39
Как вообще врубиться, на что имеет смысл писать тесты, а на что нет? Или добиваться 100% покрытия?

Pavel
13.02.2016
18:56:57

Aragaer
13.02.2016
18:57:04
если уже есть код, который работает, нафига туда тесты?
а там целиком фразы только имеют смысл
ну .. местами дублировать

Aragaer
13.02.2016
18:57:45
тестировать надо то, в чем ты не уверен
есть такая штука - exploratory testing кстати

Игорь
13.02.2016
18:58:03

Aragaer
13.02.2016
18:58:09
тебе дали код, ты его посмотрел и думаешь, что он ведет себя так-то

Pavel
13.02.2016
18:58:13

Aragaer
13.02.2016
18:58:22
пишешь тест, чтобы это проверить
ну в смысле код уже есть, а тестов еще нет. Добавлять тесты к уже написанному коду это чисто украшательство для "а у нас 100% покрытие"

Pavel
13.02.2016
18:59:24

Google

Aragaer
13.02.2016
18:59:41
есть книжка working effectively with legacy code, которая на самом деле это и рассматривает - у меня есть адский код и мне надо с ним работать, но я боюсь поломать, а тестов нету
там и эксплоратори тестинг и эксплоратори рефакторинг и прочее такое рассматривается

Игорь
13.02.2016
19:00:38

Aragaer
13.02.2016
19:01:31
ну я такие конструкции без всяких тестов переписываю - например цепочка из 3 седов и 3 грепов превращается в 1 сед или 1 авк
потому что я не боюсь это сломать
тесты нужны чтобы не бояться менять код - "работает - не трогай" говорят в том случае, если тестов нету. Если есть - "трогай, но вот чтобы тесты оставались зелеными"

Игорь
13.02.2016
19:02:31
Я недавно сломал например
Не предусмотрел возврат пустой строки

Pavel
13.02.2016
19:03:57
bash для сильных духом.

Admin
ERROR: S client not available

Игорь
13.02.2016
19:04:28

Pavel
13.02.2016
19:05:09
sed от перла в читаемости недалеко ушёл, не?

Игорь
13.02.2016
19:05:24

Pavel
13.02.2016
19:06:01

Aragaer
13.02.2016
19:11:06
нет, сед вполне ок, там нет зубодробительных конструкций
там конечно все команды однобуквенные, но их мало

Pavel
13.02.2016
19:12:03
с awk спутал.

Игорь
13.02.2016
19:13:27
Так вот, как вообще писать тесты для методов/фитнес, обрабатывающих реальные данные
Функций

Aragaer
13.02.2016
19:13:43
ну просто бывает такое:
cat file | grep 'pattern' | awk '{print $2}' | sed 's/thing/other/g'
ну как, граничные условия в первую очередь

Google

Pavel
13.02.2016
19:14:09

Игорь
13.02.2016
19:14:21

Aragaer
13.02.2016
19:14:28
смотреть на код и думать - а вот сломается ли оно, если подать -1? А если -1000000?
не, моки это вместо сложных объектов, чтобы проверить, что у них дергаются нужные куски

Игорь
13.02.2016
19:14:55
Не слишком ли жирно это для многих случаев?

Aragaer
13.02.2016
19:15:29
ну еще раз - я смотрю на функцию и мне вот с ходу понятно, как она работает - ну зачем тут тесты?
не, некоторые для 100% покрытия напишут тесты чтобы на каждую ветку
я не буду

Pavel
13.02.2016
19:16:12

Aragaer
13.02.2016
19:16:32
но может быть я посмотрю на функцию и у меня возникнет вопрос "а как она себя поведет, если я подам туда 100? Должно получиться 28. О, надо ж, не упала."
есть разница между моком и стабом
стаб это "вместо сложной штуки лежит более простая"
а мок это "вместо сложной штуки лежит мой ручной мутант, у которого я всегда могу спросить, что именно с ним творила эта функция"

Pavel
13.02.2016
19:17:59
чё-то очень тонкая грань, кмк.

Aragaer
13.02.2016
19:18:30
стаб не подразумевает проверку того, что оно вызывалось и с нужными параметрами, а мок именно для этого и нужен в первую очередь

Sergey
13.02.2016
19:19:13
Я дожил до момента когда в python-чате говорят о python ))

Aragaer
13.02.2016
19:19:33
в питоне unittest.mock содержит клевый декоратор patch, который позволяет что угодно на ходу подменить моком, вызвать функцию с параметром Х, а потом спросить у мока "ну что, тебя правда вызвали с параметром Y?"
более конкретно - "ну что, функция правда пыталась полезть в инет на урл http://google.com/?search=Vasya Pupkin"

Pavel
13.02.2016
19:21:23
А можно не спрашивать, и получить поведение стаба?

Aragaer
13.02.2016
19:21:25
а делается это путем замены urllib.urlretrieve на мок.
через patch можно, да