@ru_python

Страница 313 из 9768
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
но к слову, после пары статей я не сильно-то и искал.

самое время упомянуть https://hypothesis.readthedocs.org/
Оно позволяет в тесты скормить кучу сгенерёных по каким-то правилам данных, но при это тесты нужно так написать, чтобы они не зависили от входных данных?

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 мне понравился больше других

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% покрытие"

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

там и эксплоратори тестинг и эксплоратори рефакторинг и прочее такое рассматривается

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
bash для сильных духом.
Это перл ведь сплошной

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

Pavel
13.02.2016
19:06:01
sed от перла в читаемости недалеко ушёл, не?
особенно, если три грепа и awk в однострочник переписывать.

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
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 можно, да

Страница 313 из 9768