Лекция 8. Основы технологии разработки тестов UniTESK (1186167), страница 4
Текст из файла (страница 4)
Кроме того, с помощью меток отметимотдельно случаи пустого списка и списка с единственным элементом. Соответствующиеспецификации даны ниже.public static boolean arrayContains(E[] a, int start, int number, E o){for(int i = 0; i < number; i++)if(equalObjects(a[i + start], o)) return true;return false;}public specification int indexOf(E o){post{if(items.length == 0) mark “Empty list”;else if(items.length == 1) mark “List with single element”;E oldItems[] = (E[])items.clone();if(arrayContains(items, 0, items.length, o)){branch ObjectInList;returnthrown == null&& objectsAreEqual(oldItems[indexOf], o)&& !arrayContains(oldItems, 0, indexOf, o)&& items.length == oldItems.length&& equalArrays(items, 0, oldItems, 0, items.length);}else{branch NoObjectInList;returnthrown == null&& indexOf == -1&& items.length == oldItems.length&& equalArrays(items, 0, oldItems, 0, items.length);}}}public specification E remove(int i)throws IndexOutOfBoundsException{post{if(items.length == 0) mark “Empty list”;else if(items.length == 1) mark “List with single element”;E oldItems[] = (E[])items.clone();if(i < 0 || i >= items.length){branch ExceptionalCase;returnthrown != null&& thrown instanceof IndexOutOfBoundsException&& items.length == oldItems.length&& equalArrays(items, 0, oldItems, 0, items.length);}else{branch NormalCase;returnthrown == null&& remove == oldItems[i]&& items.length == oldItems.length - 1&& equalArrays(items, 0, oldItems, 0, i)&& equalArrays(items, i, oldItems, i+1, items.length–i);}}}}Набор возможных помеченных путей в этой спецификации выглядит так.add()Empty listExceptionalCaseEmpty listNormalCaseExceptionalCaseNormalCaseindexOf()Empty listObjectInListEmpty listNoObjectInListList with single elementObjectInListList with single elementNoObjectInListObjectInListNoObjectInListremove()Empty listExceptionalCaseEmpty listNormalCaseList with single elementExceptionalCaseList with single elementNormalCaseExceptionalCaseNormalCaseСитуации, выделенные серым цветом в таблице, недостижимы — пустой список неможет содержать элементов и из пустого списка нельзя удалить элемент понеотрицательному индексу, меньшему длины списка.Вторая ситуации автоматически будет отброшена инструментом, поскольку онаописывается невозможной комбинацией равенств и неравенств между целыми числами:items.length == 0, !(i < 0), !(i >= items.length).Первая же ситуация описывается комбинацией условий, связь между которымиинструменту, вообще говоря, непонятна: items.length == 0, arrayContains(items, 0,items.length, o).
Поэтому, чтобы выбросить ее из обрабатываемого инструментоммножества ситуаций, надо написать в спецификации тавтологию, явно указывающую связьмежду входящими в эту комбинацию условиями. После этого постусловие метода indexOf()выглядит так.post{if(items.length == 0) mark “Empty list”;else if(items.length == 1) mark “List with single element”;E oldItems[] = (E[])items.clone();tautology items.length == 0 =>!arrayContains(items, 0, items.length, o);...}Для еще более детальной оценки полноты тестирования может использоваться критерийпокрытия коротких дизъюнктов, составленных из условий, встречающихся в условияхоператоров ветвления или участвующих в определении ветви оператора выбора до одного изоператоров branch.Литература.