Модуль DictionaryParser.Parse()
Алгоритм и код
Программный код модуля приведен в листинге 1.
Листинг 1
public void Parse() | ||
{ | ||
using (FileStream stream = new FileStream(_filePath, FileMode.Open, FileAccess.Read)) | ||
{ | ||
StreamReader reader = new StreamReader(stream); | ||
while (!reader.EndOfStream) | ||
{ | ||
string line = reader.ReadLine().ToLower(); | ||
int openBracket; | ||
string initialForm = ""; | ||
try | ||
{ | ||
openBracket = line.IndexOf('('); | ||
if (openBracket == -1) | ||
throw new DictionaryException(_dictionaryType, | ||
DictionaryExceptionReason. НевозможноПроанализироватьВариантыФорм); | ||
initialForm = string.Concat(line .Where((c, i) => i < openBracket)).Trim().ToUpper(); | ||
} | ||
catch | ||
{ | ||
throw new DictionaryException(_dictionaryType, | ||
DictionaryExceptionReason. НеОбнаруженаНачальнаяФорма); | ||
} | ||
Dictionary[initialForm] = new List<string>() {initialForm}; | ||
Dictionary[initialForm].AddRange(line.Substring(openBracket + 1) | ||
.Split(new string[] {",", ")"}, | ||
StringSplitOptions. RemoveEmptyEntries) | ||
.Select(s => s.Trim().ToUpper()) | ||
.ToList()); | ||
} | ||
reader.Close(); | ||
} | ||
} |
Блок-схема метода приведена на рисунке ниже (Рисунок 3).
Рисунок 3. Блок-схема модуля DictionaryParser.Parse
Приведенный алгоритм использует язык интегрированных запросов для облегчения чтения и преобразования данных. Все считанные данные хранятся в свойстве Dictionary класса.
Тестирование базового пути
Построение потового графа
Потоковый граф рассматриваемого модуля с указанием регионов и выделенными предикаторными узлами приведен ниже (см. Рисунок 4).
Рисунок 4. Потоковый граф модуля DictionaryParser.Parse
Оценка цикломатической сложности
Приведенный граф позволяет оценить минимальное количество тестов, которые должны быть проведены. Оценку цикломатической сложности будем производить тремя указанными методами:
1) V(G) = количество регионов = 4
2) V(G) = количество дуг – количество узлов + 2 = 15 – 13 + 2 = 4
3) V(G) = количество предикатных узлов +1 = 3 + 1 = 4
Таким образом, необходимо составить 4 теста, охватывающих независимые пути в графе.
Определение базового множества независимых путей
Путь начинается в начальном узле, а заканчивается в конечном узле графа. Независимые пути необходимо разрабатывать в порядке от самого короткого к самому длинному.
Были выявлены следующие независимые пути:
1) 1-12-13
2) 1-2-3-12-13
3) 1-2-3-4-5-6-8-10-11-3-12-13
4) 1-2-3-4-5-6-7-9-10-11-3-12-13
В представленном списке не учитывался факт наличия цикла (отрезки путей 3-4…-…-11могут повторяться неоднократно)
Подготовка тестовых вариантов
Для тестирования каждого из независимых путей были созданы тестовые варианты исходных данных. Сами данные (ИД), ожидаемый от них результат (ОЖ. РЕЗ.) и результат, полученный фактически при выполнении программы (Ф. РЕЗ.), приведены в Таблица 5. Тестирование выполняется для справочника «Субъекты».
Таблица 5. Тестовые варианты для метода базового пути
№ | ИД | ОЖ. РЕЗ. |
Файл Субъекты.txt отсутствует | Выброшено исключение FileNotFoundException, которое затем перехвачено в методе Program.Main. | |
Файл Субъекты.txt не содержит данных | Свойство DictionaryParser.Dictionary инициализировано пустым словарем. | |
Файл Субъекты.txt содержит одну или несколько корректных строк: Студент (Студента, Студенту, Студентом, Студенте) Студенты (Студентов, Студентам, Студентами, Студентах) | Свойство DictionaryParser.Dictionary содержит словарь: СТУДЕНТ -> [0]: "СТУДЕНТ" [1]: "СТУДЕНТА" [2]: "СТУДЕНТУ" [3]: "СТУДЕНТОМ" [4]: "СТУДЕНТЕ" СТУДЕНТЫ -> [0]: "СТУДЕНТЫ" [1]: "СТУДЕНТОВ" [2]: "СТУДЕНТАМ" [3]: "СТУДЕНТАМИ" [4]: "СТУДЕНТАХ" | |
Файл Субъекты.txt содержит одну или несколько некорректных строк: Студент Студента, Студенту, Студентом, Студенте) Примечание: отсутствует символ ‘(‘ | Выброшено исключение DictionaryException, которое затем перехвачено в методе Program.Main. |