kmmbvnr ([info]kmmbvnr) wrote,
@ 2006-11-20 16:29:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:ideas, tests

Разрозненные мысли о тестировании.
Подходы пропагандируемые в TDD, и то что многое считают Unit тестами - это разные вещи. В Test Driven Development - тесты это способ мышления, нельзя создать программу не написав тесты. Писать тесты до написания кода - легко, писать unit тесты после - скучно, бессмысленно и зачастую невозможно.

Тесты всякие нужны, тесты всякие важны.

В традиционном TDD потери времени на написание тестов нет по определению.

Думать тестами я не привык. Можно предположить что многим это тоже тяжело.

Возможностью автоматизированного тестирования <= Низкая связность <= Хорошая архитектура. Обратная цепочка, тоже зачастую имеет место быть.

Оценивать связность с точки зрения тестов проще.

Для раннего обнаружения проблем тесты не обязаны тестировать все. Сразу не обнаруженная сложная ошибка в нижнем уровне, как снежный ком - лавиной обрушит самые банальные тесты верхнего. Но перед исправлением, тест придется все-таки написать :).

Тесты документируют ошибки. Написал тест, исправил, прогнал тест - гарантия что на эти грабли больше не наступишь не только ты но и твои товарищи (Особенно важно при рефакторинге).

Рефакторинг без тестов <=> Сам себе злобный буратина.

Сделал рефакторинг, не компилируется тест - повод сообщить об изменениях и способах переноса старого кода друзьям по команде.

Пре и пост условия - это не автоматизированные тесты (ударение делать на любое слово по вкусу). К ним все равно необходим набор автоматических сценариев.

В отличие от самопальных решений, unit тесты - это отраслевой стандарт оформления автоматических сценариев. Для них есть поддержка со стороны IDE.

Тесты автоматизируют труд разработчика, дополняя своей специфичной функциональностью IDE. Тесты подсвечивают места ошибок. Тесты упрощают дебаг. Один клик и ты в месте проблемы.

Нет хорошего кода, есть код который легко переписать. Тесты один из путей достижения легкости.

В Lingvo есть отдельная статья - "Легкотестируемый - Easy-to-test"

Крылья, ноги - главное мозги, все равно тесты не гарантируют успеха.

Четыре больших буквы IMHO перед каждым безапелляционным утверждением касающегося разработки программного обеспечения, можно опускать только в своем личном ЖЖ.




(33 comments) - (Post a new comment)


[info]thesz
2006-11-20 11:34 am UTC (link)
Тесты, как и типы, выводимы из программы.

(Reply to this) (Thread)


[info]kmmbvnr
2006-11-21 04:44 am UTC (link)
Основой всякого бытия является «единое», которое само по себе лишено каких-либо признаков, не имеет частей, то есть ни начала, ни конца, не занимает какого-либо пространства, не может двигаться, поскольку для движения необходимо изменение, то есть множественность; к нему неприменимы признаки тождества, различия, подобия и т. д. О нём вообще ничего нельзя сказать, оно выше всякого бытия, ощущения и мышления. В этом источнике скрываются не только «идеи», или «эйдосы», вещей, но и сами вещи, их становление.

(с) Платон.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-21 04:52 am UTC (link)
А своими словами? И я имею в виду не идеи Платона, а отношение к выведению тестов.

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-21 08:27 am UTC (link)
Я к тому что идеи автоматического вывода автоматических тестов из области воздушных замков. Оно вроде бы почему бы нет - на на практике... Что-то я мельком слышал о какой-то системе, основанной на конечных автоматах, но сейчас нагуглить не могу.

Вобще я сильно сомневаюсь, что вариант автоматически сгенеренного теста будет помошником при ручном дебаге.

И и опять же, в классическом TDD, автоматически сгенерированные тесты не нужны.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-21 08:40 am UTC (link)
http://thesz.livejournal.com/346839.html - это раз

http://www.ipl.com/products/tools/pt400.uk.php - это два, хотя это и не совсем то, что я искал.

