
отчеты по лабораторным работам / все лабы итип / 5511-1-s17&s14
.docСанкт-Петербургский Государственный Университет Информационных Технологий, Механики и Оптики
Кафедра Информационных Технологий и Программирования
Лабораторная работа №1.
Тема: Статический и динамический анализ кода. Тестирование методом «Черного Ящика».
Выполнили студенты:
Шевченко Алексей
Тихонов Дмитрий
Группа: 5511
Преподаватель:
Санкт-Петербург
2008 год
1. Данный пример творчества неизвестного программиста получает при старте 3 переменные: сумму вклада, процентную ставку и время вклада в годах. Далее эти данные выводятся на консоль, а на их основе производится вклада с суммированием процентов на время срока вклада, и также выводится на консоль на каждый год. Если сумма вклада меньше либо равно нулю – ошибка, если процент больше 20 либо отрицателен – ошибка, если время вклада меньше, либо равно нулю – ошибка.
2. Цель: Получить практический опыт проведения статического и динамического анализа кода. Научиться производить тестирование программных систем методом «Черного Ящика». Убедиться в различной эффективности анализа кода и тестирования методом «Черного Ящика».
Исходные данные: код программы с ошибками на языке 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.
-
Провести статический анализ кода, найти ошибки, описать и исправить их. При желании разрешается переписать программу на языки С/С++ или Java.
-
Провести динамический анализ кода, найти ещё не найденные ошибки, описать и исправить их.
-
Протестировать программу методом «Черного Ящика» используя написанную техническую спецификацию, найти ещё не найденные ошибки, описать и исправить их. Необходимо привести в отчёте тестовые данные и результаты работы программы. Смотри пример №2.
//1 итерация
using System;
using System.Collections.Generic;
using System.Text;
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.ReadLine();
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;
}
Console.ReadLine();
}
}
}
}
Баги:
-
Отсутствует подключение системных классов
-
Console.ReadLn() – это не паскаль
-
Отсутсвует проверка длительности вклада на отрицательные значения nDuration <= 0
-
Логическая ошибка: начинает отсчет с нулевого года, лечится int nYear = 1;
-
Нет проверок на пустые строки. Не ловит исключения ошибок конвертации.
//итоговый код
using System;
using System.Collections.Generic;
using System.Text;
namespace Percent
{
public class Program
{
public static void Main(string[] args)
{
int nMaxRateSize = 20;
decimal mDeposit=0;
Console.WriteLine("Please enter the sum of your deposit");
string sDeposit = Console.ReadLine();
try
{
mDeposit = Convert.ToDecimal(sDeposit);
}
catch (FormatException)
{
Console.WriteLine("Exception thrown, program handled ");
return;
}
if (mDeposit <= 0)
{
Console.WriteLine("You need more money \n");
}
else
{
Console.Write("Please, enter your percent's rate \n");
string sRate = Console.ReadLine();
decimal mRate = 0;
try
{
mRate = Convert.ToDecimal(sRate);
}
catch (FormatException)
{
Console.WriteLine("Exception thrown, program handled");
return;
}
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=0;
try
{
nDuration = Convert.ToInt32(sDuration);
}
catch (FormatException)
{
Console.WriteLine("Exception thrown, program handled ");
return;
}
if (nDuration <= 0)
{
Console.WriteLine("We recieve deposits atlist for a year/ \n");
}
else
{
Console.WriteLine();
Console.WriteLine("Deposit = " + mDeposit);
Console.WriteLine("Percent rate = " + mRate + " %");
Console.WriteLine("The duration is " + nDuration + " years");
Console.WriteLine();
int nYear = 1;
while (nYear <= nDuration)
{
decimal mPercent;
mPercent = mDeposit * (mRate / 100);
mDeposit = mDeposit + mPercent;
mDeposit = decimal.Round(mDeposit, 2);
Console.WriteLine(nYear + " - " + mDeposit);
++nYear;
}
}
}
}
}
}
}
-
sDeposit
sRate
sDuration
Ожидаемые результаты
Полученные результаты
0
0
0
Ошибка
Ошибка
1
0
0
Ошибка
Ошибка
1
10
1
1,1
1,1
-100
20
30
Ошибка
Ошибка
100
15
-1
Ошибка
Ошибка
100
35
12
Ошибка
Ошибка
4. Итоги: Цель работы достигнута, тестирование проведено успешно, программа заработала так как должна. Приобрел навыки написания отчетов по тестированию, вспомнил как ловить исключения в C#.