Пример регрессионного тестирования функции решения квадратного уравнения.
Код этой функции приведен на пример 11.1. Входными параметрами являются коэффициенты квадратного уравнения A, B и C, а также флаг Print, ненулевое значение которого указывает, что полученное решение необходимо вывести на экран. К выходным параметрам относятся X1 и X2, предназначенные для хранения корней уравнения, и возвращаемое значение функции - дискриминант уравнения. В исходном виде функция содержит дефект, в результате чего уравнения с отрицательным дискриминантом порождают ошибку времени выполнения. В новой версии функции дефект должен быть исправлен; кроме того, необходимо реализовать запрос пользователя на изменение формата вывода решения. Код новой версии функции Equation приводится на пример 11.2.
Существующие тесты для функции Equation приведены в таблица 11.2. Входные данные тестов представляют собой совокупность значений Print, A, B и C, подаваемых на вход функции. Выходными данными для теста являются значения X1 и X2, возвращаемое значение функции, а также строка, выводимая на экран; в таблица 11.2 приведены ожидаемые значения выходных данных. Кроме того, для каждого теста вычисляется траектория его прохождения по коду.
double Equation(int Print, float A, float B, float C, float& X1, float& X2) { float D = B * B - 4.0 * A * C; if (D >= 0) { X1 = (-B + sqrt(D)) / 2.0 / A; X2 = (-B - sqrt(D)) / 2.0 / A; } else { X1 = -B / 2.0 / A; X2 = sqrt(D); } if (Print) printf("Solution: %f, %f\n", X1, X2); return D; } Пример 11.1. Функция Equation - исходная версия. double Equation(int Print, float A, float B, float C, float& X1, float& X2) { float D = B * B - 4.0 * A * C; if (D >= 0) { X1 = (-B + sqrt(D)) / 2.0 / A; X2 = (-B - sqrt(D)) / 2.0 / A; } else { X1 = -B / 2.0 / A; X2 = sqrt(D); } if (Print) printf("Solution: %f, %f\n", X1, X2); return D; } Пример 11.1.1. Функция Equation - исходная версия. double Equation(int Print, float A, float B, float C, float& X1, float& X2) { float D = B * B - 4.0 * A * C; if (D >= 0) { X1 = (-B + sqrt(D)) / 2.0 / A; X2 = (-B - sqrt(D)) / 2.0 / A; } else { X1 = -B / 2.0 / A; X2 = sqrt(-D); } if (Print) { if (D >= 0) printf("Solution: X1 = %f, X2 = %f\n", X1, X2); else printf("Solution: X1 = %f+%fi, X2 = %f-%fi\n", X1, X2, X1, X2); } return D; } Пример 11.2. Функция Equation - измененная версия. double Equation(int Print, float A, float B, float C, float& X1, float& X2) { float D = B * B - 4.0 * A * C; if (D >= 0) { X1 = (-B + sqrt(D)) / 2.0 / A; X2 = (-B - sqrt(D)) / 2.0 / A; } else { X1 = -B / 2.0 / A; X2 = sqrt(-D); } if (Print) { if (D >= 0) printf("Solution: X1 = %f, X2 = %f\n", X1, X2); else printf("Solution: X1 = %f+%fi, X2 = %f-%fi\n", X1, X2, X1, X2); } return D; } Пример 11.2.1. Функция Equation - измененная версия.При изменении функции Equation от пример 11.1 к пример 11.2 меняется формат выводимых на экран данных, так что тесты 1 и 2, проверяющие вывод на экран, могут быть повторно использованы только на уровне 2. Тесты 3, 4 и 5 могут быть использованы на уровне 3 или 4 в зависимости от результатов анализа их траектории.