Я всё понимаю про классическое TDD. Но считать его хоть сколько-нибудь нормальным методом отказываюсь. Как и парное программирование, например. ;)

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-21 10:11 am UTC (link)
>>http://www.ipl.com/products/tools/pt400.uk.php - это два, хотя это и не совсем то, что я искал.

Такое я тоже не люблю, это дурацкая попытка проконтролировать неконтролируемое... и куча гемора с разгребанием, почему данная "фигня" вдруг перестала работать.

(Reply to this) (Parent)


[info]kmmbvnr
2006-11-21 10:44 am UTC (link)
Кстати, а что делать в случае рефакторинга?

Я изменил программу, предыдущие автоматически выведенные тесты не подходят... опять запускать генератор? Но это будут уже не те тесты...
И как осуществляется гарантия того что найденная тестами и исправленная ошибка - действительно исправлена?

Random testing - да важен в конце, когда надо проверить устойчивость продукта, но на этапе разработки и поддержки почти бесполезен.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-21 10:46 am UTC (link)
Откель мне знать? Я предпочитаю "корректно по построению."

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-21 11:07 am UTC (link)
Вы программы никогда не меняете? Хм..

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-21 12:11 pm UTC (link)
Меняю. Корректными трансформациями. ;)

(Reply to this) (Parent)(Thread)


[info]levgem
2006-11-27 05:28 am UTC (link)
светлая мечта. Корректные трансформации… Удачи вам, если у вас получается провести их корректно!

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-27 10:10 am UTC (link)
Рекомендую ознакомиться с языком Хаскель (http://haskell.org/). В нём надо стараться, чтобы провести их некорректно.

(Reply to this) (Parent)


[info]levgem
2006-11-27 05:29 am UTC (link)
«корректно по построению» — что гарантия?

(Reply to this) (Parent)(Thread)


[info]thesz
2006-11-27 10:19 am UTC (link)
Построение.

Язык Haskell, на котором я пишу последнее время практически всё, является надстройкой из синтаксического сахара над типизированым лямбда-исчислением. Которое, в свою очередь, было построено логиками (Алонсо Чёрчем, Шёнфинкелем и Карри) для изучения процесса вычислений и формального построения алгоритмов.

Откуда следует, что я пользуюсь логикой в чистом виде, что и помогает мне в корректном построении программы.

(Reply to this) (Parent)


[info]levgem
2006-11-25 07:35 pm UTC (link)
«Система, основанная на конечных автоматах» — это высокотеоретические посторения математической кибернетики, которые ставят своей высокой целью получить автоматические тесты из формальных описаний. А на самом деле весь смех в том, что для получения таких тестов надо создать правильные формальные описания. Которые создать правильно у человека не получится.


Автоматически создавать тесты невозможно

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-27 04:59 am UTC (link)
Тесты бывают всякие...

Есть несколько важных с точки зрения практики случаев с просто описываемыми формальными требованиями - regresshion tests, random tests.

(Reply to this) (Parent)(Thread)


[info]levgem
2006-11-27 05:27 am UTC (link)
Вы сами сталкивались с этим? Интересен именно опыт

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-27 01:38 pm UTC (link)
Про random тесты где-то читал восторженную статью. Их стали применять в интеле после знаменитого косяка с операциями с плавающей точкой.

Regression test'ы нет не применял.

(Reply to this) (Parent)(Thread)


[info]levgem
2006-11-27 02:33 pm UTC (link)
Ясно, поищу про random тесты.

(Reply to this) (Parent)(Thread)


(Anonymous)
2007-01-05 12:07 pm UTC (link)
вот интересный пост со ссылками про random tests - http://www.findinglisp.com/blog/2004/10/random-testing.html

(Reply to this) (Parent)


[info]thesz
2006-11-27 10:22 am UTC (link)
Кибернетика к Computer Science отношение имеет отдалённое. Использование словосочетания "высокотеоретические построения математической кибернетики" многое прояснило, спасибо.

Вопросов больше не имею. Желания рассказывать и приводить опровержения - тоже.

(Reply to this) (Parent)(Thread)


[info]levgem
2006-11-27 10:27 am UTC (link)
Дешевый и пустой выпендреж многое прояснил. Дальше слушать это смысла нет. Спасибо

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-11-27 01:55 pm UTC (link)
Есть задачи где Haskell несомненно рулит, есть задачи... хм если можно так выразится с runtime типизацией.. как только у вас в коде появляются явные runtime управляющие конструкции if when case, где ОО(П), и статически выводимая типизация идет боком там жизненно необходимы тесты.

Избавляться от runtime конструкций, скрывая их в виртуальных методах или выводимых типах это здорово.

Но я пока не уверен, что такое всегда возможно и что такое "тестовое" покрытие кода будет достаточно для практических нужд.

(Reply to this) (Parent)


[info]grundik
2006-12-21 07:50 am UTC (link)
Сорри, что поздно это увидел :)

