Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Юниттесты как механизм обучения #29

Open
Vlad-Shcherbina opened this issue Jul 29, 2014 · 4 comments
Open

Comments

@Vlad-Shcherbina
Copy link
Owner

Роль тестов в целом это отдельная большая тема, а тут хотел рассказать об одном очень необычном экспириенса. Я вообще ненавижу юниттесты и подумать бы не мог, что когда-нибудь буду писать их к функции на питоне которая считает длину списка, и радоваться что у меня вообще есть такая возможность!

Изначально к программированию на КП я подходил с большим недоверием: что если я неправильно понимаю значение какой-нибудь стрёмной конструкции (кстати, car(x) и cdr(x) должны были быть x[0] и x[1], ну да ладно); или компилятор делает какое-нибудь допущение которое я нарушаю, и вместо того чтобы упасть с ассёртом тихо порождает некорректный код?
Но по мере того как я писал простые функции и тесты к ним, выстраивая необходимую стандартную библиотеку, это недоверие очень быстро развеялось. И когда я подошёл к написанию собственно AI (который юниттестить очень сложно потому что надо окружение моделировать), я уже чувствовал себя достаточно комфортно с КП чтобы просто фигарить.

код

Выводы:

  • когда я буду учить новый язык программирования, я попробую писать много юниттестов (тестируя как бы не код а своё понимание его)
  • если хотите чтобы вашими инструментами пользовались, приделывайте к ним очень короткий фидбэк луп
@yole
Copy link
Collaborator

yole commented Jul 29, 2014

Это не единственный профит юнит-тестов. В условиях контеста, когда много фигачишь и плохо соображаешь, они сильно помогают не тупить. То есть, сформулировать, чего ты пытаешься добиться, в качестве юнит-теста и потом писать код, который его пройдет - это меньшее умственное усилие, чем писать код и при этом держать задачу в голове.

@manpages
Copy link
Collaborator

Юнит-тест — это повторение логики программы на языке юнит-тестового фреймворка, от ошибок в логике оно не спасает. В этой ветке, однако, означены два важных аспекта юнит-тестов в контексте ICFPC.

Для полноты добавлю еще один (очевидный) — когда за несколько часов до конца кто-то (хе-хе) ломает продакшен, юнит-тесты при хорошем покрытии немедленно это замечают и сообщают строку, где всё сломалось.

Кстати, у меня была проблема экстремального чтения логов юниттестов, поскольку стектрейсы были в каких-то стрёмных местах и не запайпав аутпут тестов в файлик, в котором фиг знает что искать, я не мог найти собственно стектрейс. Но это мой косяк, надо конечно освежать инструменты второго питона ежегодно (в чём кстати еще один бонус проведения буткемпов #31).

@fj128
Copy link
Collaborator

fj128 commented Jul 29, 2014

Юнит-тест — это повторение логики программы на языке юнит-тестового фреймворка, от ошибок в логике оно не спасает.

Да, но это два разных языка, и второй гораздо более to the point. Ты говоришь что должно получиться, а не как это сделать.

Ещё кстати в принципе есть разница между unit tests, and integration/functionality tests. Юниттесты по идее должны чётко указать где у тебя ошибка. 99% наших тестов были functionality tests, и это хорошо, потому что при наших объёмах кода найти ошибку в общем не так сложно, но очень не хочется писать код который мешает рефакторингу потому что вдобавок к перефигачиванию интерфейса и нескольких имплементаций ещё нужно будет перефигачить все юнит-тесты во всех имплементациях.

Кстати пример: половина тестов для Yoleвского GCC были конкретно юнит-тестами (прямой вызов функции интерпретатора вместо call(...)), поэтому когда я попытался применить к своему гцц, я испытал жопаболь и не применил.

@fj128 fj128 closed this as completed Jul 29, 2014
@fj128 fj128 reopened this Jul 29, 2014
@yole
Copy link
Collaborator

yole commented Jul 29, 2014

Да, юнит-тесты, которые используют mocks и дословно повторяют реализацию, действительно отстой и не нужны. Про реюз моих тестов для других реализаций я не думал, и, наверное, зря - можно было бы сделать, и было бы не сильно сложнее.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants