Тестирование Програмного Обеспечения
Лабораторная работа №1
Тема:
Статический и динамический анализ кода.
Тестирование методом «Черного Ящика».
Цель:
Получить практический опыт проведения статического и динамического анализа кода. Научиться производить тестирование программных систем методом «Черного Ящика».
Убедиться в различной эффективности анализа кода и тестирования методом «Черного Ящика».
Выполнил студент
Группы
5513
(Г.2008)
Исходные данные: код программы с ошибками на языке C#.
//программа считает прирост процентов по депозиту за определенный срок
namespace Percent
{
public class Program
{
public static void Main(string[] args)
{
int nMaxRateSize = 20;
Console.WriteLine("Please enter the sum of your deposit");
string sDeposit = Console.ReadLn();
decimal mDeposit = Convert.ToDecimal(sDeposit);
Console.Write("Please, enter your percent's rate \n");
string sRate = Console.ReadLine();
decimal mRate = Convert.ToDecimal(sRate);
if (mRate < 0 || mRate > nMaxRateSize)
{
Console.WriteLine("Rate Cannot be negative and > 20! \n");
mRate = 0;
}
else
{
Console.WriteLine("Please, enter the number of years \n");
string sDuration = Console.ReadLine();
int nDuration = Convert.ToInt32(sDuration);
Console.WriteLine();
Console.WriteLine("Deposit = " + mDeposit);
Console.WriteLine("Percent rate = " + mRate + " %");
Console.WriteLine("The duration is " + nDuration + " years");
Console.WriteLine();
int nYear = 0;
while (nYear <= nDuration)
{
decimal mPercent;
mPercent = mDeposit * (mRate / 100);
mDeposit = mDeposit + mPercent;
mDeposit = decimal.Round(mDeposit, 2);
Console.WriteLine(nYear + " - " + mDeposit);
++nYear;
}
}
}
}
}
Задание:
1. Написать техническую спецификацию на программу. Смотри пример №1.
2. Провести статический анализ кода, найти ошибки, описать и исправить их. При желании разрешается переписать программу на языки С/С++ или Java.
3. Провести динамический анализ кода, найти ещё не найденные ошибки, описать и исправить их.
4. Протестировать программу методом «Черного Ящика» используя написанную техническую спецификацию, найти ещё не найденные ошибки, описать и исправить их. Необходимо привести в отчёте тестовые данные и результаты работы программы. Смотри пример №2.
Примечание: если Вы не нашли ошибку при прохождении пункта 2 либо 3, а нашли в следующем (но по вашему мнению она должна была быть найдена в предыдущем), НЕ следует возвращаться к пройденным пунктам: опишите и исправьте ошибку там, где Вы её действительно нашли.
Техническая спецификация:
По задумке автора программа рассчитывает сумму депозита за год.
Программа на вход принимает три параметра:
· mDeposit– сумма вложена\изъятая
· mRate – процент под который положена\изъята сумма (введенный параметр должен соответствовать поставленным условям. Т.Е. значения параметра должны быть строго больше «0» и строго меньше значения параметра nMaxRateSize(В нашем случае nMaxRateSize = 20 ) В противном случае выводится сообщение о неверно заданном параметре расчета)- Также Зачем-то производится присваивание параметру mRate значение «0»
· nDuration – количество лет ( на который будет производиться расчет)
Тестовые данные тестирования методом «черного ящика»
Будем тестировать функцию рассчитывающую сумму депозита за определенный год
(Сумма Депозита за текущий год) = (сумма Депозита за предыдущий год )+ (процент начисления)
Начальная сумма депозита -D
Период расчета – n
Проценты – P - если 20<P<=0 – выдается сообщение о ошибке
Искомая Сумма Депозита – D(n)
=>пусть (1+P/100)=Z соответственно Тестируемая функция D(n)=D(Z)n
В програме реализована кодом
while (nYear <= nDuration)
{
decimal mPercent;
mPercent = mDeposit * (mRate / 100);
mDeposit = mDeposit + mPercent;
mDeposit = decimal.Round(mDeposit, 2);
Console.WriteLine(nYear + " - " + mDeposit);
++nYear;
}
НА мой взгляд следует заменить на :
for (int nYear = 1 ; nYear <= nDuration ; nYear++)
{
mDeposit =*(1+mRate/100);
mDeposit = decimal.Round(mDeposit, nYear);
Console.WriteLine(nYear + " - " + mDeposit);
}
1)Нет необходимости пропечатывать n=0
2)меньше переменных и действий
Также если Значение процента Депозита ограничено условиями ввода, логично ограничить также и остальные параметры(Период расчета и Начальная сумма депозита)
исправленная версия программы после выполнения пункта 2,3,4
namespace Percent
{
public class Program
{
public static void Main(string[] args)
{
int nMaxRateSize = 20;
decimal nMaxDepositSize = 1000;
decimal nMaxDurationSize = 30;
// дополнительно обьявляю переменные
Console.WriteLine("Please enter the sum of your deposit");
string sDeposit = Console.ReadLine();
//Исправленно Readln -> Readline
decimal mDeposit = Convert.ToDecimal(sDeposit);
for (;(mDeposit <= 0 || mDeposit > nMaxDepositSize);)
{
Console.WriteLine("Deposit Cannot be negative and > " + nMaxDepositSize + " \npease, enter your Deposit summ again\n");
sDeposit = Console.ReadLine();
mDeposit = Convert.ToDecimal(sDeposit);
}
//Вставленно условие проверки на входные данные mDeposit
Console.Write("Please, enter your percent's rate \n");
string sRate = Console.ReadLine();
decimal mRate = Convert.ToDecimal(sRate);
for (;(mRate <= 0 || mRate > nMaxRateSize);)
{
Console.WriteLine("Rate Cannot be negative and > " + nMaxRateSize + " \npease, enter your percent's rate again\n");
sRate = Console.ReadLine();
mRate = Convert.ToDecimal(sRate);
}
//исправленно условие проверки на входные данные mRate <= 0!!!
Console.WriteLine("Please, enter the number of years \n");
string sDuration = Console.ReadLine();
int nDuration = Convert.ToInt32(sDuration);
for (;(nDuration <= 0 || nDuration > nMaxDurationSize);)
{
Console.WriteLine("Number of ears Cannot be negative and > " + nMaxDurationSize + " \npease, enter your Number of ears again\n");
sDuration = Console.ReadLine();
nDuration = Convert. ToInt32(sDuration);
}
//Вставленно условие проверки на входные данные mDuration
Console.WriteLine();
Console.WriteLine("Deposit = " + mDeposit);
Console.WriteLine("Percent rate = " + mRate + " %");
Console.WriteLine("The duration is " + nDuration + " years");
Console.WriteLine();
for (int nYear = 1 ; nYear <= nDuration ; nYear++)
{
mDeposit *=(1+mRate/100);
mDeposit = decimal.Round(mDeposit, nYear);
Console.WriteLine(nYear + " - " + mDeposit);
}
Console.WriteLine("press enter plz");
string end = Console.ReadLine();
//дает возможность просмотреть результаты расчетов
}
}
}
Тестовые данные
D(0:1000] P(0:20] n(0:30]
D |
P |
N |
Ожидаемые корни |
Полученные корни |
100 |
10 |
3 |
110;121;133.1 |
1 - 110; 2 - 121; 3 - 133.1 |
250 |
15 |
4 |
287.5;330.62;380.213;437.245 |
1 - 287.5 2 - 330.62 3 - 380.213 4 - 437.245 |
Фиктивные данные (D(n)<0 или любой из параметров не удовлетворяет условиям):
D |
P |
n |
Ожидаемые корни |
Полученные корни |
0 |
10 |
2 |
Сообщение об ошибке |
"Deposit Cannot be negative and > 1000 pease, enter your Deposit summ again |
100 |
0 |
2 |
Сообщение об ошибке |
Rate Cannot be negative and > 20 pease, enter your percent's rate again |
100 |
10 |
0 |
Сообщение об ошибке |
Number of ears Cannot be negative and > 30 pease, enter your Number of ears again |
Примерные вопросы для подготовки защите:
1. Что такое тестирование ПО? Назовите цели тестирования.
- Процесс выявления(исправления) неисправностей/ошибок в ПО. Цель – ПО=)
2. Что такое анализ исходного кода программы? Назовите преимущества и недостатки.
- Выявление преследуемых целей, способа их реализации на основания написанного для них кода(исходного).
3. Что такое и чем отличаются статический и динамический анализ кода? Назовите преимущества и недостатки каждого.
-Статический анализ – анализ без запуска программы. Преимущество: Использует сильнейший компилятор твой собственный мозг. В этом же и его недостаток. Динамический анализ –проводится непосредственно запуская программу и помогает выявить багги не проявляющие себя в статическом состоянии. Недостаток : Пока программа не запускается в нем нет смысла
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.