Нельзя строить тестирование на основе данных из тестируемой системы, потому что любые данные в тестируемой системе могут быть неверны.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-12-21 08:36 am UTC (link)
Ну да, ну да.

Любые данные вне тестируемой системы могут быть неверны.

(Reply to this) (Parent)(Thread)


[info]grundik
2006-12-21 08:40 am UTC (link)
Данные вне системы контролируются тестером, в отличие от.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-12-21 08:42 am UTC (link)
В отличии от данных внутри системы, контролируемых программистом, да, теперь вижу.

(Reply to this) (Parent)


[info]kmmbvnr
2006-12-22 03:47 am UTC (link)
Идея в том что сами тесты очень просты - один тест один вариант использования... ошибки на виду!

Сложность кода _всегда_ больше сложности тестов.

(Reply to this) (Parent)(Thread)


[info]thesz
2006-12-22 09:27 am UTC (link)
Любимый пример: как тестами проверить уникальность (она же - линейность)?

Когда ссылка на некоторый объект не должна передаваться или копироваться.

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-12-22 12:17 pm UTC (link)
Любимый ответ - если я не могу протестировать тестами 1% потенциальных багов почему я должен отказываться от тестов?

(Reply to this) (Parent)(Thread)


[info]thesz
2006-12-22 12:41 pm UTC (link)
"Вы всегда отвечаете вопросом на вопрос?"

Любимое продолжение дискуссии: если я могу отловить системой типов 95% потенциальных багов, должен ли я прибегать к тестам?

Кстати. В программах на Си невозможно протестировать правильность распределения памяти. Это не один процент, и даже не 10.

(Reply to this) (Parent)(Thread)


[info]kmmbvnr
2006-12-25 07:08 am UTC (link)
>>"Вы всегда отвечаете вопросом на вопрос?"
Баян

>>Любимое продолжение дискуссии: если я могу отловить системой
>>типов 95% потенциальных багов, должен ли я прибегать к тестам?
Ну не верю, не верю.. 95% может быть для каких-то специфичных программ... но не для всех. Программа может вести себя с виду корректно, но это поведение не будет отвечать поставленному техзаданию.

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

Кстати даже сборщик мусора тоже не спасает от утечек памяти. Единственный вариант который я знаю, позволяющий проконтролировать утечки - запустить сценарий на выполнение несколько десятков раз и посмотреть на динамику роста потребляемой памяти.

Вопрос на засыпку - как с помощю контрактов проконтролировать soft realtime системы?


(Reply to this) (Parent)(Thread)


[info]thesz
2006-12-25 10:03 am UTC (link)
Угу, создатели валгрида и баундсчекера рыдают... Очень большой толк от этих тулзов появляется только тогда - когда есть возможность время от времени автоматически запускать тонны мелких сценариев, и контролировать результат.

См. "linear type systems" и "region inference Cyclone".

Циклону ничего из валчекеров не нужно.

Вопрос на засыпку - как с помощю контрактов проконтролировать soft realtime системы?

См. Languages that capture complexity classes. Например.

(Reply to this) (Parent)


(33 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…