Я таки бегло глянул формат, и мне показалось, что worksheet-ы идут в один файл. Если это не так, изменения тривиальны, если вообще не сводятся к изменению названия одного символа… В общем, получается примерно так: OdsExporeterTests >> testGeneratesSubDocuments | exporter actualResult | exporter := OdsExporter new. [ :contentGenerator :styleGenerator :rootGenerator :zipper | exporter contentGenerator: contentGenertor; styleGenerator: styleGenerator; rootGenerator: rootGenerator; zipper: zipper. [actualResult := exporter generate: #worksheets with: #style] should strictly satisfy: [ (contentGenerator generate: #worksheets) willReturn: #contentsFile. (styleGenerator generate: #style) willReturn: #styleFile. (rootGenerator generateContent: #contentsFile withStyle: #styleFile) willReturn: #rootFile. (zipper zip:(Set with: #rootFile with: #contentFile with: #styleFile)) willReturn: #odsFile ] ] runScenario. actualResult should be: #odsFile. Название теста не очень удачное, но пока сойдет — по необходимости потом можно поменять. -- Best regards, Dennis Schetinin 2 декабря 2014 г., 12:54 пользователь Юрий Мироненко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Все так плохо? :) -- Best regards, Dennis Schetinin 2 декабря 2014 г., 15:01 пользователь Dennis Schetinin <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Все так плохо? :) А? Просто немного зашиваюсь что-то. Не доходят руки. Если речь вообще о том, о чём я подумал. 4 декабря 2014 г., 15:50 пользователь Dennis Schetinin <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Я про наши экзерсисы с TDD :) … Если к крайнему примеру нужны пояснения, я готов их дать. Может быть, это просто совпадение, но почему-то примерно на этой стадии нередко все заканчивается. Возникает ощущение, что тесты с моками отбивают всякое желание продолжать. Хотя, на самом деле все довольно просто. -- Best regards, Dennis Schetinin 7 декабря 2014 г., 17:09 пользователь Юрий Мироненко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Ну на самом деле тут скорее приближающийся конец года...но, тем не менее, даже беглый взгляд подсказывает, что там используется какой-то пакет для этих самых моков. #runScenario и т.п. Что за пакет-то? 8 декабря 2014 г., 8:27 пользователь Dennis Schetinin <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Mocketry [http://www.smalltalkhub.com/#!/~dionisiy/Mocketry], конечно! :) Автор присутствует здесь, ежели чо… На мой взгляд, там все читается как обычный английский. Если это не так — готов подробно прокомментировать. Сейчас скажу, что параметры блока сценария (:contentGenerator :styleGenerator :rootGenerator :zipper) превращаются в моки. -- Best regards, Dennis Schetinin 8 декабря 2014 г., 14:56 пользователь Юрий Мироненко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
понедельник, 8 декабря 2014 г., 22:19:21 UTC+4 пользователь chaetal написал:
Не хочу ловить на слове, наверняка занятого человека..., но мне лично было бы весьма интересно... как то был грешок, пытался разобраться, но сходу не одолел... (всё, что попадалось на английском.., я его и в школе-то не проходил, а чего нахватался видимо недостаточно, хочется на простом великом и могучем ;) -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Начинаем с чистого листа разработку систему экспорта таблиц в ODS формат. Что мы хотим получить? Некий объект, который умеет "генерить" ODS-файлы:
Я пока не знаю, что такое ODS-файл, так что использую самую простую заглушку (в виде символа). Но надо понять, откуда берется этот самый ODS-файл? В соответствии с документацией, это результат зипования нескольких файлов, а именно контента, стиля (могут быть еще, но эти два, как я понял, обязательны) и файла с общим описанием — корневого файла. Следовательно в процессе генерации мне понадобится объект, который будет зиповать, и он должен получить соответствующее сообщение с перечнем зипуемых файлов; то, что он вернет в ответ на это сообщение и будет результирующим ODS-файлом:
===== Отступление ===== Добавленная структура имеет вид:
Возможность сказать системе, что в процессе выполнения некоторых действий (первый блок) должны быть выполнены следующие действия (второй блок) — как раз и обеспечивает нам Mocketry (или любой другой фреймворк, реализующий mock objects). Собственно, мок — это объект, который создается внутри теста и сначала сохраняет ("записывает") полученные сообщения как "ожидания", а затем — в процессе выполнения теста — проверяет, что ожидания действительно были выполнены:
Фреймворк сначала включит стадию "записи", в ходе которой выполнит второй блок, отследит получение объектом mock сообщения #someMessage и запомнит это как "ожидание". Затем фреймворк перейдет на стадию "воспроизведения" и выполнит первый блок. Если в процессе ее выполнения mock получить сообщение #someMessage, то ожидание будет помечено как выполненное. Если мок получает неожиданное сообщение, то тест проваливается. Если не все ожидания выполнены, то тест проваливается. Наряду с записью ожиданий моки записывают свою реакцию, которую затем воспроизводят в случае выполнения ожидвания, например:
Когда объект mock получит сообщение #someMessage, будет возвращено #expectedResult в качестве ответа. И, к примеру, проверка типа
будет успешно выполнена. Mocketry использует концепцию "сценария" чтобы… создать что-то вроде среды для выполнения теста с моками… (Денис Кудряшов, наверное, лучше объяснит этот момент, но она нужна. :) Эта самая среда создается "внутри" блока, если ему послать сообщение #runScenario. То есть, типичный тест с моками выглядит так:
Превращение параметров блока-сценария в моки фреймворк берет на себя. ===== Конец отступления ===== Откуда берется zipper? О нем должен знать наш exporter. Моки заставляют нас делать такие зависимости явными (то есть, использовать Dependency Injection в чистом виде, как я понимаю?). Соответствующим образом дописываем:
Теперь задаем себе вопрос: а откуда взялись #rootFile, #contentFile, #styleFile? Очевидный ответ напрашивается: они должны быть тоже сгенерированы. Кем? Соответствующими компонентами, которые тоже придется добавить (так как у нас нет других подходящих объектов, которым можно было бы приписать соответствующую функциональность). Добавив их, мы столкнемся с вопросом "а из чего они генерят файлы?" Тогда мы поймем, что генерация ODS-файла должна выполняться для определенного контента (worksheet-ов) и с заданным стилем… Ну, вроде, и все — приходим к этом тесту, попутно лишь изменив его название: OdsExporeterTests >> testGeneratesSubDocuments | exporter actualResult | exporter := OdsExporter new. [ :contentGenerator :styleGenerator :rootGenerator :zipper | exporter contentGenerator: contentGenertor; styleGenerator: styleGenerator; rootGenerator: rootGenerator; zipper: zipper. [actualResult := exporter generate: #worksheets with: #style] should strictly satisfy: [ (contentGenerator generate: #worksheets) willReturn: #contentsFile. (styleGenerator generate: #style) willReturn: #styleFile. (rootGenerator generateContent: #contentsFile withStyle: #styleFile) willReturn: #rootFile. (zipper zip:(Set with: #rootFile with: #contentFile with: #styleFile)) willReturn: #odsFile ] ] runScenario. actualResult should be: #odsFile. Как-то так… -- Best regards, Dennis Schetinin 8 декабря 2014 г., 23:04 пользователь Ремизов Александр <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Проблема с этим примером в том, что "зиппер" уже существует. И у него есть свой, вполне определенный API. И лепить какой-нибудь адаптер туда было бы совершенно излишне. 9 декабря 2014 г., 11:52 пользователь Dennis Schetinin <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Разумеется, я в состоянии писать примеры только с позиции своих знаний. Про уже существующий "зиппер" мне не известно. Если расскажите про его API, пример можно будет адаптировать соответствующим образом.
-- Единственная трудность, с которой можно столкнуться — вопрос о том, надо ли "мочить" (ударение на первом слоге) уже существующий объект. Этот вопрос в общем случая для меня пока открыт. Каких-то существенных противопоказаний этому я обычно не вижу. Впрочем, открыт и вопрос об "обертывании" уже существующих объектов — в определенных случаях это оказывается вполне оправданной практикой. Но общего правила я для себя пока не обнаружил — принимаю решение каждый раз с учетом конкретных условий. Вместе с тем, есть более-менее устоявшаяся схема размышлений на подобные ситуации:
То есть, решение принимается не исходя из каких-то априорных (с точки зрения текущей задачи) предпочтений, а из чисто практических побуждений. -- Best regards, Dennis Schetinin 9 декабря 2014 г., 21:30 пользователь Юрий Мироненко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Yuriy Mironenko
Я слежу за этой веткой с самого ее создания. В свое время вопрос с TDD
и вообще тестированием был очень болезненным. Доходило до шумных
скандалов с руководителем (кстати присутствующем здесь) при его попытках
ввести тестирование на проекте. На основании опыта работы в том
проекте, и работы с текущим собственным проектом в котором я на первых
порах то же пытался ввести тестирование я сделал такие выводы:
-- 1. Для того что бы использовать TDD надо обладать очень специфичным складом ума. Думать от обратного надо уметь, все таки большинство людей привыкли к последовательному а не обратному мышлению. TDD как я его понял подразумевает изначальное написание теста охватывающего максимальный функционал разрабатываемого объекта. Вместо объекта подсовывается некий волшебный ящичек который выполняет требуемую функцию. Затем пишется более детальный тест, дописыватся обвязка ящичка, возможно (а в большинстве случаев именно так и происходит) переписывается вся предыдущая обвязка, и так пока ящичек не перестанет быть нужным. Наверное так можно писать когда четко знаеш что у тебя должно получится в конце.В реальной жизни же так почти никогда не бывает. В начале работы обычно не знаеш что получится на выходе и с чем столкнешся. Есть общее понимание что хотим получить, и в процессе разработки вырисовывается четкая картина реализации. При этом очень часто бывает что она сильно отличается от первоначальной. Тут и подводные камни которые невозможно обойти без изменения изначальной концепции, и какие - то озарения или мысли пришедшие в процессе, да и много еще причин. В случае с TDD это подразумевает переписывание кучи тестов, на и практически всего кода, поскольку как мы помним мы начали с общего случая,и при изменении общей идеи (ну или конечного результата) ломается все уже сделанное. Так что TDD неверное хорош, но в сказке. 2. Автоматические тесты - зло (а вот за это меня побьют). Попробую обосновать. 2.1 100% покрытие тестами невозможно. Так же невозможно помнить (в случае с большим проектом) что покрыто тестами а что не покрыто. Но при разработке помня о том что есть тесты полноценное ручное тестирование не производится. Соответственно не покрытый тестами функционал не тестируется. Отдута и лезет максимальное количество ошибок. С моей точки зрения правильнее четко осознавать свои деиствия и понимать с какими классами и объектами ты работаеш. Не работать сразу с большим количеством классов. Чаше тестировать ручками последствия своих деийствий и стараться понимать к чему они могут привести. Ну и действия с существующим кодом производить только в случае необходимости. Не надо если вам почему- то не понравилось имя класса его менять, то же касается названий методов и переменных. Ну и конечно (но это опять таки мое личное мнение) обязательная проверка входных данных в методах. Например проверка на nil не отнимет много времени, но часто спасает. Даже если по первоначальной задумке там его быть не может. 2.2 Наиболее частые ошибки возникают в UI. Ни и тестирование UI исамое сложное если не невозможное дело. К тому же действия пользователя практически невозможно предсказать. как пример приведу один багрепорт: LAD, Контроллер любой Вот и скажите реально ли такое протестировать. 2.3. Написание тестов неоправданно увеличивают время разработки. Опять таки на личном опыте могу сказать что написание тестов на метод по времени превышает написание самого метода в 3-5 раз в зависимости от сложности метода. Во первых надо создать инстанс объекта, поставить необходимые заглушки и врапперы, а затем надо покрыть все возможные комбинации входных данных. В отдельных случаях на один метод пишется до десятка тестов. В сложном случае при попытке 100% покрытия конечный код просто никогда не будет написан. Ну и естественно при необходимости изменения поведения объекта всю эту кучу тестов необходимо переписывать. В случае развивающегося динамичного проекта использование тестирования ставит на этом проекте крест. Я предпочитаю использовать разработку через дебаг -с моей точки зрения наиболее быстрый способ разработки. Но вот только он никак не сочетается с тестированием и тем более с TDD. Ну а теперь можете приступать к избиванию))))) среда, 26 ноября 2014 г., 18:29:43 UTC+5 пользователь Assargadon написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
6 января 2015 г., 19:58 пользователь Сергей Глушенко <[hidden email]> написал: Для того что бы использовать TDD надо обладать очень специфичным складом ума. Думать от обратного надо уметь <…> Наверное так можно писать когда четко знаеш что у тебя должно получится в конце.В реальной жизни же так почти никогда не бывает. В начале работы обычно не знаеш что получится на выходе и с чем столкнешся. Алиса: – Куда мне отсюда идти? Надо обладать специфичным складом ума, чтобы представлять, куда ты (скажем, впервые) направляешься, не имея возможности представить себе все нюансы маршрута? TDD не предполагает какого-либо особого склада ума. Этот подход всего лишь заставляет в каждый момент времени понимать конечную цель своих действий — еще до начала этих самых действий. 2. Автоматические тесты - зло <…> 1… 2… 3… Автомобили зло, потому что: 1. На них можно доехать не до любой точки 2. Чаще всего мы хотим прибыть в какое-либо помещение, а на автомобиле туда заехать невозможно 3. Автомобиль требует массу времени: его надо заправлять, заводить, ремонтировать. Теперь, внимание, вопрос: а какое все это отношение имеет к автоматизации? ввести тестирование на проекте Не устану повторять: TDD и тестирование — принципиально разные вещи. Как автоматизация и автомобиль — даже несмотря на то, что у них общий корень "авто". -- Best regards, Dennis Schetinin -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
TDD не предполагает какого-либо особого склада ума. Этот подход всего лишь заставляет в каждый момент времени понимать конечную цель своих действий — еще до начала этих самых действий. Возможно в небольших проектах и можно четко представлять себе конечную цель. Заранее продумать всю архитектуру, состав классов и взаимодействие между ними. Но в этом случае проект получится статическим. Его нельзя будет малой кровью модернизировать или где ни будь в середине пути свернуть в сторону. Я год назад начиная свой проект не представлял во что он выльется, имел только смутное представление что я хочу. И теперь я не представляю чем он будет через год. Общая архитектура за это время менялась уже много раз и от базовой архитектуры практически ничего не осталось. Многие связи, и решения как раз возникают в процессе решения задач, а не перед началом работы над задачей. В случае с TTD сначала надо четко себе представить что будет в конце и идти выбранным путем несмотря ни на что. То есть сначала надо очень долго продумывать будущую реализацию. В процессе продумывания можно просто потерять интерес к задаче. Ну или процесс построения будущей архитектуры растянется на непомерно большое время. и не факт что результат будет удачным. Но свернуть то нельзя, потому что изменения тянут за собой глобальные переделки тех же тестов написанных в процессе разработки через TDD. вторник, 6 января 2015 г., 23:00:14 UTC+5 пользователь chaetal написал:Ну есть и еще один минус TDD который объеденяет его с тестированием. Глобальное замедление процесса разработки. Посмотрим на реальном примере из моего проекта (полько вчера пробовал). Есть обект - блок генератора импульсов. Он может параметрироваться. То есть он может быть одновибратором, симметричным генератором, несимметричным генератором. в казачестве параметров в первом и втором случаях выступает длительность включенного состояния, в третем случае параметров два - длительность включенного и длительность выключенного состояния. Длительность может задаваться либо в милисекундах либо в микросекундах. каждый из параметров может быть либо константой, либо читаться со входа. Для создания скетча (результата работы компилятора) мне необходимо знать какую из функций добавить в скетчь - окончание выдержки в милисекундах или окончание задержки в микросекундах. Соответственно у объекта генератор реализуем метод
в соответствии с логикой TDD пишем первый тест (я свои эксперементы со злости удалил, так что описываю словами) Создаем Project. Создаем блок FBDGeneratorBlock. Добавляем его в проект Эта часть подымается родительскому классу что бы в последствии получать блок одним методом блоку говорим что он одновибратор говорим ему что параметр время включенного состояния будет константой. ставим ему параметр время включенного состояния 1000 милисекунд. проверяем что метод isNeededMicrosTimerUtilityFunction возвращает false реализация метода что бы тест стал зеленый
кстати реализация метода
Второй тест Создаем блок блоку говорим что он одновибратор говорим ему что параметр время включенного состояния будет константой. ставим ему параметр время включенного состояния 1000 микросекунд. проверяем что метод isNeededMicrosTimerUtilityFunction возвращает true Второй тест Создаем блок блоку говорим что он одновибратор говорим ему что параметр время включенного состояния будет константой. ставим ему параметр время включенного состояния 1000 микросекунд. проверяем что метод isNeededMicrosTimerUtilityFunction возвращает true Реализация метода не меняется поскольку метод
Третий тест Создаем блок блоку говорим что он одновибратор говорим ему что параметр время включенного состояния будет вход. ставим ему параметр время включенного состояния 1000 милисекунд. проверяем что метод isNeededMicrosTimerUtilityFunction возвращает false Реализация метода не меняется поскольку метод
..... в результате получилось более двадцати тестов на один метод конечный код:
С той работой с которой я обычно справляюсь за час я провозился день и то до конца не сделал. Ближе к шести вечера (а работаю я с восьми до восьми) я разозлился снес к чертям пакет SUnit вместе со всеми тестами и быстренько все доделал. Я честно пытался понять прелесть TDD но либо я дурак, либо что то в TDD не то. Неприятно считать себя дураком, поэтому я и написал здесь. Может я что то не понимаю, и кто то сможет мне объяснить в чем прелесть использования TDD. По результатам моего небольшого эксперимента он жестко ограничивает свободу разработчика, при этом являясь огромным тормозом в скорости разработки.
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Прежде чем продолжить, Сергей, объясните пару моментов. Во-первых, почему вы используете логику с побочным эффектом вместо нормальных & и | ? Возможно, здесь скрывается что-то, чего я не понимаю, и потому мои дальнейшие рассуждения тоже будут неверными. Во-вторых, если я правильно понял, isNeededMicrosTimerUtilityFunction есть логическая функция от четырёх аргументов:
Поскольку, судя по названиям элементов, там Boolean, всевозможных комбинаций - 16, а вы говорите о 20+ тестах. Откуда берутся дополнительные тесты? 7 января 2015 г., 8:08 пользователь Сергей Глушенко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Просто я не стал разворачивать методы onConstantIsMicros и offConstantIsMicros. Их результат зависит от типа параметра. Это вход или константа. Соответствено эти варианты необходимо проверять. И второй вопрос - я не понял а что такое логика с побочными эффектами. Если Вы имеете в в виду что при использовании self a or:[self b] если а возвращает - true блок or выполняться и метод b просто не вызовется , то это и является основной прелестью такого подхода. Я стараюсь по возможности везде использовать такую конструкцию. Например если если а возвращает - true то не важно что возвращает метод b, он вызываться не будет -- С уважением, Сергей Глушенко 07.01.2015, 11:23, "Юрий Мироненко" <[hidden email]>: -- -- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Сергей Глушенко
CONTENTS DELETED
The author has deleted this message.
|
По поводу Васи тут двоякая ситуация. В той же ситуации с релизом и багой. Петя а почему ты не написал тест?. Как возможно не проверить ситуацию при ручной проверке, то точ но так же и возможно просто не написать тест на эту ситуацию. Только без тестов Вася с Петей занимаются выпуском версий выполняя полезную работу, а в случае качественного тестирования и поддержания тестов в рабочем состоянии занимаются только этим. И релиза от них не дождешся. Если на каждый чих надо переписать тонну кода то и чих то делать расхочется. Да и не согласен я с тем что написание тестов помогает Пете с пониманием проекта написанного Васей. Как бы не усложняет. Для тестов в классах приходится делать дополнительные вспомогательные методы, что то закрывается моками и врапперами. Да и общее количество кода необходимого для просмотра и понимания возрастает в разы. В базовом образе SmallTalk нет тестов, но между тем мы довольно таки легко находим нужные нам классы и методы. Я то же не помню что я делал год назад, так что при доработке старых классов могу сравнить себя с тем Петей. Вопрос в написании адекватных названий классов методов. Возможно не всегда правильных с точки зрения орфографии, но понятных с первого взгляда. Ну и при необходимости в особо сложных случаев написание комментов. Думаю это более простое и доступное решение чем документирование с помощью тестов.
-- я думаю из названий этих классов любому знакомому с предметной областью программистом будет все понятно
среда, 7 января 2015 г., 12:30:02 UTC+5 пользователь Vladimir Musulainen написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
In reply to this post by Yuriy Mironenko
Теперь, Денис, вопрос и тебе. Я тоже попадал в такую ситуацию, даже писал расширение для SUnit для генерирования разных комбинаций входных параметров. Но у меня была задача проще - грубо говоря, надо было, чтобы пустая строчка и nil считались бы одним и тем же. Очевидное решение здесь - написать таблицу истинности и по ней всё проверить. В одном тесте, не в двадцати :) Но тут возникает очевидный вопрос: уж если есть таблица истинности, то проще считать её реализацией метода, а не его проверкой. 7 января 2015 г., 9:23 пользователь Юрий Мироненко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Изначально у меня то же в этом методе было что то вроде таблицы истинности (пришол как раз через эксперимент с TDD) но затем знание о виде конкретного параметра мне понадобилось в компиляторе и было вынесенно в метод. Да и вообще реализация конкретного метода мне кажется расскажет о его работе быстрее и понятнее чем куча тестовых методов вокруг него. С моей точки зрения главное стараться делать методы максимально короткими. Сложные конструкции надо сразу же выносить в отдельные методы, тогда и работа конкретного метода будет сразу понятна с первого взгляда и никакие тесты не нужны будут
-- среда, 7 января 2015 г., 13:55:19 UTC+5 пользователь Assargadon написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Добавлю небольшую ремарку. Тесты не влияют на производительность приложения, они находятся как-бы в стороне.7 января 2015 г., 15:12 пользователь Сергей Глушенко <[hidden email]> написал:
-- http://groups.google.ru/group/sugr --- Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group". Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email]. Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout. |
Free forum by Nabble | Edit this page |