Довольно часто мы допускаем механические ошибки при написании кода. Как например начинаем значение переменной i (счетчик) ставим не 0, а 1 или наоборот, либо неправильно выбранное начальное значение переменно. Со мной случаеться такое довольно часто. В поисках решения этой проблемы (конечно кроме внимательности при написании самого кода) нашла так называемый mutation метод (переведу его как смешанный метод).
Основная идея которого инно и заключаеться в обнаружении подобного рода ошибок. А все довольно просто. Пишуться отдельные програмки с заведомо сделанными ошибками. Их называют мутантами. Чаще всего подобным образом тестируються функции. Следовательно, перебирая (в разумных пределах) переменные, которые принимает функция обнаруживаються ошибки как в программах мутантах, так и в оригинальной программе.
Из найденных примеров:
Функция должна находить неотрицательную степень числа x. В программе изначально допущена ошибка в цикле (вместо n-1, должно быть n).
static public double PowerNonNeg(double x, int n)
{
double z=1;
if (n>0)
{
for (int i=1;n-1>=i;i++)
{
z = z*x;
}
}
else Console.WriteLine("Error.");
return z;
}
Теперь пишется программа-мутант. В ней специально заменяеться начальное значение переменной i и границы цикла
static public double PowerMutant2(double x, int n)
{
double z=1;
if (n>0)
{
for (int i=0;n-1>=i;i++)
{
z = z*x;
}
}
else Console.WriteLine("Error");
return z;
}
И еще одна программа с ошибочным начальным значением z
static public double PowerMutant1(
double x, int n)
{
double z=2;
if (n>0)
{
for (int i=1;n>=i;i++)
{
z = z*x;
}
}
else Console.WriteLine("Error");
return z;
}
И теперь при запуске функций с параметрами (x=2,n=3),(x=999,n=1)(x=0,n=100) мы сможем отловить все сделанные ошибки.

