14.03.2017, 10:39 | #21 |
Участник
|
т.е. тестируем только регрессию?
а почему "это минимальный набор, который покажет"? почему он покажет? ведь может быть регрессия, которая не учитывается этими двумя случаями. Цитата:
что за другой набор данных? ведь мы генерируем окружение до запуска метода. причем предполагается, что окружение будет одинаковым. разве не? и что за случайные выборки? да, в ax7 добавили sysTestAnyGenerator... но мы ведь не о нем говорим? что за случайности в unit-тестировании? чего я не понимаю? |
|
14.03.2017, 11:00 | #22 |
Участник
|
Цитата:
вообще немного подумав - что бы я как разработчик решения хотел бы получить от микрософт. наверное все же не 2, а набор тестов которые тестируют каждый параметр и проверяют что одно изменение параметра приводит к отличию в выполнении. т.е. в данном случае 11 параметров, на каждый параметр по 2 значения получается тест с 22 вариантами - на каждый вариант должна быть своя цена. плюс скрипт который генерит 22 разных записи в таблице цен так бы я проверил, что мой код не поломал стандарт Последний раз редактировалось trud; 14.03.2017 в 11:03. |
|
14.03.2017, 11:20 | #23 |
Участник
|
Цитата:
X++: void testFindDisc_byRelationAgreementHeader_ifAgreementHaderDoesNotMatch_returnsNothing()
{
...
this.assertFalse(this.findByAgreementHeader(relation, dimId, NotExistringAGreementHHeader));
} Цитата:
Какую стратегию вы считаете правильной для тестирования методов с параметрами по умолчанию? Почему?
Какие статьи/книги/ссылки вы считаете релевантными по данной теме? Почему? |
|
14.03.2017, 11:45 | #24 |
Участник
|
прекрасно!
спасибо за ссылку и за книгу. и все же. а можно поконкретнее? |
|
14.03.2017, 13:01 | #25 |
Moderator
|
1. В общем то, как написал fed - unit test-ирование полезно, когда значительная (по моим оценкам не менее 40% кода) часть кода покрыта unit тестами. Если тесты на стандартный код не появились - это все, вроде как, имеет мало смысла.
2. Что гораздо хуже, большая часть Ax кода написана так, что на нее невозможно написать unit тесты. Чтобы код было удобно тестировать, все с чем он работает тем или иным образом должно передаваться в класс (или метод) - см. прием/паттерн Dependency Injection. В Ax этот принцип нарушается везде Скажем любой метод, который обращается к БД нормально протестировать нельзя, так как я не могу создать mock для базы данных и передать его в этот метод. Каждый такой метод работает против реальной БД и подменить ее (не трогая стандартный код) я в принципе не могу. |
|
14.03.2017, 13:13 | #26 |
Участник
|
появились/не появились - отдельный вопрос.
можно утверждать, что "не публикуются". Цитата:
большая часть тестов работает на демонстрационной базе, которая очень стабильна. любые другие данные нужно догенерировать. т.е. mock база есть. и она не пустая. я так понимаю, что в мс есть специальные атрибуты, которые заставляют тестовую среду перед запуском тестов установить демобазу, компанию и страну. |
|
14.03.2017, 13:16 | #27 |
Moderator
|
Цитата:
которые заставляют тестовую среду перед запуском тестов установить демобазу, компанию и страну
Но проблема же не только в БД. Может с тех пор как я смотрел в Ax что-то изменилось, но создание объектов в конструкторе объекта, как и в его методах раньше встречалось повсеместно и было правилом, а не исключением. |
|
14.03.2017, 13:21 | #28 |
Участник
|
Цитата:
да, и сейчас добавляются параметры со значениями по умолчанию. да, и сейчас возможность рефакторинга очень и очень ограничена. даже в мс. и прочие отличия аксапты от того же c#, java, php. собственно, поэтому и вопрос этой темы: Как правильно выполнять unit-тестирования методов с параметрами по умолчанию на ваш взгляд? в принципе с удовольствием послушаю что думают опытные товарисчи на более общую тему: Как правильно выполнять unit-тестирования в аксапте на ваш взгляд? |
|
14.03.2017, 13:26 | #29 |
Moderator
|
Цитата:
поэтому ожидаю, что высказывающиеся расскажут не только о приемах правильного unit-тестирования, но и о том какие цели удовлетворяются при том или ином приеме
С этой же задачей хорошо справляется строгая статическая типизация, которую по эффективности я бы поставил даже на первое место. Именно она - та причина, по которой в production я предпочту использовать f# или haskell, а не clojure. Именно она является причиной того, что я буду пропагандировать TypeScript и настаивать на его использовании вместо JS. Если твои цели совпадают с моими, может просто рассмотреть другие способы проверки работатоспособности продукта, нежели unit тесты, которые не очень вписываются в концепцию продукта ? Последний раз редактировалось Андре; 14.03.2017 в 13:28. |
|
14.03.2017, 13:38 | #30 |
Участник
|
Цитата:
пусть так. какая стратегия в имеющихся условиях в имеющейся аксапте с имеющимся инструментом SysTest* является правильной? И почему? для определенности, давай сосредоточимся на методах с параметрами по умолчанию на примере PriceDisc::findDisc ))) Цитата:
но что хотелось бы: 1. прикидываем правильную стратегию контроля регрессии для аксапты и для того, что в ней называется юнит-тестированием 2. прикидываем правильную стратегию контроля регрессии для другого способа. 3. сравниваем трудоемкость 4. ... 5. PROFIT но для этого нужно хотя бы как-то определится с правильной стратегией и понять какой ценой эта правильность обеспечивается в Аксапте. |
|
14.03.2017, 13:42 | #31 |
Moderator
|
Цитата:
другими словами, контроль регрессии.
пусть так. какая стратегия в имеющихся условиях в имеющейся аксапте с имеющимся инструментом SysTest* является правильной? И почему? Может у кого-то был противоположный опыт ? |
|
14.03.2017, 14:00 | #32 |
Участник
|
Цитата:
в ах7 есть определенные шаги в этом направлении - создали форм адаптеры - классы для форм которые один в один отражаются на контролы формы. но я вот не очень честно говоря представляю как вообще должен выглядеть тест на создание и разноску заказа, что проверять, каким образом генерить данные и т.д. |
|
14.03.2017, 14:08 | #33 |
Moderator
|
Цитата:
но я вот не очень честно говоря представляю как вообще должен выглядеть тест на создание и разноску заказа, что проверять, каким образом генерить данные и т.д.
Я так не делал - слишком ленив Во первых надо тратить кучу времени на поддержку всех тестов в актуальном состоянии. Во вторых БД должна содержать набор данных для покрытия всех основных сценариев, а значит надо следить и за ее актуальностью. Когда я работал с Ax, я пошел чуть-чуть другим путем, который можно описать примерно так: "Если мы не можем снизить вероятность возникновения ошибки, попробуем сделать так, чтобы ее цена была как можно ниже". Я понимаю, что это "рабоче-крестьянский подход", но при правке функционала в корректность которого у меня были значительные сомнения (как и сомнения в качестве тестирования), я не выбрасывал из приложения старый вариант кода, а вешал его на галочку. По умолчанию галочка не стоит и работает новый вариант. Если пользователи пишут, что появились проблемы с новым кодом, я предлагаю им поставить галочку, чтобы работать начал предыдуший вариант, а сам спокойно решаю проблемы в новом варианте. Еще раз - такой способ подойдет не всем и не всегда |
|
14.03.2017, 14:23 | #34 |
Участник
|
Цитата:
непонятно что собственно делать дальше, т.е. как проверить к примеру "правильность" разноски. учитывая что часть данных вообще зависит от системной даты |
|
14.03.2017, 14:50 | #35 |
Участник
|
Цитата:
Или может та система которую там демили уже так умеет ? Проблему с датой не вижу. Ее тоже можно выставить, даже из интерфейса. Или тогда надо ее как параметр вводить в метод проверки. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
14.03.2017, 14:51 | #36 |
Участник
|
Цитата:
атрибутами устанавливают область FunctionTest. такие классы проверяются в рамках отдельного шага после успешного прохождения CheckInTest... есть и UnitTest, есть и IntegrationTest, есть еще несколько типов, которые влияют на checkin, последовательность, периодичность, критичность проверки. в общем, задают параметры работы тестовой среды атрибутами. но в конечном итоге все равно нужно написать некий класс, унаследованный от SysTestCase... Отсюда собственно и тема этой ветки ))) |
|
|
За это сообщение автора поблагодарили: trud (2). |
14.03.2017, 15:07 | #37 |
Участник
|
|
|
14.03.2017, 15:57 | #38 |
Участник
|
А смысл? Даже если отбросить "дефолтный" параметр с recid=0 и т.д., "механически верный" поиск по inventDimId предполагает обширные "тайные знания" по применяемым "схемам" учета, логике формирования строк в соотв. таблицах, кастомизациям всего этого "вокруг".. В общем виде от написанного класса получаем подтверждение "найдем строку скидки если код аналитики есть в поле таблички" вместо условно ожидаемого "найдем скидку, как для холодильника зеленого цвета так и для трех вагонов песка, а для восьми вагонов она еще больше" . Еще раз, Сергей, что ты хочешь от юнит теста этого метода? "return "зеленый квадратик"" или что-то другое?
|
|
14.03.2017, 16:31 | #39 |
Участник
|
А вот на скриншоте макрос #voucher чему равен? т.е. предполагается что в результате теста один и тот же ваучер получается?
|
|
14.03.2017, 16:51 | #40 |
Участник
|
Цитата:
Цитата:
понять. и простить. ))) если так проще для рассуждений, то наличие unit-теста является обязательным при checkin'е кода в мс. поэтому формально - именно "зеленый квадратик". но я смотрю на уже существующие тесты. там чего только нет. помню себя и как я сам надеялся "вот у вендора то"... ))) вот я и хочу понять как народ делает, что народ считает правильным. что народ хочет от юнит-тестирования и что удается получить на практике. да, я услышал, что в этой ветке говорилось только о регрессии. и таки да, наверное вряд ли стоит ожидать чего-то другого от тестирования в коде. таки да - юнит-тесты это некие сторожевые собачки, расставленные по периметру кода. теперь хотелось бы понять какие результаты и усилия народ считает достаточным. и как этих результатов добиться с минимальными трудозатратами. в частности, в случае, когда комбинаций входящих параметров может быть несколько сотен. да. нумераторы тоже настраиваются в рамках setup-метода. каждый запуск test-метода происходит в одинаковом окружении. |
|