Довольно часто мы допускаем механические ошибки при написании кода. Как например начинаем значение переменной 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) мы сможем отловить все сделанные ошибки.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

21 Комментариев на “Немного о методе функционального тестирования”

  1. seagull сказал:

    Уважаемая, потрудитесь объяснить не смекалистым что же нам дают эти 3 функции.
    Что-то я никак не соображу при чем тут мутанты к ошибкам.
    А если функция не учебная а реальная и мест для ошибок там N. Так что плодить K^N мутантов?

  2. pamella сказал:

    1. считаю такой тон недопустимым.
    2. ошибки делаються в наиболее вероятных местах опечаток. и только от Вас зависит где и какие мутанты создавать.
    также существуют системы для автоматической генерации тестов, которые используют подобный метод. Если он Вас не устраивает, никто не заставляет Вас его применять. :)

    З.Ы. почему "K^N" ?
    у вас одна ф-я и N мутантов к ней.

  3. pamella сказал:

    2 seagull:
    Вам известны другие более эффективные методы для отслеживания механических ошибок - расскажите :) меня интересует эта тема :)

  4. zeroreturn сказал:

    Метод очень неожиданый. К традиционному понятию функционального тестирования (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 за свежую идею огромный грасьяс :)

  5. seagull сказал:

    2 pamella
    1. Не тон, а стиль :)
    2. Ни в коем случае не хотел вас обидеть.
    3. Не вижу я практического применения вашего метода, вот и переспрашиваю.
    4. если N мест ошибок и в каждой ошибке K вариантов. Получаем K^N мутантов.

    2 zeroreturn:
    +5 :cool:
    Давайте устроим эволюцию кода от пустого оператора до необходимой функциональности через мутации :) Вот это был бы прорыв.

  6. zeroreturn сказал:

    кстати, pamella, ошибки типа выход за границы массива это далеко не механические ошибки... это можно сказать ошибки в голове того, кто их делает. механические ошибки, как я понимаю, это опечатки так или иначе отлавливаемые компилятором (хотя вспоминаю случай когда ставишь запятую перед всеми инклудами в СРР файле... :mad: )

  7. pamella сказал:

    2seagull:
    данный метод используеться тестровщиками при наличии спецификации. конечно никто не пишет это все руками.

    2zeroreturn:
    для границ - существует так называемый граничных метод (boundary testing). и именного его задача отслеживания глюков на границах интервалов.
    просто редко кто тестирует используя всего лишь один метод.

    по поводу классификации -
    1. это всего лишь классификация :)
    2. тестирование проводиться на уровне отдельно взятого модуля (=> уровень - модульный). тестируеться соответстиве функциональности данного модуля спецификации (=> функциональное)
    з.ы. - Вы кинули ссылку на системное тестирование - а функциональное - его под вид :)

    :wink:

  8. seagull сказал:

    Что-то у меня много вопросов возникает.

    1. Ну где же долгожданное описание?
    Вы утверждаете что есть метод (название пока не указано), который помогает обнаруживать и исправлять ошибки. Но где метод?

    2. Потрудитесь придерживаться устоявшейся терминологии. В вашем описании нету функционального тестирования. Возможно оно у вас используется как вспомогательное (мне так кажется почему то). Что же вы хотите донести в массы?

    3. Что же делать с экспоненциальным ростом количества мутантов?

  9. pamella сказал:

    1. описание какого именно метода? название метода БЫЛО указано - Mutation.
    "помагает обнаруживать и исправлять ошибки" - какие именно ошибки? для каждого типа ошибок существуют свои методы. тестироващики не используют один едиственный метод для тестирования всего приложения. В своем посте я описала один из методов. использовать его или нет, дело Ваше

    2. Я придерживаюсь терминологии. В моем понимании ее сформировали книги Бориса Бейзера, Gao Jerry(Testing and quality assurance for component-based software), Neelam Gupta (Black Box Testing Tucson, Arizona, USA)...

    3. А как отлавливание подобных ошибок выглядит в Вашем представлении? Вы хотите написать 1 тест, который за Вас найдет все Ваши ошибки? найдете такой мир - пригласите меня. Повторюсь еще раз - тестирование mutation (смешанным) методом проводиться на уровне выбранного модуля. и кол-во ошибок в (учитывая, что программист не дурак, а ошибки возникают механические) не может быть настолько большим, чтобы генерация тест кейсов была бессмысленной.

  10. pamella сказал:

    2seagull:
    у меня складываеться ощущение, что я говорю, а Вы меня не слышите. посему считаю дальнейшее продолжение этой "дискусии" бессмысленным. :???:

  11. seagull сказал:

    Похоже вам не хватает опыта в написании научных либо же технических текстов. Искренне желаю вам этот опыт наверстать.
    Перестаньте отвечать эмоционально.

    Теперь назад к нашим пунктам.

    1. В который раз повторюсь описания метода здесь нет. Хорошо хоть название появилось :)
    Если вы подзабыли что такое метод, то я напомню:
    Метод — систематизированная совокупность шагов, которые необходимо предпринять, чтобы выполнить определенную задачу или достичь определенной цели.

    Я просто прошу вас описать метод, а потом уже возможна хоть какая-то дисскусия о правомерности метода.

    2. Ух-ты как много авторов. Вот и здорово что вы столько прочитали (Особенно мне понравилось троеточие :) ), тогда вы уж точно знаете что такое функциональное тестирование. И умеете отличить его от системного.

    3. Не увиливайте от вопроса :) Что же делать с экспоненциальным ростом? При этом не забудьте что не известно в каких местах ошибки.

  12. pamella сказал:

    и еще раз.
    1. название метода изначально было указано. перечитайте еше раз.
    метод пощагово:
    1.1. есть функция
    1.2. создаем к ней мутанты
    1.3. выбираем набор (x,n) для программы P. если при выполнении программы и мутантов подтверждается правильность программы и, находяться все внесенные в программы-мутанты ошибки, то набор тестов (x,n) считают адектватным, а тестируемая программа объявляется правильной.
    если же набор (x,n) не выявил всех мутаций, то надо расширять набор и продолжать тестирование.

    2. я привела авторов книг которые относят данным метод к функциональному тестрованию.

    3. прежде чем начинать тестировать создаеться стратегия тестирования. в ней и определяеться является ли целесообразным использование определенного метода в данном случае. так вот, от экспоненциального роста Вы никуда не денетесь. но я не вижу в этом чего-то смертельно. тесты такие же программы и требуют ресурсов.
    например, у нас есть код в котором может быть 100 ошибок, на каждую по 2 мутанта => 1000 программок. вы запустили их и наблюдаете полученные результаты. а по ним уже делаете выводы.

    надеюсь, что ответила на ваши вопросы.
    ответная просьба ответить на мой

  13. seagull сказал:

    Теперь это уже ближе. Спасибо.
    Непонятно лишь условие остановки "расширения набора". И какие "сигналы" в случае если код неверен?

    >у нас есть код в котором может быть 100 ошибок, на >каждую по 2 мутанта => 1000 программок
    Скажем не по 2 мутанта, а по 2 возможных мутации. Тогда все возможные мутации не 100^2, а 2^100 - а это не очень и мало.
    Или все варианты мутаций не нужны?

    Поверьте мне действительно интересно докопаться, что же именно скрывается за mutation-методом.

    Ваш вопрос это:
    >А как отлавливание подобных ошибок выглядит в
    >Вашем представлении?
    так? Или я что-то пропустил?
    подобных - это опечаток? Ну, большинство опечаток отлавливает компилятор :) А в границах цикла я давненько не ошибался.
    Вообще-то придерживаюсь классическому подходу к функциональному тестированию. А из-за специфики ПО приходиться и дебугером поработать.
    Я достаточно ответил? :)

  14. zeroreturn сказал:

    2 seagull

    Если действительно интересно докопаться, что же именно скрывается за mutation-методом может проще читнуть литературу а не допрашивать с пристрастием pamella :roll:

  15. seagull сказал:

    2 zeroreturn:
    А как же спортивный интерес?

    Если pamella взялась поведать нам об этом методе, то пусть доведет начатое до завершения. Думаю ей это будет очень полезно. И следующая статья будет лучше, а главное организованней. Правда pamella? :)

  16. pamella сказал:

    2 seagull:
    условие остановки расширения набора - когда расходы на тестирования будут превышать допустимые в данном проэкте. + исходя из логики, того, кто проводит тестирования.
    их не обязательно должно быть мало. какие мутации вводить - решение того, кто проводит тестирование. а много или мало - вопрос риторический.
    ошибок в стиле написать ">" вместо "

  17. seagull сказал:

    "ничего не понимаю" (с) "Следствие ведут колобки" :)

    То у вас автоматический процесс, то полностью ручной. Иначе что за решения о вводе мутаций или нет.
    Ой, это я не удержался. ;)

    Извините, больше никаких вопросов.

    2 zeroreturn:
    Ты прав. Буду читать литературу.

  18. pamella сказал:

    2 seagull
    решение о завершении тестирования в любом случае принимает человек. если мутационный метод не дает результатов значит нужно использовать другой.
    одно из двух - либо я не понимаю о чем Вы спрашиваете, либо Вы не понимаите о чем я :)

  19. pamella сказал:

    2 seagull:
    попробуем уяснить - тесты создаються автоматически.
    но когда закончить тестирования данным методом решает человек.

  20. seagull сказал:

    >одно из двух - либо я не понимаю о чем Вы спрашиваете,
    >либо Вы не понимаите о чем я :)
    Думаю и то и другое :)

    Прийдется опять цитировать:
    "Либо что-то случилось либо одно из двух" :))

    Благодарен за упорство в ответах.
    Вы меня толкнули таки на чтение доков по этому методу за что опять же спасибо.

    Ждем следующий постов, но надеюсь что они будут более детально выписанными (что явно в ваших силах), чтобы не потребовалось так много выспрашивать.

  21. pamella сказал:

    2 seagull:
    постараюсь :) пасиб за критику, мне эт действительно полезно :)





Оставте свое мнение