Представляю стартовый продукт для тестирования приложений http://TestMeCode.com
На сегодня поддержка только языка Delphi.
Но возможно использовать в языках C++,C#,Basic , ну и любые с использованием СОМ интерфейса.
Для этого нужно переписать демо примеры и добавить в документацию.
Операционная система: Windows
32-х битные приложения. (64 бит не проблема, но хотелось бы стартовать именно с 32 битами )
Документация:
— Только на сайте.
Что сделано: TestCode
— Тестирование классов, методов, приложений, как одного, так и несколько одновременно. TestSend
— Расщиренное использование отладочных сообщений. Используется для отладки как одной запущенной версией приложения, так и нескольких (для каждой копии приложения можно использовать свое окно)
— Возможно пользоваться "скрытыми" отладочными сообщениями, которые будут отправляться только по условию. Tools
— Пока только калькулятор программиста, которым постоянно пользуюсь.
Цена:
Хочу сделать годовую подписку за 27-29 евро.
Смешные деньги, но думаю это послужит, с одной стороны, для распространения, с другой не большое, но стабильное финансовое вливание для дальнейшего развития.
Что сделано:
— Перенес сайт с домена TestMe-On.com на TestMeCode.com
— изменил структуру файлов
— убрал "embeded" использование TestMeCode32.dll
Что делается:
— Заказал продажную первую страницу на сайте, показывающую в картинках преимущества этого продукта, но пока не сделали.
— После порки, буду заказывать перевод на английский и если позволят финансы, то хочу еще добавить еще несколько языков. В порядке приоритетов: немецкий, французский и испанский.
Хочу посоветоваться:
1. Что в первую очередь "причесать" для старта продаж?
2. Для приема денег выбрал PPG, но не знаю как интегрируется у них подписка и интересуют "подписочные" тарифы. Может есть другой регистратор специализирующийся на подписках?
3. Для небольшой защиты использую VMProtect, но как использовать это в подписке, еще не продумал.
4. Что делать с форумом? Был форум, утонул в спаме. Какими движками пользуйтесь? Как минимизировать спам? Как первом этапе защитить форум от спамеров, без мониторинга 24х7.
Здравствуйте, C0x, Вы писали:
C0x>TestComplete умеет и с вэбом работать и смобайл вроде как.
Конечно, я с этим не спорю.
Я почитывал их форум, там тоже было ясно видно, что тестирование десктопных приложений составляет малую часть от всего объема тестирования. Предостерегаю топикстартера.
C0x>А аналог это ты сильно махнул.
Хорошо, что я никогда не слушал никого, кто говорил мне, что "это глупо делать"
Кстати, и меня слушать тоже не надо, хе-хе. В общем, это все просто разговоры.
C0x>Я просто прагматично тут пытаюсь оценить. Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
Это только кажется. Много проектов выглядят, как сделанные командой разработчиков, а некоторые даже действительно сделаны командой разработчиков, а на самом деле там работы на год.
Здравствуйте, Garamzin, Вы писали:
G>Представляю стартовый продукт для тестирования приложений http://TestMeCode.com G>На сегодня поддержка только языка Delphi.
Дельфи. Ну, допустим. Лучше не допускать, конечно, но тем не менее.
G>Хочу сделать годовую подписку за 27-29 евро.
Залей видос минут на 5 кратко показывающий что это такое вообще и кому оно нужно. Я в тестировании не первый день, но так и не понял что именно и как тестируется. Это типа аналог TestComplete?
Ясно, что продукт помогает тестировать, но о каком именно тестировании идет речь? Главная страница должна сразу "продавать".
Кто три твои главных конкурента? Посмотри, как сделаны их сайты.
Одно время я собирался делать аналог TestComplete для тестирования десктопа, но, пообщавшись с людьми, которые занимаются тестированием (рекомендую найти по linkedin хотя бы дюжину тестировщиков, которые возьмутся использовать продукт хотя бы забесплатно — да, удивительно, но даже бесплатный продукт приходится продавать, и это непросто) понял, что сейчас фокус в тестировании сильно сместился в сторону веба и mobile.
Я зашёл на сайт и пока ничего не понял, притом что я в принципе мог бы заитересоваться чем-то подобным. Вам нужна какая-то галерея на сайте, ил краткое понятное объяснение сути предлагаемых фич.
Вот картинка с вашего сайта:
Объясните на пальцах, что конкретно происходит в этом окне, если действительны вылавливаются баги в классе TCalc.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>Одно время я собирался делать аналог TestComplete для тестирования десктопа, но, пообщавшись с людьми, которые занимаются тестированием (рекомендую найти по linkedin хотя бы дюжину тестировщиков, которые возьмутся использовать продукт хотя бы забесплатно — да, удивительно, но даже бесплатный продукт приходится продавать, и это непросто) понял, что сейчас фокус в тестировании сильно сместился в сторону веба и mobile.
TestComplete умеет и с вэбом работать и смобайл вроде как. Там модули нужно ставить. А аналог это ты сильно махнул.
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>Здравствуйте, C0x, Вы писали:
C0x>>TestComplete умеет и с вэбом работать и смобайл вроде как.
U_E>Конечно, я с этим не спорю.
U_E>Я почитывал их форум, там тоже было ясно видно, что тестирование десктопных приложений составляет малую часть от всего объема тестирования. Предостерегаю топикстартера.
C0x>>А аналог это ты сильно махнул.
U_E>Хорошо, что я никогда не слушал никого, кто говорил мне, что "это глупо делать"
Я просто прагматично тут пытаюсь оценить. Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
Здравствуйте, Garamzin, Вы писали:
G>Представляю стартовый продукт для тестирования приложений http://TestMeCode.com
"Это комплекс утилит состоящий из функционала тестирования, помощи в отладке."
vs
"Комплекс состоит из утилит для функционального тестирования и помощи в отладке."
Я правильно перевел?
Из описания понял, что программа помогает. Но больше ничего не понял.
Как помогает? Что конкретно можно делать? Какие задачи решает и как именно (одно в связке с другим)?
Надо примеры. Да и видео бы не помешало с демонстрацией особо востребованных фич.
Но пока нет этого, хотябы фичи перечислил текстом по пунктам...
Вообще конечно сайт не продает от слова — совсем.
Ничего не понял, пошел в FAQ, Там я понял что тот, кто создал сайт или надо мной издевается или не хочет ничего продать.
Вам реально часто задают вопросы, которые указаны в FAQ? Издеваетесь?
Что? Сайт на русском а цена в евро? Точно издеваетесь...
Здравствуйте, Garamzin, Вы писали:
G>Представляю стартовый продукт для тестирования приложений http://TestMeCode.com
К сожалению, не понял, какую именно задачу тестирования продукт решает.
Разрабатываю софт уже довольно давно. Главная страница требует переработки, IMHO.
Пока впечатление от сайта такое, как будто динозавр, использующий Delphi в 2019 году, вылез из подвала и решил поробовать продать свои пожитки
G>Хочу посоветоваться: G> 1. Что в первую очередь "причесать" для старта продаж?
Написать зачем и кому оно может пригодиться.
G> 2. Для приема денег выбрал PPG, но не знаю как интегрируется у них подписка и интересуют "подписочные" тарифы. Может есть другой регистратор специализирующийся на подписках? G> 3. Для небольшой защиты использую VMProtect, но как использовать это в подписке, еще не продумал.
PPG поддерживает подписки, почитай их доки, или напиши им в саппорт, должны помочь.
G> 4. Что делать с форумом? Был форум, утонул в спаме. Какими движками пользуйтесь? Как минимизировать спам? Как первом этапе защитить форум от спамеров, без мониторинга 24х7.
Этот вопрос на старте вообще не актуален. То есть, форум не нужен.
Он имеет смысл, если у продукта уже есть заметное коммьюнити.
Иначе поддержки достаточно.
Здравствуйте, Sharowarsheg, Вы писали:
S>Здравствуйте, C0x, Вы писали:
C0x>>Я просто прагматично тут пытаюсь оценить. Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
S>Это только кажется.
Я точно это знаю. Лет 10 ими пользуюсь, давно (еще до покупкой их американцами) с ними общался.
S>Много проектов выглядят, как сделанные командой разработчиков, а некоторые даже действительно сделаны командой разработчиков, а на самом деле там работы на год.
Как думаешь:
1. Сколько у тебя займет написать более-менее внятный редактор javascript, vbscript, python script?
2. Сколько у тебя займет времени Дебаггер написать для перечисленных выше языков.
3. Сколько у тебя займет времени написать извлечения дерева контролов из MFC приложения? (я им для этого пользовался, сейчас для WPF).
4. Сколько для WPF?
5. Запись сценариев, проигрывание.
...
...
Здравствуйте, C0x, Вы писали:
S>>Это только кажется.
C0x>Я точно это знаю. Лет 10 ими пользуюсь, давно (еще до покупкой их американцами) с ними общался.
А я такие писал, для внутреннего пользования, когда работал в конторе. Нихрена там сложного нет.
S>>Много проектов выглядят, как сделанные командой разработчиков, а некоторые даже действительно сделаны командой разработчиков, а на самом деле там работы на год.
C0x>Как думаешь: C0x>1. Сколько у тебя займет написать более-менее внятный редактор javascript, vbscript, python script? C0x>2. Сколько у тебя займет времени Дебаггер написать для перечисленных выше языков.
Почему ты думаешь, что у них это всё внятное? Я помню, когда я пользовался им, я только матерился, там где была необходимость писать что-то на языках внтури этой штуки. Это, может, года четыре назад было, может пять. Может, с тех пор исправили, но я уже им не пользуюсь. Проще взять или Lua, или C# сразу, и позволить нормальные плагины подключать. В этом Testcomplete единственно работавший и не падавший способ что-то сделать кастомное был написать экзешник и шеллом вызывать его.
Такую штуку написать можно за месяц без проблем, с той надёжностью, которая тогда была, а на самом деле проще интерфейсы наружу выставить и дать всем писать на своих языках.
C0x>3. Сколько у тебя займет времени написать извлечения дерева контролов из MFC приложения? (я им для этого пользовался, сейчас для WPF).
Недели за три я писал, ничего сложного. Сиди да извлекай. Это, кстати, недели три вместе с записью и проигрыванием кликов.
C0x>4. Сколько для WPF?
Не знаю, не пробовал.
C0x>5. Запись сценариев, проигрывание.
Здравствуйте, Sharowarsheg, Вы писали:
S>Здравствуйте, C0x, Вы писали:
C0x>>Я просто прагматично тут пытаюсь оценить. Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
S>Это только кажется. Много проектов выглядят, как сделанные командой разработчиков, а некоторые даже действительно сделаны командой разработчиков, а на самом деле там работы на год.
Делали не в Москве кстати, а в провинции, бе-бе-бе Разработчикам — респект и уважуха
Но это было фиг знает сколько лет назад, когда он еще 300 баксов стоил
S>В этом Testcomplete единственно работавший и не падавший способ что-то сделать кастомное был написать экзешник и шеллом вызывать его.
Согласен, работало криво очень часто, дебаггером было сложно пользоваться. Сейчас намного лучше. Но может потому-что это просто тяжело сделать? А так-то можно и Visual Studio за месяц запилить, только она скорее всего падать будет на каждом втором клике. Вообще написать решение и написать хорошо работающее решение это задачи разного уровня сложности.
S> а на самом деле проще интерфейсы наружу выставить и дать всем писать на своих языках.
У них есть такое, называется Connected Apps. Я кстати, только им и пользуюсь. У меня связка: Visual Studio/C#/SpecFlow/NUnit + Connected Apps для использования TestComplete прямо в сценарии тестов, написанных на C#, в ситуациях когда UI нужно дергать.
Но тут есть одна загвоздка с точки зрения бизнеса, т.к. они почему-то отказываются от этого решения (поэтому мне пришлось крякнуть их dll и добавить поддержку MSVS 2017, в оригенале её нет) и делают ставку на свою студию.
Здравствуйте, C0x, Вы писали:
S>>В этом Testcomplete единственно работавший и не падавший способ что-то сделать кастомное был написать экзешник и шеллом вызывать его.
C0x>Согласен, работало криво очень часто, дебаггером было сложно пользоваться. Сейчас намного лучше. Но может потому-что это просто тяжело сделать?
Ну, если не делать то, что тяжело, то и денег не получишь. Конечно, тяжело. Глупо было бы сделать калькулятор и думать о миллионе.
S>> а на самом деле проще интерфейсы наружу выставить и дать всем писать на своих языках.
C0x>Но тут есть одна загвоздка с точки зрения бизнеса, т.к. они почему-то отказываются от этого решения (поэтому мне пришлось крякнуть их dll и добавить поддержку MSVS 2017, в оригенале её нет) и делают ставку на свою студию.
Vendor lock-in это называется, скорее всего. Или просто в этой теме делать больше нечего, кроме как пилить студию, что тоже очень может быть. Для десяти человек в нише TestComplete тупо нет работы на 15 лет (или сколько им там? они же вроде начинали как AutomatedQA, если я не путаю).
Здравствуйте, Sharowarsheg, Вы писали:
S>Здравствуйте, C0x, Вы писали:
S>>>В этом Testcomplete единственно работавший и не падавший способ что-то сделать кастомное был написать экзешник и шеллом вызывать его.
C0x>>Согласен, работало криво очень часто, дебаггером было сложно пользоваться. Сейчас намного лучше. Но может потому-что это просто тяжело сделать?
S>Ну, если не делать то, что тяжело, то и денег не получишь. Конечно, тяжело. Глупо было бы сделать калькулятор и думать о миллионе.
S>>> а на самом деле проще интерфейсы наружу выставить и дать всем писать на своих языках.
C0x>>Но тут есть одна загвоздка с точки зрения бизнеса, т.к. они почему-то отказываются от этого решения (поэтому мне пришлось крякнуть их dll и добавить поддержку MSVS 2017, в оригенале её нет) и делают ставку на свою студию.
S>Vendor lock-in это называется, скорее всего. Или просто в этой теме делать больше нечего, кроме как пилить студию, что тоже очень может быть.
Просто они поняли что продукт нужно делать для менее квалифицированных автотестеров. У нас например в конторе тестеры, вообще программировать никак никогда. А вот после того как в Тесткомплите появилось Human Readable запись сценариев без скриптов (они под капотом), то уже начинают присматриваться.
S>Для десяти человек в нише TestComplete тупо нет работы на 15 лет (или сколько им там? они же вроде начинали как AutomatedQA, если я не путаю).
Здравствуйте, C0x, Вы писали:
S>>Для десяти человек в нише TestComplete тупо нет работы на 15 лет (или сколько им там? они же вроде начинали как AutomatedQA, если я не путаю).
C0x>TestComplete раньше был основной продукт. Сейчас это мелкая часть: http://skrinshoter.ru/s/140219/m6Oc6Qcl?a
Да, и вот на это всё 150 человеко-лет мне представляется избыточным.
Здравствуйте, C0x, Вы писали:
C0x>Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
у меня прямо сейчас две либы, созданные профессионалами, за большие деньги
судя по исходникам это писали студенты в ночь перед зачетом
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, Garamzin, Вы писали:
C0x>Залей видос минут на 5 кратко показывающий что это такое вообще и кому оно нужно. C0x> Я в тестировании не первый день, но так и не понял что именно и как тестируется.
Все это есть, поправил ссылку, на главной под картинкой. Подробнее
C0x> Это типа аналог TestComplete?
Да, подобное.
Здравствуйте, Nonmanual Worker, Вы писали:
NW>Сам пользуешься своим изделием? Если честно я не понял какую проблему оно решает, хотя я разработчик.
Конечно.
Сейчас в продукте 2 функционала:
1. TestCode — тестирование кода. Проверка алгоритмов кода.
2. TestSend — получение отладочной информации.
В первом сообщении я более подробно написал.
Здравствуйте, autopsist, Вы писали:
A>"Это комплекс утилит состоящий из функционала тестирования, помощи в отладке." A>vs A>"Комплекс состоит из утилит для функционального тестирования и помощи в отладке."
Спасибо, заменил )
A>Надо примеры. Да и видео бы не помешало с демонстрацией особо востребованных фич. A>Но пока нет этого, хотябы фичи перечислил текстом по пунктам...
Под картинками ссылка "Подробнее".
Получается ее совсем не видно?
Переместил над картинкой.
A>Что? Сайт на русском а цена в евро? Точно издеваетесь...
Сайт для "порки" только на русском языке, в стартовом сообщении я написал, что он будет как минимум еще на английском, но хочу сделать для 4-5 языков.
Здравствуйте, Garamzin, Вы писали:
G>Хочу посоветоваться: G> 1. Что в первую очередь "причесать" для старта продаж? G> 2. Для приема денег выбрал PPG, но не знаю как интегрируется у них подписка и интересуют "подписочные" тарифы. Может есть другой регистратор специализирующийся на подписках? G> 3. Для небольшой защиты использую VMProtect, но как использовать это в подписке, еще не продумал. G> 4. Что делать с форумом? Был форум, утонул в спаме. Какими движками пользуйтесь? Как минимизировать спам? Как первом этапе защитить форум от спамеров, без мониторинга 24х7.
Посоветую для начала купить свою лицензию на VMProtect, а не пользоваться чужой.
Здравствуйте, icezone, Вы писали:
I>Здравствуйте, C0x, Вы писали:
C0x>>Тесткомплит создавался в России, коммандой очень крутых разработчиков. Поэтому тебе нужна как минимум комманда таких же крутых спецов.
I>у меня прямо сейчас две либы, созданные профессионалами, за большие деньги I>судя по исходникам это писали студенты в ночь перед зачетом
Что за либы если не секрет? Как проводишь оценку кода?
Была такая игра Duke Nukem 3D. Написал движок (самый передовой на то время) вот Сильверман Кен.
Мало того что он Дюка написал, так он еще до сих пор такие вещи на чистом ASM фигачит в свободное время, например воксельный движок, который летает без всяких 3D карт. А это я к тому, что те кто, смотрят на код Дюка Нюкема, ахреневают и говорят "Это что за п**ц???" и не могут вообще понять че там вообще написано.
Здравствуйте, Garamzin, Вы писали:
G>Вань, да я у тебя покупал несколько раз, первую версию из рук в руки от тебя получил в Екб G>Правда да-а-авно это было.
Ну вот ей и пользуйся, а друзей из Архи-Техно зачем подставлять?
Здравствуйте, C0x, Вы писали:
C0x>Что за либы если не секрет? Как проводишь оценку кода?
хотел в подробностях расписать, но проблема более общая
за последние два года я перебирал десятки библиотек — опенсорс, коммерческие, с закрытими исходниками
результат везде один — либо глючный спагетти-код, либо тормозной академический стиль, в котором авторы плодят лишние сущности
поэтому пред покупкой рекомендую глянуть исходники, пусть даже пиратские, чтобы потом не обжечься
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, Garamzin, Вы писали:
C0x>Залей видос минут на 5 кратко показывающий что это такое вообще и кому оно нужно. Я в тестировании не первый день, но так и не понял что именно и как тестируется. Это типа аналог TestComplete?
Это аналог не TestComplete а DUnit. Зачем автор написал второй DUnit, объяснить не может.
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, swame, Вы писали:
S>>Это аналог не TestComplete а DUnit. Зачем автор написал второй DUnit, объяснить не может.
C0x>Конкуренция всегда хорошо.
Да пусть, мне не жалко.
Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.
Здравствуйте, swame, Вы писали:
S>Здравствуйте, C0x, Вы писали:
C0x>>Здравствуйте, swame, Вы писали:
S>>>Это аналог не TestComplete а DUnit. Зачем автор написал второй DUnit, объяснить не может.
C0x>>Конкуренция всегда хорошо.
S>Да пусть, мне не жалко. S>Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.
А вдруг он вдохнет в него новую жизнь! А если просит деньги то обязан значит саппорт обеспечивать, баги фиксить, фичи добавлять. Деньги это ответственность.
Здравствуйте, Garamzin, Вы писали:
G>Хочу посоветоваться: G> 1. Что в первую очередь "причесать" для старта продаж?
Сделать современный сайт. Необязательно с супер дизайном, можно на обычном Bootstrap шаблоне, который будет выглядеть привычно для посетителей.
Заменить иконки в программе на современные, еще можно добавить dark theme.
Название довольно странное — Test me, Code? Если TestMyCode.com занят, то лучше придумать что-нибудь другое.
Здравствуйте, icezone, Вы писали:
I>Здравствуйте, C0x, Вы писали:
C0x>>Что за либы если не секрет? Как проводишь оценку кода?
I>хотел в подробностях расписать, но проблема более общая I>за последние два года я перебирал десятки библиотек — опенсорс, коммерческие, с закрытими исходниками I>результат везде один — либо глючный спагетти-код, либо тормозной академический стиль, в котором авторы плодят лишние сущности I>поэтому пред покупкой рекомендую глянуть исходники, пусть даже пиратские, чтобы потом не обжечься
Ну, любая немецкая машина к пенсии превращается в Опель Может просто у тебя ожидания завышены?
Imho, писателям опенсорсных библиотек, у которых есть заметное комьюнити, памятники надо ставить а не критиковать.
Код, который "обнять и плакать", не так уж и часто попадается..
G>Представляю стартовый продукт для тестирования приложений http://TestMeCode.com G>На сегодня поддержка только языка Delphi. G>Но возможно использовать в языках C++,C#,Basic , ну и любые с использованием СОМ интерфейса. G>Для этого нужно переписать демо примеры и добавить в документацию.
Для С++ не взлетит.
Юнит-тестирование в С++ уже довольно давно выполняется с помощью include-систем.
Ничего устанавливать не требуется, подключаешь нужный файл — и пиши себе юнит-тесты.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, swame, Вы писали:
S>Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.
Брррр, Вы о чем?
Вы тестированием занимались?
DUnit пользовались? Тесты САМИ делали?
Много общего?
Единственное, что на мой взгляд общего это фраза: "тестирование units" — Все!!!
В TestCode нет не только не одной строчки, даже символа из DUnit.
Но то, что для меня самое важно и почему я написал этот продукт и пользуюсь сам уже очень много лет, это то что он создан абсолютно по другим принципам.
И если Вы занимались тестированием, это сразу видно.
Я этот продукт делал в первую очередь для себя.
И написал его т.к. как раз DUnit и другие продукты тестирования, на тот момент, мне не давали тех возможностей, которые я хотел.
Где Вы там нашли обшее с DUnit я не представляю.
И тем более, на каком основании обвинять в плагиате, основываясь только на том, что продукт тоже тестирует код?
Так что могу процитировать Вас самих: S> — я в недоумении.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, swame, Вы писали:
S>>Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.
А>Вы тестированием занимались?
Занимался и продолжаю. Но я не тестер.
А>DUnit пользовались? Тесты САМИ делали?
Тесты для DUnit САМ делал
А>Много общего?
Принцип идентичный. Реализации разные.
А>Единственное, что на мой взгляд общего это фраза: "тестирование units" — Все!!! А>В TestCode нет не только не одной строчки, даже символа из DUnit.
Верю.
А>Но то, что для меня самое важно и почему я написал этот продукт и пользуюсь сам уже очень много лет, это то что он создан абсолютно по другим принципам. А>И если Вы занимались тестированием, это сразу видно.
А>Я этот продукт делал в первую очередь для себя.
Так уже есть еще хоть 1 пользователь?
А>И написал его т.к. как раз DUnit и другие продукты тестирования, на тот момент, мне не давали тех возможностей, которые я хотел.
Каких конкретно таких что было легче сделать свой продукт чем немножко допилить имеющийся?
А>Где Вы там нашли обшее с DUnit я не представляю.
Вижу только 2 различия
1. Движок тестирования вынесен в отдельное приложение — но это только недостаток.
2. Несколько более удобный синтаксис записи тестов по сравнению с DUnit.
Этого можно было бы достичь хелпером на несколько десятков строк.
Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием.
Известный, но несравнимо более зрелый аналог — CodeSite.
А>И тем более, на каком основании обвинять в плагиате, основываясь только на том, что продукт тоже тестирует код?
Ни в коем случае не обвиняю в плагиате — ведь не обвиняют же друг друга разработчики разных компиляторов С.
А>Так что могу процитировать Вас самих: S>> — я в недоумении. А>
Здравствуйте, bnk, Вы писали:
bnk>Ну, любая немецкая машина к пенсии превращается в Опель Может просто у тебя ожидания завышены?
нет, когда речь идет о пятизначной сумме, мои ожидания вполне объяснимы
bnk>Imho, писателям опенсорсных библиотек, у которых есть заметное комьюнити, памятники надо ставить а не критиковать.
я опенсорс уже давно избегаю, основные претензии к коммерческим продуктам
bnk>Код, который "обнять и плакать", не так уж и часто попадается..
Здравствуйте, swame, Вы писали:
А>>DUnit пользовались? Тесты САМИ делали? S>Тесты для DUnit САМ делал
Очень хорошо!
Попробуйте только на одну функцию сделать тест с помощью TestCode и сравнить с DUnit.
Если Вы регулярно делайте тесты, Вы увидите отличие.
Кроме этого 100 параметров, без покупки, вполне хватит для тестирования небольшого приложения.
Для полного, профессионального тестирования это конечно же мало, так как тесты в дальнейшем накладываются на все и вся.
Но для ознакомления или на первом этапе, вполне хватит.
Здравствуйте, Garamzin, Вы писали: G>Здравствуйте, swame, Вы писали: А>>>DUnit пользовались? Тесты САМИ делали? S>>Тесты для DUnit САМ делал G>Очень хорошо! G>Попробуйте только на одну функцию сделать тест с помощью TestCode и сравнить с DUnit. G>Если Вы регулярно делайте тесты, Вы увидите отличие. G>Кроме этого 100 параметров, без покупки, вполне хватит для тестирования небольшого приложения. G>Для полного, профессионального тестирования это конечно же мало, так как тесты в дальнейшем накладываются на все и вся. G>Но для ознакомления или на первом этапе, вполне хватит.
Вот пример типичного рутинного теста из моего кода сложнее калькулятора.
Как бы он выглядел в вашей системе?
Насколько проще?
Хотя бы на 20%?
Ладно, на 10%?
Код 1
function TTestBlocking.FindBlocking (const ABlockedKey, ABlockingKey, Msg: string;
var VBlocked, VBlocking: TVectorView; bExists : boolean = true): TBlockingInfo;
begin
VBlocked := (Scheme.FindLUni (ABlockedKey) as TNamedBlock).VOwnerFirst as TVectorView;
VBlocking := (Scheme.FindLUni (ABlockingKey) as TNamedBlock).VOwnerFirst as TVectorView;
CheckTrue (Assigned (VBlocked)); CheckTrue (Assigned (VBlocking), Msg + '.0');
Result := GetBlockingInfo(Scheme).FindBindingByID (VBlocked.TechMain.RTID, VBlocking.TechMain.RTID) as TBlockingInfo;
CheckTrue (Assigned (Result)= bExists, Msg + '.1');
end;
procedure TTestBlocking.TestBlocked (Bi: TBlockingInfo; const Msg: string;
BlockedBlocked, BlockingBlocked: boolean);
var
B : boolean;
begin//B := BI.BlkisBlocked;
B := BI.IsViewLocked2(nil, BI.FirstLink.Obj as TNamedBlock, DevNull_Str);
CheckTrue ( B = BlockedBlocked, Msg + '.1\');
//B := BI.CtlisBlocked;
B := BI.IsViewLocked2(nil, BI.SecondLink.Obj as TNamedBlock, DevNull_Str);
CheckTrue ( B = BlockingBlocked, Msg + '.2');
end;
procedure TTestBlocking.Test_Imer_CreateBlockingsWikat;
var
VC : array [0..3] of TVectorView;
LB : TBlockingInfo;
begin
OpenFile (1);
{выкатной выключатель}
LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
'Test_CreateBlockings 2.1');
TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
try
TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
finally
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
end;
{}
LB := FindBlocking ('ПС_Имелетинская_ЗН_СВ-43_10_кВ', 'ПС_Имелетинская_СВ_43_10_кВ',
'Test_CreateBlockings 2.2');
TestBlocked (LB, 'Test_CreateBlockings 2.2.11', true, false);
CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.2.12');
VC[0] := (Scheme.FindLUni ('#1142\\\Схема\СП 3 С СВ 43 10 кВ') as TnamedBlock).VrepFirst as TVectorView;
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
(VC[0] as TShassi).TrolleyState := tsService;
try
TestBlocked (LB, 'Test_CreateBlockings 2.2.13.1', false, false);
finally
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
(VC[0] as TShassi).TrolleyState := tsWork;
end;
{На секции 6-10 кВ если для ячеек потребителей не создавать блок с ЗН на секции}
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_1_С_Т-1',
'Test_CreateBlockings 2.3.1', true);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1143\\\Схема\полушасси[1]',
'Test_CreateBlockings 2.3.2', true);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1141\\\Схема\СП 1 С СВ 21 10 кВ',
'Test_CreateBlockings 2.3.3', true);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ТСН-1',
'Test_CreateBlockings 2.3.4', true);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им101',
'Test_CreateBlockings 2.3.5', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им103',
'Test_CreateBlockings 2.3.6', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им105',
'Test_CreateBlockings 2.3.7', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им107',
'Test_CreateBlockings 2.3.8', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им109',
'Test_CreateBlockings 2.3.9', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им111',
'Test_CreateBlockings 2.3.10', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им113',
'Test_CreateBlockings 2.3.11', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им115',
'Test_CreateBlockings 2.3.12', false);
LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ДГР-1',
'Test_CreateBlockings 2.3.13', false);
{блокировка с тележкой автомата}
LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ_ТСН-2', 'ПС_Имелетинская_АВ_0,4_кВ_ТСН-2',
'Test_CreateBlockings 2.4.1', true);
{блокировк c ВКЛ только рядом расположенного }
LB := FindBlocking ('ПС_Имелетинская_ЗН_БСК-1', 'ПС_Имелетинская_В_10_кВ_БСК-1',
'Test_CreateBlockings 2.4.1', false);
end;
Код 2
unit Protokol_Test;
interface
uses
SysUtils, math,
TestFramework, TypeViewsBuilder, SDETask3, SDETask.Run, Blank.Constant, Blank.Operation;
type
TTestProtokol = class(TTestCase)
private
B: TViewsBuilder;
procedure Setup10;
protected
procedure SetUp; override;
procedure TearDown; override;
function Task: TSDETaskRun;
function Protokol: TSDETask;
function MergedProtokol: TSDETask;
function PrintAStatus (const A: array of TScheduleStatus): string;
function PrintAсts (const A: array of integer): string;
function PrintTask (ATask: TSDETask): string;
procedure CheckMaxRate (Rate: integer);
procedure CheckRate (Rate: integer);
procedure CheckProtokol (Acts: array of integer; Schedule: array of TScheduleStatus; MaxRate, Rate: integer);
public
procedure AddCommand (ATask: TSDETask; Acts: array of integer); overload;
function AddCommand (ATaskNode: TTaskNode; Act: integer): TSDEOperation3; overload;
function AddAltNode (AlterOrder: TAlterOrder): TAltTaskNode;
procedure RenderTask (ATask: TSDETask);
procedure CheckCommand (ATask: TSDETask; Acts: array of integer);
procedure CheckSchedule (ATask: TSDETask; Acts: array of TScheduleStatus);
procedure CheckInvertCount (ATask: TSDETask; N: integer; Up: boolean; Cnt: integer);
published
procedure Test_Normal;
procedure Test_Miss_1;
procedure Test_Miss_3;
procedure Test_Miss_4;
procedure Test_Unecessary_1;
procedure Test_Unecessary_2;
procedure Test_Replace;
procedure Test_Repeat;
procedure Test_Other;
procedure Test_Groups;
procedure Test_Early_1;
procedure Test_Early_2;
procedure Test_Early_4;
procedure Test_Early_5;
procedure Test_Alt_Any_1;
procedure Test_Alt_All_1;
procedure Test_Alt_Strict_1;
procedure Test_Alt_Order_1;
procedure Test_Alt_Alternate_1;
procedure Test_Alt_Alternate_2;
end;
const
N = ssNormal;
M = ssMiss;
U = ssUnecessary;
E = ssEarly;
L = ssLate;
SScheduleStatus : array [TScheduleStatus] of string = ('N', 'M', 'U', 'E', 'L','M');
implementation
uses
Common,
SWApplication, IFaceForms, Views0, Constan, FloatType, PageList, Blanks_Form, Views0.Constant;
{ TTestProtokol }procedure TTestProtokol.SetUp;
begin
inherited;
Setup10;
end;
procedure TTestProtokol.TearDown;
begin
inherited;
end;
function TTestProtokol.Task: TSDETaskRun;
begin//Result := frmBlanksForm.frmBlankEditor.Task as TSDETaskRun;
Result := Tasks.CurrentTask;
end;
function TTestProtokol.Protokol: TSDETask;
begin//Result := (frmBlanksForm.frmBlankEditor.Task as TSDETaskRun).Protokol;
Result := Tasks.CurrentTask.CheckProtokol;
end;
function TTestProtokol.MergedProtokol: TSDETask;
begin//Result := (frmBlanksForm.frmBlankEditor.Task as TSDETaskRun).MergedProtokol;
Result := Tasks.CurrentTask.CheckMergedProtokol;
end;
procedure TTestProtokol.Test_Normal;
begin{совпадает протокол и бланк}
AddCommand(Task, [1, 2, 3, 4, 5]);
CheckCommand (Task, [1,2,3,4,5]);
AddCommand(Protokol, [1, 2, 3, 4, 5]);
CheckCommand (Protokol, [1,2,3,4,5]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
CheckSchedule (MergedProtokol, [N, N, N, N, N]);
CheckRate (11111);
CheckMaxRate (11111);
end;
procedure TTestProtokol.Test_Miss_1;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
AddCommand(Protokol, [2, 3, 4, 5]);
Task.LinkProtokol;
Task.MergeProtokol.Render;
//frmBlanksForm.frmProtokol.RenderBlank(MergedProtokol);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
CheckSchedule(MergedProtokol, [M, N, N, N, N]);
CheckMaxRate (11111);
CheckRate (11110);
end;
procedure TTestProtokol.Test_Miss_3;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
{пропущенные действия}
AddCommand(Protokol, [1, 2, 4, 5]);
Task.LinkProtokol;
Task.MergeProtokol.Render;
//frmBlanksForm.frmProtokol.RenderBlank(MergedProtokol);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
CheckSchedule (MergedProtokol, [N, N, M, N, N]);
CheckMaxRate (11111);
CheckRate (11011);
end;
procedure TTestProtokol.Test_Miss_4;
begin
AddCommand(Task, [1, 2, 3, 4, 5, 1]);
{пропущенные действия}
AddCommand(Protokol, [1, 2, 3, 4, 5]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 3, 4, 5]);
CheckSchedule (Protokol, [N, N, N, N, N, M]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 1]);
CheckSchedule (MergedProtokol, [N, N, N, N, N, M]);
CheckMaxRate (11112);
CheckRate (011111);
end;
procedure TTestProtokol.Test_Unecessary_1;
begin
AddCommand(Task, [1, 2, 3, 4, 5, 1]);
{лишние действия}
AddCommand(Protokol, [1, 2, 3, 4, 5, 6]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 3, 4, 5, 6]);
CheckSchedule (Protokol, [N, N, N, N, N, U]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 6]);
CheckSchedule (MergedProtokol, [N, N, N, N, N, U]);
CheckMaxRate (11112);
CheckRate (011111);
end;
procedure TTestProtokol.Test_Unecessary_2;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
{лишние действия}
AddCommand(Protokol, [1, 2, 3, 4, 5, 1]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 3, 4, 5, 1]);
CheckSchedule (Protokol, [N, N, N, N, N, U]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 1]);
CheckSchedule (MergedProtokol, [N, N, N, N, N, U]);
CheckMaxRate (11111);
CheckRate (11111);
end;
procedure TTestProtokol.Test_Replace;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
{лишние действия}
AddCommand(Protokol, [1, 2, 6, 4, 5]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 6, 4, 5]);
CheckSchedule (Protokol, [N, N, U, N, N]);
CheckCommand(MergedProtokol, [1, 2, 3, 6, 4, 5]);
CheckSchedule (MergedProtokol, [N, N, M, U, N, N]);
CheckMaxRate (11111);
CheckRate (11011);
end;
procedure TTestProtokol.Test_Repeat;
begin
AddCommand(Task, [1, 1, 1, 1, 1]);
{лишние действия}
AddCommand(Protokol, [1]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1]);
CheckSchedule (Protokol, [N]);
CheckCommand(MergedProtokol, [1, 1, 1, 1, 1]);
CheckSchedule (MergedProtokol, [N, M, M, M, M]);
CheckMaxRate (5);
CheckRate (1);
end;
procedure TTestProtokol.Test_Other;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
{лишние действия}
AddCommand(Protokol, [6]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [6]);
CheckSchedule (Protokol, [U]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 6]);
CheckSchedule (MergedProtokol, [M, M, M, M, M, U]);
CheckMaxRate (11111);
CheckRate (0);
end;
procedure TTestProtokol.Test_Groups;
begin
AddCommand(Task, [1, 2, 3, 4, 5, 3]);
{лишние действия}
AddCommand(Protokol, [1, 2, 4, 5, 3]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 4, 5, 3]);
CheckSchedule (Protokol, [N, N, N, N, N]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 3]);
CheckSchedule (MergedProtokol, [N, N, M, N, N, N]);
AddCommand(Protokol, [1, 2, 3, 4, 5, 3]);
Task.LinkProtokol;
Task.MergeProtokol;
CheckCommand(Protokol, [1, 2, 3, 4, 5]);
CheckSchedule (Protokol, [N, N, N, N, N]);
CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 3]);
CheckSchedule (MergedProtokol, [N, N, N, N, N, M]);
end;
procedure TTestProtokol.Test_Early_1;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
AddCommand(Protokol, [3, 1, 2, 4, 5]);
Task.LinkProtokol;
CheckInvertCount(Protokol, 0, false, 2);
CheckInvertCount(Protokol, 1, true, 1);
Task.CalcSchedule;
CheckSchedule(Protokol, [E, N, N, N, N]);
CheckMaxRate (11111);
CheckRate (11011);
end;
procedure TTestProtokol.Test_Early_2;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
AddCommand(Protokol, [1, 3, 2, 4, 5]);
Task.CalcSchedule;
CheckSchedule(Protokol, [N, E, N, N, N]);
CheckMaxRate (11111);
CheckRate (11011);
end;
procedure TTestProtokol.Test_Early_4;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
AddCommand(Protokol, [1, 2, 4, 3, 5]);
Task.CalcSchedule;
CheckSchedule (Protokol, [N, N, E, N, N]);
Protokol.Render;
//frmBlanksForm.frmProtokol.RenderBlank(Protokol);
CheckMaxRate (11111);
CheckRate (10111);
end;
procedure TTestProtokol.Test_Early_5;
begin
AddCommand(Task, [1, 2, 3, 4, 5]);
AddCommand(Protokol, [1, 2, 4, 5, 3]);
Task.CalcSchedule;
CheckSchedule (Protokol, [N, N, N, N, L]);
//frmBlanksForm.frmProtokol.RenderBlank(Protokol);
Protokol.Render;
CheckMaxRate (11111);
CheckRate (11011);
end;
function TTestProtokol.AddAltNode (AlterOrder: TAlterOrder): TAltTaskNode;
var
AN: TAltTaskNode;
Op1, Op2: TSDEOperation3;
begin
Task.Clear;
AN := Task.Operations.AddNodeN ('AltNode', TAltTaskNode) as TAltTaskNode;
AN.AlterOrder := AlterOrder;
Op1 := AddCommand (AN, 1);
Op1.Rate := 1;
Op1 := AddCommand (AN, 2);
Op1.Rate := 10;
Result := AN;
Task.Operations.Renumerate;
end;
procedure TTestProtokol.Test_Alt_Any_1;
begin
AddAltNode (aoAny);
CheckProtokol ([1, 2], [N, N], 11, 11);
CheckProtokol ([2, 1], [E, N], 11, 11);
CheckProtokol ([1], [N], 11, 1);
CheckProtokol ([2], [N], 11, 10);
end;
procedure TTestProtokol.Test_Alt_All_1;
begin
AddAltNode (aoAll);
CheckProtokol ([1, 2], [N, N], 11, 11);
CheckProtokol ([2, 1], [E, N], 11, 11);
CheckProtokol ([1], [N], 11, 0);
CheckProtokol ([2], [N], 11, 0);
end;
procedure TTestProtokol.Test_Alt_Strict_1;
begin
AddAltNode (aoStrict);
CheckProtokol ([1, 2], [N, N], 11, 11);
CheckProtokol ([2, 1], [E, N], 11, 0);
CheckProtokol ([1], [N], 11, 0);
CheckProtokol ([2], [N], 11, 0);
end;
procedure TTestProtokol.Test_Alt_Order_1;
begin
AddAltNode (aoOrder_);
CheckProtokol ([1, 2], [N, N], 11, 11);
CheckProtokol ([2, 1], [E, N], 11, 1); //??? или не засчитывать ничего ?
CheckProtokol ([1], [N], 11, 1);
CheckProtokol ([2], [N], 11, 10);
end;
procedure TTestProtokol.Test_Alt_Alternate_1;
begin
AddAltNode (aoAlternate);
CheckProtokol ([1, 2], [N, N], 10, 10);
CheckProtokol ([2, 1], [E, N], 10, 10); //??? [N, N] ?
CheckProtokol ([1], [N], 10, 1);
CheckProtokol ([2], [N], 10, 10);
end;
procedure TTestProtokol.Test_Alt_Alternate_2;
var
AN: TAltTaskNode;
Op1, Op2: TSDEOperation3;
begin(*
AddAltNode (aoAlternate);
Op1 := AddCommand (Task.Operations, 3);
Op1.Rate := 100;
Task.Operations.Renumerate;
CheckProtokol ([1, 2], [N, N], 10, 10);
CheckProtokol ([2, 1], [E, N], 10, 10); //??? [N, N] ?
CheckProtokol ([1], [N], 10, 1);
CheckProtokol ([2], [N], 10, 10);
AN := Task.Operations.AddNodeN ('AltNode', TAltTaskNode) as TAltTaskNode;
AN.AlterOrder := AlterOrder;
Op1 := AddCommand (AN, 1);
Op1.Rate := 1;
Op1 := AddCommand (AN, 2);
Op1.Rate := 10;
Result := AN;
Task.Operations.Renumerate;
*)end;
procedure TTestProtokol.Setup10;
var
i: Integer;
sdef: ISDEF;
V: TVectorView;
B: TViewsBuilder;
P: TPageList;
begin
sdef := App.SDEF(App.MainDoc);
sdef.Clear;
P := sdef.GetSchemeSet.ListWN[0];
sdef.GetSchemeBox.Data := P;
B := TViewsBuilder.Create(P, sdef.GetSchemeBox);
for i := 0 to 10 do
begin
V := B.AddView(tcWikl, FloatPoint(i * 5 + 10, 10), 0);
with V.CreateSubscript do
begin
SubscriptName := IntToStr(V.Tag);
SubscriptPosition := pBottom;
end;
//SubscriptColor.RGBColor := VViolet;end;
B.Free;
end;
function TTestProtokol.AddCommand (ATaskNode: TTaskNode; Act: integer): TSDEOperation3;
var
i: integer;
V: TVectorView;
sdef: ISdef;
P: TPageList;
Op: TSDEOperation3;
begin
sdef := App.SDEF (App.MainDoc);
P := sdef.GetSchemeSet.ListWN [0];
V := P.FindView (tcWikl, Act) as TVectorView;
Result := ATaskNode.AddOperationN ('Действие ' + IntToStr(Act), V.TechMain, 'положение', 'отключен');
RenderTask (ATaskNode.Task);
end;
procedure TTestProtokol.RenderTask (ATask: TSDETask);
begin
ATask.Render;
{if ATask = Task then
frmBlanksForm.frmBlankEditor.RenderBlank (ATask)
else if (ATask = Protokol) then
frmBlanksForm.frmProtokol.RenderBlank (ATask);}end;
procedure TTestProtokol.AddCommand(ATask: TSDETask; Acts: array of integer);
var
i: integer;
V: TVectorView;
sdef: ISdef;
P: TPageList;
Op: TSDEOperation3;
begin
sdef := App.SDEF (App.MainDoc);
P := sdef.GetSchemeSet.ListWN [0];
ATask.Clear;
for i := low (Acts) to high (Acts) do begin
V := P.FindView (tcWikl, Acts[i]) as TVectorView;
Op := ATask.Operations.AddOperationN
('Действие ' + IntToStr(Acts[i]), V.TechMain, 'положение', 'отключен');
if ATask = Task then
Op.Rate := round(IntPower(10, Acts[i]-1));
end;
ATask.Operations.Renumerate;
RenderTask (ATask);
end;
procedure TTestProtokol.CheckCommand (ATask: TSDETask; Acts: array of integer);
var
i: integer;
V: TVectorView;
sdef: ISdef;
P: TPageList;
S: string;
begin
sdef := App.SDEF (App.MainDoc);
P := sdef.GetSchemeSet.ListWN [0];
S := PrintTask (ATask) + PRet + PrintAсts (Acts);
for i := 0 to ATask.Operations.Count-1 do begin
V := (ATask.Operations.Nodes [i] as TSDEOperation3).Element;
CheckEquals (V.Tag, Acts [i], S);
end;
end;
procedure TTestProtokol.CheckMaxRate (Rate: integer);
begin
CheckEquals (Task.CalcMaxRate, Rate);
end;
procedure TTestProtokol.CheckRate (Rate: integer);
begin
CheckEquals (Task.CalcRate, Rate);
end;
procedure TTestProtokol.CheckProtokol (Acts: array of integer; Schedule: array of TScheduleStatus; MaxRate, Rate: integer);
begin
Protokol.Clear;
AddCommand(Protokol, Acts);
Task.LinkProtokol;
Task.CalcSchedule;
CheckSchedule (Protokol, Schedule);
Protokol.Render;
//frmBlanksForm.frmProtokol.RenderBlank(Protokol);
CheckMaxRate (MaxRate);
CheckRate (Rate);
end;
function TTestProtokol.PrintAStatus (const A: array of TScheduleStatus): string;
var
i: integer;
begin
Result := '';
for i := 0 to High (A) do
Result := Result + SScheduleStatus [A[i]] + ' ';
end;
function TTestProtokol.PrintAсts (const A: array of integer): string;
var
i: integer;
begin
Result := '';
for i := 0 to High (A) do
Result := Result + IntToStr (A[i]) + ' ';
end;
function TTestProtokol.PrintTask (ATask: TSDETask): string;
var
i: integer;
Op: TSDEOperation3;
begin
Result := '';
for i := 0 to ATask.Operations.Count-1 do begin
Op := ATask.Operations.Nodes [i] as TSDEOperation3;
Result := Result + Op.IIDS + ' ';
end;
end;
procedure TTestProtokol.CheckSchedule (ATask: TSDETask; Acts: array of TScheduleStatus);
var
i: integer;
Op: TSDEOperation3;
OpActs: array of TScheduleStatus;
begin
SetLength (OpActs, ATask.Operations.Count);
for i := 0 to ATask.Operations.Count-1 do begin
Op := ATask.Operations.Nodes [i] as TSDEOperation3;
OpActs [i] := Op.Schedule;
end;
for i := 0 to ATask.Operations.Count-1 do begin
Op := ATask.Operations.Nodes [i] as TSDEOperation3;
Check (Op.Schedule = Acts [i],
PrintTask (ATask) + PRet +
PrintAStatus (Acts) + PRet +
PrintAStatus (OpActs));
end;
end;
procedure TTestProtokol.CheckInvertCount (ATask: TSDETask; N: integer; Up: boolean; Cnt: integer);
var
Op: TSDEOperation3;
С: integer;
S: string;
begin
S := PrintTask (ATask);
Op := ATask.Operations.Nodes [N] as TSDEOperation3;
if Up then
С := Task.CalcInversionsUp (Op)
else
С := Task.CalcInversionsDown (Op);
CheckEquals (С, Cnt);
end;
initialization
TestFramework.RegisterTest('TestProtokol Suite', TTestProtokol.Suite);
end.
Кстати, вот еще минус вашего подхода.
Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется.
А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях.
Это если я правильно понял, что у вас параметры передаются как массив вариантов.
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>Здравствуйте, swame, Вы писали:
S>>Тесты для DUnit САМ делал
U_E>Любопытно, а чем сейчас покрытие считают для юнит тестов на дельфи?
Не сталкивался, у меня покрытие тестами небольшое, пишу тесты только на хрупкие к изменению алгоритмов куски кода,
все покрыть тестами слишком дорого.
Здравствуйте, Garamzin, Вы писали:
G>Здравствуйте, swame, Вы писали:
S>>Вот пример типичного рутинного теста из моего кода сложнее калькулятора. S>>Как бы он выглядел в вашей системе?
G>Брось компилируемый проект на почту с одной функцией и с тестами на адрес: garamzin.vladimir(at)майл.ру
Не так просто. Там примерно 2000 модулей 1KK строк кода и 15 сторонних пакетов компонентов.
Я хотел получить просто набросок-идею. Компилить для этого не обязательно.
Если очень хочется могу дать доступ к машине где настроена сборка.
F>ИМХО, тулсы для разработчиков не взлетают. Кто тут ОКСЕТТУ делал и пролетел?
А почему не взлетают? Интересно ваше мнение.
Я конечно понимаю, что проще продать 1000 генераторов инвойсов, чем 1000 отладчиков, но все же. JetBrains тоже начинали со скромной IDE для Java. Потом чуваки которые сделали PVS-Studio, тоже вроде не бедствуют.
Уж молчу про забугорных коллег. Вы только посмотрите кого купила Microsoft. 80% — это компании разработчики тулсов для нас.
Опустим необходимость подготовки тестовых данных, проверки открытия файла и тд, состредоточимся только на этом участке кода.
Как это все будет выглядеть в TestCode.
Открой страницу теста для калькулятора.
Я тут буду приводить номера пунктов, что бы понять о чем я говорю. Конечно в живом диалоге и с рабочим примером лучше объясняться, но я постараюсь.
1.Сделать в модуле и рабочем классе как описано в пунктах: 2.1, 2.2, 2.3.
2. Пункт 2.4.2 Создать тип метода, что мы будем тестировать
Тут важно знать, какой объект мы будем тестировать, который уже создан или который нужно создавать для теста
Если нужно создать то прописываем например создание и удаление объекта и инициализацию в случае креша какого то теста и других непредвиденных обстоятельств
type// имя тут может быть любое
TTestMethod = (
,tmInit
,tmCreateObject
,tmTestBlocked // тестируем 1. метод
,tmFreeObject
);
Мы же предположим, что объект на момент теста будет уже создан, поэтому тестируем только 1 метод.
type
TTestMethod = ( // имя может быть любым
tmTestBlocked // тестируем 1. метод
);
3. Регистрация метода который будем тестировать п. 2.4.4.
IRegisterMethod(tmTestBlocked ,'Test Blocked' ,'Проверка поиска текста и дополнительной информации ');// Test methods
4. Добавляем наши параметры для теста
//Тест на Истину (объяснения ниже)
IRegisterMethodParams(['ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206'] // 1-й массив что мы тестируем
,['Test_CreateBlockings 2.1','Test_CreateBlockings 2.1.11','Test_CreateBlockings 2.1.13']// 2-й массив, с чем мы сравниваем
,'Тут описание, я пишу тут параметры и какой д/б результат'); // True result
//Тест на ЛОЖЬ (объяснения ниже)
IRegisterMethodParams(['ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206'] // 1-й массив что мы тестируем
,['Test_CreateBlockings =ТУТ ПИШЕМ ЧЕГО НЕ ДОЛЖНО БЫТЬ!!!','ошибка','ошибка'] // 2-й массив,специально создаем ошибку, но кол-во строк д/б равно первой регистрации параметров иначе будет ошибка регистрации. Смотри параметр TParamCheckOptions
,'Тут описание метода, например ТУТ ОШИБКА'
,trError // НОВЫЙ ПАРАМЕТР ПРОВЕРКИ НА ОШИБКУ
); // True result
Объяснения: "Тест на Истину" и "Тест на ЛОЖЬ"
Проверка д/б не только на ИСТИНУ но и на ЛОЖЬ, при этом итоговый результат д/б положительный "Тест пройден"
Пример калькулятора:
1) "Тест на Истину"
IRegisterMethodParams([2,2],[1],'2 div 2=1'); // True result
То есть 2 div 2 = 1. Если результат не равен 1, то будет ошибка.
2) "Тест на ЛОЖЬ"
IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError); // Error = Ok
4 div 4 =4 — Это заведомо явный ввод ошибки, тест ОБЯЗАН вернуть ошибку. НО после всех тестов д/б результат Ok, а не ERROR, поэтому мы пишем, что с этими данными должна быть сгенерирована ошибка, и если ее не будет, то ЭТО будет считаться ошибкой. Поэтому мы прописываем доп. параметр trError, уведомляя систему тестирования, что возврат кода ошибки, означает, что тест ПРОЙДЕН!
Очень ВАЖНО писать тесты как на Истину, так и на Ложь и с TestCode делать это очень просто.
Может быть я банальные вещи пишу, но я стараюсь объяснить, как лучше тестировать код, тем кто это не делает.
5. Пункт 2.4.5. Реализация самого теста. Допустим есть объект который мы тестируем MyObj
case TTestMethod(IMethod.IGetNumParamUser) of
tmTestBlocked:
begin// LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
// 'Test_CreateBlockings 2.1');
LB := MyObj.FindBlocking (IMethod_AsAnsiString(IMethod.IGetArrParam(0)), IMethod_AsAnsiString(IMethod.IGetArrParam(1))
// я не понял назначение этой строки если это результат который д/б то прописать так:
,IMethod_AsAnsiString(IMethod.IGetArrResultForTestMethod(0)));
// Далее, как я понял проверяются элементы TBlockingInfo
{ TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
try
TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
finally
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
end;
}
// их можно проверять по правилу "Все или Ничего",
// т.е. только в конце ставим результат trOk, а сейчас выставим ошибку, что бы менише писать if begin .. end
result:=trError;
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
if not MyObj.TestBlocked (LB, IMethod.IGetArrResultForTestMethod(1)), true, false) then exit;
(LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
if not MyObj.TestBlocked (LB, IMethod.IGetArrResultForTestMethod(2)), true, false) then exit;
result:=trOk; // если дошли до конца, значит тест пройдетend;
end; // case
Я бы не использовал при тестировании в тестах код try..finally, как и try..except
Вместо try..finally проинициализовал бы в начале: (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
А try..except не надо использовать, тк исключения ловятся выше уровнем.
Мне сложно писать абстрактный пример, если бы был рабочий тест на DUnit, мне было бы намного проще показать преимущества.
Но ты наверно заметил, что в TestCode жестко разделаются параметры и сам тестовый код. Это одно из принципиальных отличий.
И отличий очень много. S>Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется. S>А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях.
Нет, не соберется, если будет вызов тестируемого метода, если конечно не будет Default параметров, но это точно так же будет и при любом другом использовании измененного кода. S>Движок тестирования вынесен в отдельное приложение — но это только недостаток
На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно. S>Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием.
То что сейчас есть в продукте TestCode & TestSend, это лишь наверно 1/10 из того, что запланировано.
И почему я объеденил?
Потому что мне так удобнее, мне не надо что то еще запускать и все, чем я пользуюсь, но находится в отдельных модулях, я хочу интегрировать в одно приложение.
Здравствуйте, Garamzin, Вы писали:
G>Здравствуйте, swame, Вы писали:
S>>Я хотел получить просто набросок-идею. Компилить для этого не обязательно.
G>Может быть я банальные вещи пишу, но я стараюсь объяснить, как лучше тестировать код, тем кто это не делает.
Я понимаю принципы тестирования и понимаю как писать тесты в твоей системе, просил описать преимущества, пока вижу только усложнение.
А ты рекламируешь ее как дающую самое дешевое написание тестов.
G>5. Пункт 2.4.5. Реализация самого теста. Допустим есть объект который мы тестируем MyObj
G>[/pascal] G>
G> Я бы не использовал при тестировании в тестах код try..finally, как и try..except
G> Вместо try..finally проинициализовал бы в начале: (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
G> А try..except не надо использовать, тк исключения ловятся выше уровнем.
Я и не использую try..except
try..finally используется для возврата старого значения.
Понимаю, что где-то делаю не по канонам, но в данном случае так кажется проще.
G>Но ты наверно заметил, что в TestCode жестко разделаются параметры и сам тестовый код. Это одно из принципиальных отличий.
Понимаю это отличие , что оно дает? Пока вижу только ненужное усложнение.
S>>Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется. S>>А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях. G>Нет, не соберется, если будет вызов тестируемого метода, если конечно не будет Default параметров, но это точно так же будет и при любом другом использовании измененного кода.
ТО ты хочешь сказать что если мы вместо
IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError);
напишем
IRegisterMethodParams([4,4,4],[4],'4 div 4=4 trError it''s Ok',trError);
то код не соберется ? (нужно именно чтобы не собрался).
S>>Движок тестирования вынесен в отдельное приложение — но это только недостаток G>На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно.
О чем это и зачем?
S>>Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием. G>То что сейчас есть в продукте TestCode & TestSend, это лишь наверно 1/10 из того, что запланировано. G>И почему я объеденил? G>Потому что мне так удобнее, мне не надо что то еще запускать и все, чем я пользуюсь, но находится в отдельных модулях, я хочу интегрировать в одно приложение.
Так не стоит делать хотя бы потому что код со скомпилированными тестами не должен уходить от разработчика, а логирование можно поставить и в релиз.
И логирование и тесты никак не связаны.
S>IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError);
S>
S>напишем
S>
S>IRegisterMethodParams([4,4,4],[4],'4 div 4=4 trError it''s Ok',trError);
S>
S>то код не соберется ? (нужно именно чтобы не собрался).
Если про эти параметры, то нет, не нужно, что бы не собирался проект, т.к. есть методы с плавающим количеством параметров к примеру тот же Write.
Есть методы с дефаулт параметрами, которые то же необходимо тестировать .
S>>>Движок тестирования вынесен в отдельное приложение — но это только недостаток G>>На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно.
S>О чем это и зачем?
тестировать несколько приложений и DLL одновременно
Если одно приложение, то наверно этот функционал излишен, но если несколько приложений работают в связке, то он востребован.
S>Так не стоит делать хотя бы потому что код со скомпилированными тестами не должен уходить от разработчика, а логирование можно поставить и в релиз. S>И логирование и тесты никак не связаны.
Была мысль сделать пароль на тесты, в принципе можно и прикрутить.
Здравствуйте, Garamzin, Вы писали:
G>Хочу посоветоваться: G> 1. Что в первую очередь "причесать" для старта продаж?
Мы все еще пишем на Делфи. И, потенциально, я ваш клиент. Сделать разработку проще, а тестирование более дешевым интересно. Но, зайдя на сайт, я вообще не понял, что вы продаете и как это мне может помочь. Технари, конечно, поняли, но я не технарь.
Вывод: тексты надо переписывать в первую очередь.
Здравствуйте, ArcticLine2, Вы писали:
AL>Но, зайдя на сайт, я вообще не понял, что вы продаете и как это мне может помочь. AL>Вывод: тексты надо переписывать в первую очередь.
Как оказалось сделать продажные тексты очень трудно.
Получается нужна продажная страница и для программистов и руководителей.
Заказал текст, не знаю что получится.
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Garamzin, Вы писали:
G>>- Перенес сайт с домена TestMe-On.com на TestMeCode.com
VF>TestMyCode.com ? Пока свободен...
Registered On: 2010-06-16
Единственно короткий домен без дефиса, который нашли свободным это был TestMeCode.com.
От дефиса отказался, так как при анализе результатов с поисковика, была неприглядная ситуация.
Не помню уже подробности, но показали и рассказали в картинках, что лучше иметь домен onetwothreefourfive.com чем a-b.com с точки зрения поисковиков.
В общем убедили.
И на сколько я знаю английский TestMeCode не должен вызывать диссонанса в английской аудитории.
Me — Мне
My — Мой
Здравствуйте, rean, Вы писали:
R>Слишком сложно сделано, типичный программистский проект для того чтобы можно было усложнить написание программ, а не облегчить.
Найдите и покажите продукт который бы решал эту проблему проще и быстрее, чем TestCode.
Если мы хотим тестировать код, то тесты все равно лучше писать, чем не писать.
Но с помощью TestCode, это можно сделать с самыми минимальными усилиями и с максимальной скоростью покрытия тестами функционала.
Плюс переработал код, с пожеланиями которые озвучивались в прошлом году.
Появилось выборочное тестирование по группам юнитов, тайминг и еще много чего.
И выполняя пожелания коллег по улучшению продукта, сам стал пользоваться этими возможностями.
Планов очень много по развитию, очень сильно хочу что бы все получилось и довел продукт до той точки, которую я вижу.
R>Переусложнение сквозит во всем, начиная с количества юнитов
Это реальная проблема для программиста с дефайном подключить юниты? Четыре действия это долго?
1.Выделить на сайте код
2.Скопировать в буфер
3.Щелкнуть мышкой куда вставить юниты
4.Вставить из буфера код.
Это долго?
При разработке у меня открыта страница в браузере постоянно и я этим пользуюсь ежедневно. Я Вас очень прошу не надо мне рассказывать про переусложнение, я каждый день этим пользуюсь.
R>Для начала нужно осознать, почему программисты не хотят писать тесты.
1. Не знают как.
2. Существующие методы тестирования не помогают, а усложняют разработку.
Когда в приказном порядке наша группа стала делать тесты (WhileBox,BlackBox), что как минимум на 40% увеличило время разработки, а реальное время стало в 2 раза больше. То есть с тестами, которые должны помогать, мы стали срывать сроки. На уши встали все.
Оставили тогда только нагрузочное тестирование.
Ведь этот продукт родился далеко не от хорошей жизни.
Все понимают, что тестировать надо, но нужно что бы это было удобным, с равномерным покрытием и что самое важное это должно делаться очень быстро.
Но с тестами был сделан шаг дальше.Теперь тесты, это штатный инструмент отладки.
Сейчас при разработке TestCode:
Первый пункт — это инструмент отладки
Второй пункт — проверка функционала при изменениях проекта.
После этого появились много плюсов, один из которых, при групповой разработке, разбираться в ошибках приходится тому, кто их создал, а не автор модуля.
Если автор модуля не прав, добавляются тестовые данные, создающие ошибку и все, человек исправляет свои косяки, но часто бывает, что ошибки бывают косвенные, ошибка в модуле А, но причина не в модуле А, а в модуле С.
Такие тесты очень экономят время, лично я прям в восторге от этого.
Другой плюс, про который совсем не думали, это время обучения персонала. В несколько раз специалист "входит в проект" быстрее, если код с тестами.
Вот как то так.
Здравствуйте, rean, Вы писали:
> да и еще такой сложный
Сложный?
На мой взгляд, система контроля версии (trunk,branches,tags,hotfix) на много сложнее.
Можно узнать в чем сложность?
Все что надо это:
1. Зарегистрировать класс
2. Зарегистрировать метод
3. Зарегистрировать входные данные и результат
4. Вызвать тестируемый метод
— это минимальный набор
R>Решает все задачи, какие мне нужны. И это благодаря препроцессору C++. А на Delphi, когда я на нем еще писал, R>использовался элементарный if.
Препроцессор действительно хорошая штука, но "элементарный if" для тестов?
М-м-м-м, если программист один, то может писать как он хочет, если в группе, то ата-та по попе ему обеспечено.
Как минимум нужно Define использовать.
R>Без надобности платить неизвезтно за что неизвестно кому.
Можно и бесплатно, я писал что 100 параметров это на средний проект хватит.
G>>Но с помощью TestCode, это можно сделать с самыми минимальными усилиями и с максимальной скоростью покрытия тестами функционала. R>Рекламное бла-бла-бла ни о чем. Пытаетесь потенциального покупателя заболтать? Нет доказательств. Это выглядит как рекламное вранье. R>Все, что вы пишите пользователям, должно быть не просто правдой, но и иметь доказательства, а это факты, примеры, истории из жизни,
Возьмите класс на 5-10 методов, сделайте тест, что бы компилировался, дайте ссылку или пошлите по почте, давайте сравним.
R>Потому что смотрите замыленными глазами, а нужно смотреть глазами тех, кто никогда не видел ваш продукт и не связан с вами обязательствами
Возможно, и тут очень важна обратная связь.
G>>4.Вставить из буфера код. G>>Это долго? R>Врете. Эти действия не приведут к работающему тесту.
Разговор ведь про "количества юнитов" был.
R>Переусложнение сквозит во всем, начиная с количества юнитов
R>Напишите полностью все шаги и увидите, что у вас лишних шагов настолько много, что пропадает желение даже близко начинать писать тесты.
Сейчас полноценное написание теста это
1. copy-paste 3-х кусков (unit, methods, initialization)
2. Создать методы с помощью горяч.клавиши
3. в блоке initialization поменять название класса на свой
4. Описать методы которые будем тестировать с регистрацией
5. введем параметры
6. напишем вызов тестируемых методов.
Это сейчас!
При написании эксперта 1..5 пункт будут делаться автоматом, в 6-й пункт нужно будет ввести корректировку.
ВСЕ!!! Куда быстрее?
Сейчас 6 шагов, потом вообще 1 и то, что бы просмотреть правильность сгенерированного кода.
Эксперт сейчас не запускается так как нужен фидбек и возможно, еще что то поменяется.
R>1. Копирую в проект один хидер. R>2. Подключаю его запуск в main(), дописывая одну строчку вызова прогонов тестов. R>3. В любом новом cpp файле я вписываю: R>#include "test.hpp" R>TEST() {
На счет С ничего не могу сказать, очень-очень давно не писал на нем.
Но если Вы на делфи, как я выше писал, сделаете проект с тестами, я сделаю свой тест.
Мне это очень интересно.
R>Именно. А ваш чем помогает упростить разработку? R>Тем, что надо купить ваш продукт, часами разбираться в портянках кода и кучей всего на вашем сайте,
В архиве есть примеры R>потом проделывать десятки шагов, чтобы только начать.
Пока всего 6
R>какие ждут пользователю, когда код придется модифицировать и все тесты, какие он писал ранее,
Вообще то этом и заключается тестирование!
Что бы при изменении спецификации старые тесты или проходили или должны быть модифицированы. Как по другому проверить правильность кода? Верить разработчику "на слово" не видя тесты?
R>придется переделывать, мучаясь с проблемой железо-бетонной связностью с кодом тестирования, где придется R>переделывать каждый из тестов. А потом, когда вдруг захочется писать версию 2 проекта,
В архиве примеры где лежат тесты, их 3 вида.
1. Внутри модуля (я фанат этой практики)
2. Внешний файл в виде Include файла
3. Внешний файл в виде отдельного модуля.
Показаны плюсы и минусы этих подходов.
R>А вы даже советуете жестко завязывать тесты с кодом бизнес-логики проекта, считая это плюсом. R>На деле это такой гемор, в какой не захочет вляпаться опытный программист, какой уже ранее делал так.
Тесты делают на функционал, код должен работать так, как описано в спецификации.
Если меняется спецификация и логика, то должны быть изменены и тесты.
А как по другому полноценно проверить код без тестов?
Программист все равно подготавливает данные, с ними отлаживает функционал, а если пришел тикет об ошибке, то программист так же тестирует — отлаживает свой код, с тестовыми данными, только ручками в отладчике.
Я сейчас просто не представляю, как можно было по другому вести разработку.
R>Весь интернет завален подобным и бесплатно. Вы добавили еще один, да еще и платно.
Да, платно. Так как на разработку нужно время, а время это деньги.
И хорошие специалисты стоят хороших денег.
И средства пойдут в первую очередь на дальнейшую разработку продукта.
R>Чтобы выделиться на рынке, вы должны выделиться. А у вас еще один из многих переусложненный фреймворк.
Я с этим категорически не согласен.
Покажите более простой инструмент тестирования.
R>Не доказали ценность вашего продукта.
Возможно, но я очень хочу это сделать.
Здравствуйте, rean, Вы писали:
R>«Определите в опциях «Conditionals Define» R>Я считаю, что это лишняя сложности, без которой можно обойтись.
Все зависит от специфики работы.
Define у нас применяются везде, определяя компиляцию сервисов, dll до использования типа процессора и платформы.
Это стандартный атрибут работы. Хотя принимаю, что это скорее всего зависит от специфики работы.
R>например, зачем-то еще какой-то калькулятор.
В этом тулбаре будут мелкие утилитки помогающие в разработки и отладке приложений.
R>Уже в самом описании непонятно, что имеете ввиду. Мне пришлось секунд 10 соображать, что это. R>Можно же было написать проще понятней, например, «будем тестировать, например, функцию Divide(), вот ее код:».
Спасибо. Полностью страницу придется переписать.
R>procedure TestDiv() R>begin R> Test.Register('Деление'); R> if Divide(6,3) <> 2 then Test.Failed('Деление не прошло'); R> Test.Register('Умножение'); R> if Multiply(6,3) <> 18 then Test.Failed('Умножение не прошло'); R>end;
От этого ушли намеренно, так как есть код обработки больших данных, поэтому и было принято решение разделить код тестирования и данные для тестирования.
R>Предлагаю тогда поиграть в игру. Представьте что вы инопланетянин, впервые на планете земля. R>И вы заходите к себе на сайт. И понеслось! Все что вам покажется странным и необычным с точки зрения инопланетянина — записывайте! R>Такой прием поможет немного убрать замыленный взгляд на свое детище.