июня 16, 2007 в 12:01 дп
Уважаемая, потрудитесь объяснить не смекалистым что же нам дают эти 3 функции.
Что-то я никак не соображу при чем тут мутанты к ошибкам.
А если функция не учебная а реальная и мест для ошибок там N. Так что плодить K^N мутантов?
июня 16, 2007 в 12:49 дп
1. считаю такой тон недопустимым.
2. ошибки делаються в наиболее вероятных местах опечаток. и только от Вас зависит где и какие мутанты создавать.
также существуют системы для автоматической генерации тестов, которые используют подобный метод. Если он Вас не устраивает, никто не заставляет Вас его применять.
З.Ы. почему "K^N" ?
у вас одна ф-я и N мутантов к ней.
июня 16, 2007 в 1:13 дп
2 seagull:
меня интересует эта тема
Вам известны другие более эффективные методы для отслеживания механических ошибок - расскажите
июня 16, 2007 в 11:03 дп
Метод очень неожиданый. К традиционному понятию функционального тестирования (http://en.wikipedia.org/wiki/Functional_testing) не имеет никакого отношения.
Без автоматических генераторов поколения фукнций-уродов, ой, мутантов не имеет права на жизнь, поскольку отнимает кучу времени, которое продуктивней потратить на отлов ошибки в уже существующей фукнции.
и тут остапа понесло
Метод может применяться как замена юговосточным товарищам подрывая их ИТ-экономику к едренефене. Правда только в комбинации с сильной спецификацией и юнит-тестами.
И так лейдис енжентлмен, бестпрактис намберван инспаерд бай ктулху (симплифайд яко чайниз).
0) Саморучно творим архитектуру и спецификацию всея системы.
).
1) Берем дешевый человеческий генератор кода (далее ЧГК) и генерим им код (исходное поколение, оно же пока текущее).
2) Опять берем ЧГК и генерим им юнит-тесты по заданной нами спецификации из п. #0
3) Умной программой (УП) плодим мутации текущего поколения.
4) Запускаем юнит тесты для всех нагенеренных мутантов + исходный код.
5) Если число ошибок в юнит-тестах текущего поколения больше нуля, выбераем N, нет, лучше N+1 наиболее зрелых мутантов и с переходим на шаг №4. В противном случае выбераем того мутанта, на котором прошли юнит тесты и замещаем им исходное решение (и выходим, скорее выходим из этого алгоритма
Для тех, кто готов платить за надежность и верификацию своими кровными, даный бестпрактис можно расширить с помощью технологии RAID-N. Для этого нужно организовать RAID массив из N ЧГК. Далее вместо умной программы генератора и генерить поколения мутантов ЧГК-RAID. На первый взгляд это медленней, но можно практически с первого поколения добиться нужного результата применив операцию merge для всех мутантов, заменяя менее распространенные конструкции на конструкции которые встречаються у большинства мутантов.
P.S. А если серьезно, то что-то в этом есть
pamella за свежую идею огромный грасьяс
июня 16, 2007 в 11:25 дп
2 pamella
1. Не тон, а стиль
2. Ни в коем случае не хотел вас обидеть.
3. Не вижу я практического применения вашего метода, вот и переспрашиваю.
4. если N мест ошибок и в каждой ошибке K вариантов. Получаем K^N мутантов.
2 zeroreturn:
Вот это был бы прорыв.
+5
Давайте устроим эволюцию кода от пустого оператора до необходимой функциональности через мутации
июня 16, 2007 в 11:34 дп
кстати, pamella, ошибки типа выход за границы массива это далеко не механические ошибки... это можно сказать ошибки в голове того, кто их делает. механические ошибки, как я понимаю, это опечатки так или иначе отлавливаемые компилятором (хотя вспоминаю случай когда ставишь запятую перед всеми инклудами в СРР файле...
)
июня 16, 2007 в 12:10 пп
2seagull:
данный метод используеться тестровщиками при наличии спецификации. конечно никто не пишет это все руками.
2zeroreturn:
для границ - существует так называемый граничных метод (boundary testing). и именного его задача отслеживания глюков на границах интервалов.
просто редко кто тестирует используя всего лишь один метод.
по поводу классификации -
1. это всего лишь классификация
2. тестирование проводиться на уровне отдельно взятого модуля (=> уровень - модульный). тестируеться соответстиве функциональности данного модуля спецификации (=> функциональное)
з.ы. - Вы кинули ссылку на системное тестирование - а функциональное - его под вид
июня 16, 2007 в 2:36 пп
Что-то у меня много вопросов возникает.
1. Ну где же долгожданное описание?
Вы утверждаете что есть метод (название пока не указано), который помогает обнаруживать и исправлять ошибки. Но где метод?
2. Потрудитесь придерживаться устоявшейся терминологии. В вашем описании нету функционального тестирования. Возможно оно у вас используется как вспомогательное (мне так кажется почему то). Что же вы хотите донести в массы?
3. Что же делать с экспоненциальным ростом количества мутантов?
июня 16, 2007 в 2:55 пп
1. описание какого именно метода? название метода БЫЛО указано - Mutation.
"помагает обнаруживать и исправлять ошибки" - какие именно ошибки? для каждого типа ошибок существуют свои методы. тестироващики не используют один едиственный метод для тестирования всего приложения. В своем посте я описала один из методов. использовать его или нет, дело Ваше
2. Я придерживаюсь терминологии. В моем понимании ее сформировали книги Бориса Бейзера, Gao Jerry(Testing and quality assurance for component-based software), Neelam Gupta (Black Box Testing Tucson, Arizona, USA)...
3. [b]А как отлавливание подобных ошибок выглядит в Вашем представлении?[/b] Вы хотите написать 1 тест, который за Вас найдет все Ваши ошибки? найдете такой мир - пригласите меня. Повторюсь еще раз - тестирование mutation (смешанным) методом проводиться на уровне выбранного модуля. и кол-во ошибок в (учитывая, что программист не дурак, а ошибки возникают механические) не может быть настолько большим, чтобы генерация тест кейсов была бессмысленной.
июня 16, 2007 в 3:43 пп
2seagull:
у меня складываеться ощущение, что я говорю, а Вы меня не слышите. посему считаю дальнейшее продолжение этой "дискусии" бессмысленным.
июня 16, 2007 в 3:54 пп
Похоже вам не хватает опыта в написании научных либо же технических текстов. Искренне желаю вам этот опыт наверстать.
Перестаньте отвечать эмоционально.
Теперь назад к нашим пунктам.
1. В который раз повторюсь описания метода здесь нет. Хорошо хоть название появилось
Если вы подзабыли что такое метод, то я напомню:
Метод — систематизированная совокупность шагов, которые необходимо предпринять, чтобы выполнить определенную задачу или достичь определенной цели.
Я просто прошу вас описать метод, а потом уже возможна хоть какая-то дисскусия о правомерности метода.
2. Ух-ты как много авторов. Вот и здорово что вы столько прочитали (Особенно мне понравилось троеточие
), тогда вы уж точно знаете что такое функциональное тестирование. И умеете отличить его от системного.
3. Не увиливайте от вопроса
Что же делать с экспоненциальным ростом? При этом не забудьте что не известно в каких местах ошибки.
июня 16, 2007 в 4:18 пп
и еще раз.
1. название метода изначально было указано. перечитайте еше раз.
метод пощагово:
1.1. есть функция
1.2. создаем к ней мутанты
1.3. выбираем набор (x,n) для программы P. если при выполнении программы и мутантов подтверждается правильность программы и, находяться все внесенные в программы-мутанты ошибки, то набор тестов (x,n) считают адектватным, а тестируемая программа объявляется правильной.
если же набор (x,n) не выявил всех мутаций, то надо расширять набор и продолжать тестирование.
2. я привела авторов книг которые относят данным метод к функциональному тестрованию.
3. прежде чем начинать тестировать создаеться стратегия тестирования. в ней и определяеться является ли целесообразным использование определенного метода в данном случае. так вот, от экспоненциального роста Вы никуда не денетесь. но я не вижу в этом чего-то смертельно. тесты такие же программы и требуют ресурсов.
например, у нас есть код в котором может быть 100 ошибок, на каждую по 2 мутанта => 1000 программок. вы запустили их и наблюдаете полученные результаты. а по ним уже делаете выводы.
надеюсь, что ответила на ваши вопросы.
ответная просьба ответить на мой
июня 16, 2007 в 4:39 пп
Теперь это уже ближе. Спасибо.
Непонятно лишь условие остановки "расширения набора". И какие "сигналы" в случае если код неверен?
>у нас есть код в котором может быть 100 ошибок, на >каждую по 2 мутанта => 1000 программок
Скажем не по 2 мутанта, а по 2 возможных мутации. Тогда все возможные мутации не 100^2, а 2^100 - а это не очень и мало.
Или все варианты мутаций не нужны?
Поверьте мне действительно интересно докопаться, что же именно скрывается за mutation-методом.
Ваш вопрос это:
А в границах цикла я давненько не ошибался.
>А как отлавливание подобных ошибок выглядит в
>Вашем представлении?
так? Или я что-то пропустил?
подобных - это опечаток? Ну, большинство опечаток отлавливает компилятор
Вообще-то придерживаюсь классическому подходу к функциональному тестированию. А из-за специфики ПО приходиться и дебугером поработать.
Я достаточно ответил?
июня 16, 2007 в 11:55 пп
2 seagull
Если действительно интересно докопаться, что же именно скрывается за mutation-методом может проще читнуть литературу а не допрашивать с пристрастием pamella
июня 17, 2007 в 12:15 дп
2 zeroreturn:
А как же спортивный интерес?
Если pamella взялась поведать нам об этом методе, то пусть доведет начатое до завершения. Думаю ей это будет очень полезно. И следующая статья будет лучше, а главное организованней. Правда pamella?
июня 18, 2007 в 3:03 пп
2 seagull:
условие остановки расширения набора - когда расходы на тестирования будут превышать допустимые в данном проэкте. + исходя из логики, того, кто проводит тестирования.
их не обязательно должно быть мало. какие мутации вводить - решение того, кто проводит тестирование. а много или мало - вопрос риторический.
ошибок в стиле написать ">" вместо "
июня 18, 2007 в 10:33 пп
"ничего не понимаю" (с) "Следствие ведут колобки"
То у вас автоматический процесс, то полностью ручной. Иначе что за решения о вводе мутаций или нет.
Ой, это я не удержался.
Извините, больше никаких вопросов.
2 zeroreturn:
Ты прав. Буду читать литературу.
июня 18, 2007 в 10:41 пп
2 seagull
решение о завершении тестирования в любом случае принимает человек. если мутационный метод не дает результатов значит нужно использовать другой.
одно из двух - либо я не понимаю о чем Вы спрашиваете, либо Вы не понимаите о чем я
июня 18, 2007 в 10:46 пп
2 seagull:
попробуем уяснить - тесты создаються автоматически.
но когда закончить тестирования данным методом решает человек.
июня 18, 2007 в 10:55 пп
>одно из двух - либо я не понимаю о чем Вы спрашиваете,
>либо Вы не понимаите о чем я
Думаю и то и другое
Прийдется опять цитировать:
)
"Либо что-то случилось либо одно из двух"
Благодарен за упорство в ответах.
Вы меня толкнули таки на чтение доков по этому методу за что опять же спасибо.
Ждем следующий постов, но надеюсь что они будут более детально выписанными (что явно в ваших силах), чтобы не потребовалось так много выспрашивать.
июня 18, 2007 в 11:05 пп
2 seagull:
пасиб за критику, мне эт действительно полезно
постараюсь