ЛР №4 Мутационный критерий (класс IV).
Постулируется, что профессиональные программисты пишут сразу почти правильные программы, отличающиеся от правильных мелкими ошибками или описками типа — перестановка местами максимальных значений индексов в описании массивов, ошибки в знаках арифметических операций, занижение или завышение границы цикла на 1 и т.п. Предлагается подход, позволяющий на основе мелких ошибок оценить общее число ошибок, оставшихся в программе.
Подход базируется на следующих понятиях:
Мутации — мелкие ошибки в программе.
Мутанты — программы, отличающиеся друг от друга мутациями.
Метод мутационного тестирования — в разрабатываемую программу P вносят мутации, т.е. искусственно создают программы-мутанты P1, P2... Затем программа P и ее мутанты тестируются на одном и том же наборе тестов (X,Y).
Если на наборе (X,Y) подтверждается правильность программы P и, кроме того, выявляются все внесенные в программы-мутанты ошибки, то набор тестов (X,Y) соответствует мутационному критерию, а тестируемая программа объявляется правильной.
Если некоторые мутанты не выявили всех мутаций, то надо расширять набор тестов (X,Y) и продолжать тестирование.
Пример применения мутационного критерия
Тестируемая программа P приведена на пример 3.2. Для нее создается две программы-мутанта P1 и P2.
В P1 изменено начальное значение переменной z с 1 на 2 (пример 3.3).
В P2 изменено начальное значение переменной i с 1 на 0 и граничное значение индекса цикла с n на n-1 (пример 3.4).
При запуске тестов (X,Y) = {(x=2,n=3,y=8),(x=999,n=1,y=999), (x=0,n=100,y=0 } выявляются все ошибки в программах-мутантах и ошибка в основной программе, где в условии цикла вместо n стоит n-1:
// Метод вычисляет неотрицательную // степень n числа x 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( "Ошибка ! Степень числа n должна быть больше 0."); return z; }
Пример 3.2. Основная программа P
double PowerNonNeg(double x, int n) { double z=1; int i; if (n>0) { for (i=1;n-1>=i;i++) { z = z*x; } } else printf( "Ошибка ! Степень числа n должна быть больше 0.\n"); return z; }
Пример 3.2.1. Основная программа P
Измененное начальное значение переменной z в мутанте Р1 помечено светлым тоном:
// Метод вычисляет неотрицательную // степень n числа x 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( "Ошибка ! Степень числа n должна быть больше 0."); return z; }
Пример 3.3. Программа мутант P1. (html, txt)
double PowerMutant1(double x, int n) { double z=2; int i; if (n>0) { for (i=1;n>=i;i++) { z = z*x; } } else printf( "Ошибка ! Степень числа n должна быть больше 0.\n"); return z; }
Пример 3.3.1. Программа мутант P1.
Измененное начальное значение переменной i и границы цикла в мутанте P2 помечено светлым тоном:
// Метод вычисляет неотрицательную // степень n числа x 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( "Ошибка ! Степень числа n должна быть больше 0"); return z; }
Пример 3.4. Программа-мутант P2. (html, txt)
double PowerMutant2(double x, int n) { double z=1; int i; if (n>0) { for (i=0;n-1>=i;i++) { z = z*x; } } else printf( "Ошибка! Степень числа n должна быть больше 0.\n"); return z; }
Пример 3.4.1. Программа-мутант P2.
CC-BY-CA Цыганенко В.Н., 15.10.2012