You are on page 1of 23

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ЗАХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ


ФАКУЛЬТЕТ КОМП’ЮТЕРНИХ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ

Кафедра комп’ютерних наук

Комплексне практичне індивідуальне завдання


з дисципліни «Основи інженерії програмного забезпечення»

Виконав:
студент групи ІПЗ – 12
Строгий Є.В.
Перевірила:
к.т.н., доцент
Порплиця Н.П.

Тернопіль – 2022
Додаток Б
РОЗДІЛ 1. АНАЛІЗ ВИМОГ ДО РОЗРОБЛЮВАНОГО ПРОГРАМНОГО
ЗАБЕЗПЕЧЕННЯ
Індивідуальний варіант завдання
Ви є розробником софтверної компанії. Одного дня до вас приходить
представник компанії “Фармацевтика”. Дана компанія займається
виробництвом ліків.
Спершу коли компанія створилася, то основним її варіантом було
виробництво ліків від кашлю. Кількість видів таких ліків було небагато, і
тому
для обліку використовувалася звичайна записна книжка. Проте, пройшов час
і
компанія розвинулася до виробництва різних видів ліків.
На даному підприємстві виникла проблема із тим, що зберігати записи
про види ліків в записній книжці, стало недостатньо.
Дане підприємство хоче, щоб ви створили програмний продукт для
того,
щоб можна було вести облік кількості вироблених ліків, а саме щоб була
можливість записувати інформацію про певний вид ліків і їх кількість. Також
має бути надана можливість їх видаляти. Інформація повинна представлятися
у вигляді таблиці. Дана інформація повинна зберігатися у файлі. Причому
записи у таблиці мають представлятися жирним шрифтом. У самій останній
колонці таблиці має бути надана можливість завантажити фотографію
певного виду ліків.
Потрібно розробити програмний продукт, який буде враховувати дані
вимоги.
Функціональні вимоги
Функція №1: Вибір типу користувача
Опис: ця функція дозволяє вибрати користувачу спосіб авторизації в
програму: як звичайний користувач чи як адміністратор.
Передумова: відкрита форма для входу.

Функція №2: Вхід в програму як працівник компанії


Опис: ця функція дозволяє адміністратору за допомогою логіна і пароля
отримати розширений доступ функцій до програми.
Вхідні дані: Логін, Пароль .
Джерела даних: адміністратор .
Передумова: правильно введений логін і пароль.

Функція №3: Вхід в програму як користувач


Опис: ця функція дозволяє користувачу шукати товари в базі даних за їх
назвою
Вхідні дані: Назва ліків.
Джерела даних: база даних .
Передумова: правильно введена назва ліків.

Функція №4: Перегляд списку товарів


Опис: ця функція дозволяє переглядати список товарів у таблиці.
Вхідні дані: Список даних товарів.
Джерела даних: локальна база даних «pharmacy.accdb».
Вихідні дані: список даних товарів у вигляді таблиці.
Передумова: відкрита форма для перегляду таблиці.

Функція №5: Додавання нових товарів (тільки для адміністратора)


Опис: дана функція забезпечує можливість адміністратору додавати нові
товари.
Вхідні дані: назва товарів, інформація про продукт, кількість товару, ціна
товару.
Джерела даних: адміністратор.
Вихідні дані: додані у таблицю дані про товар.
Передумова: відкрита форма для редагування таблиці.
Функція №6: Видалення товарів (тільки для адміністратора)
Опис: дана функція забезпечує можливість адміністратору видаляти вибрані
товари.
Вхідні дані: ID товару.
Джерела даних: адміністратор.
Вихідні дані: видалення даних товару з таблиці.
Передумова: відкрита форма для редагування таблиці.

Функція №7: Редагування товарів (тільки для адміністратора)


Опис: дана функція забезпечує можливість адміністратору редагувати дані
товару.
Вхідні дані: назва товарів, інформація про продукт, кількість товару, ціна
товару.
Джерела даних: адміністратор.
Вихідні дані: змінені дані товару.
Передумова: відкрита форма для редагування таблиці.

Функція №8: Додавання фотографії товарів (тільки для адміністратора)


Опис: дана функція забезпечує можливість адміністратору додати до таблиці
фотографію товару.
Вхідні дані: місце розташування файлу з фотографією.
Джерела даних: адміністратор.
Вихідні дані: поле з фотографією товару.
Передумова: відкрита форма для редагування таблиці.
Не функціональні вимоги:
 Зручний користувацький інтерфейс
 Усі взаємодії між інтерфейсом середовища програмування та користувачем
здійснюються на основі стандартної множини символів мови С#
 Користувачі не повинні мати доступу до панелі адміністратора

На рисунку 1 наведено UML діаграму варіантів використання для


акторів системи: користувача та адміністратора відповідно. Варто зазначити,
що діаграма варіантів використання візуалізує різноманітні сценарії взаємодії
між акторами та прецедентами та описує бізнес-логіку процесу
функціонування системи.

Рис. 1 – Діаграма варіантів використання системи


Для кращого зрозуміння процесу функціонування розроблюваної
програмної системи побудовано діаграми послідовності дій (активності) для
основних варіантів використання системи. Діаграма послідовності дій для
варіанту використання «Авторизація» проілюстрована на рисунку 2.

Рис. 2 – Діаграма варіанту використання «Авторизація»


Як видно, із рисунку 2 для здійснення процесу авторизації користувач
повинен перейти на сторінку авторизації та обрати тип користувача системи:
користувач чи адміністратор. Далі, відповідно обраного варіанту авторизації:
ввести свій логін та пароль для адміністратора, або натиснути кнопку
«Гість». Далі система перевіряє правильність введення логіну та паролю,
якщо вони вірні, то адміністратор переходить на головну сторінку
програмної системи, а в протилежному випадку: виводиться відповідне
повідомлення про помилку.
Рис. 3 - Діаграма варіанту використання «Додати новий товар»
Рис. 4 - Діаграма варіанту використання «Видалити товар»
Рис. 5 - Діаграма активності варіанту використання «Оновити інформацію
про товар»
Рис. 6 - Діаграма варіанту використання пошуку товару за ім’ям

На поданих вище рисунках 3, 4, 5, 6 зображені послідовності


використання певних дій програми, а саме редагування даних в спадаючих
списках.

Рисунок 3 показує як додавати нові товари в спадаючих списках для


подальшого використання, тобто: потрібно, написавши назву нового пункту
призначення, натиснути кнопку «Додати новий товар» і він вмить появиться
у списку з появи повідомлення про успішне виконання операції.

Відповідно і видалити вибраний пункт не так і складно: натиснути


кнопку «Видалити товар», після натиснення на певний пункт після чого
також появиться вікно з повідомленням про результат виконання дій.

Рисунок 5 показує як можна оновити інформацію про товар: потрібно


обрати яку саме інформацію буде змінено та натиснути кнопку «Оновити
інформацію про товар».

На кінець останній рисунок 6, а саме пошук товару за його ім’ям.


Користувачу потрібно лише ввести назву будь якого товару в поле пошуку та
він вмить відобразиться. Адміністратор може таким чином швидко знайти
товар який хоче відредагувати або видалити, а гість може подивитися його
ціну та кількість одиниць товару в наявності.
РОЗДІЛ 2. ОПИС РЕАЛІЗАЦІЇ ТА ТЕСТУВАННЯ ПРОГРАМНОГО
ПРОДУКТУ
Програмна система реалізована за допомогою мови програмування C#
із використанням програмного середовища Microsoft Visual Studio 2019 а
також бази даних Microsoft Access.
3.1 ІНСТРУКЦІЯ КОРИСТУВАЧА
Для коректної роботи системи висуваються наступні системні вимоги:
 Операційна система: Windows 7/8/8.1 (або новіша)
 Розширення екрану: 1336x768 (для відображення інтерфейсу
програми у повноекранному режимі)
 Має бути встановлений Microsoft Net Framework 6.0
 Встановлено драйвер ‘AccessDatabaseEngine’ (драйвер
знаходиться в папці програми)
Щоб запустити програму натисніть двічі на іконку ‘OIPZ_KPIZ’ лівою
клавішею миші, після цього вам буде завантаженого вікно системи для
вибору типу користувача, яке проілюстровано на рисунку 1.

Рис. 1 – Головне вікно програми


Для того щоб увійти в робочий простір програми, потрібно вести логін
і пароль і натиснути кнопку увійти (див. рис. 2).
Рис. 2 – Вікно авторизації у панель адміністратора
Увійшовши в програму, ви побачите таблицю даних про товари (див.
рис. 3).

Рис.3 – Вікно редагування (панель адміністратора)


Увійшовши в програму, ви побачите поля для вводу даних та таблицю
для виведення інформації і зможете змінювати дані товарів (редагувати,
створювати, видаляти). Щоб додати новий товар - потрібно вписати потрібні
дані у відповідні поля та після того натиснути на кнопку «Додати новий
товар». Одразу, після натискання кнопки, у таблиці з’являється новий рядок
даних. Щоб видалити товар - достатньо просто вибрати за індексом
потрібний рядок та після того натиснути кнопку «Видалити». Остання
функція – редагування даних, а щоб її використати потрібно – вибрати
певний рядок за індексом, ввести дані в поля зліва та натиснути кнопку
«Редагувати», після чого у таблиці зміняться дані у вибраному рядку. (див.
рис. 3).

Рис. 4 – Вікно яке бачить гість


Увійшовши в програму як гість, Ви побачите поле для вводу назви
товару та список всіх товарів.
3.2 ТЕСТУВАННЯ
Якість програмного продукту можна охарактеризувати множиною його
властивостей, які визначають, наскільки програмний продукт «хороший» з
точки зору зацікавлених сторін. Варто зазначити, що до зацікавлених сторін
відносяться: замовник продукту, кінцевий користувач, розробники і
тестувальники та ін. Отже, щоб забезпечити належну якість програмного
продукту, необхідно розробити оптимальне рішення, яке б водночас
задовольняло вимоги усіх зацікавлених сторін.
Потрібно зазначити, що тестування є одним із завершальних етапів
життєвого циклу програмного продукту, адже на етапі тестування
виявляються виявити помилки допущені на попередніх етапах розробки
програмного забезпечення. Проведення етапу тестування фактично означає
перевірку процесу роботи програми на певній множині вхідних та вихідних
даних та перевірці отриманих результатів із заздалегідь відомими.
Завданням функціонального тестування є перевірка програмної
системи на предмет повноцінної реалізації специфікацій функціональних
вимог до модуля чи системи в цілому. Функціональні тести ґрунтуються на
функціях, виконуваних системою, які описуються у вимогах до
розроблюваної системи у вигляді варіантів використання.
На етапі функціонального тестування веб-орієнтованої системи було
спроектовано кілька функціональних тестових випадків. Наведемо кілька
спроектованих тестових випадків для основних варіантів використання
розробленого програмного продукту.

Таблиця 1
Test case прецеденту «Вхід в акаунт»
Назва: Вхід в акаунт
Функція: Дозволяє вводити логін і пароль в залежності від натиснутої
кнопки вибирається тип користувача: адміністратор або
звичайний користувач
Дія: Очікуваний результат: Результат тесту:
Передумова:
Запустити програму Аплікація запущена Пройдено
Кроки тесту:
Натисніть кнопку ‘Гість’ Запущена форма Пройдено
перегляду товарів
Натисніть кнопку Запущена форма Пройдено
‘Адміністратор’ авторизації
адміністратора
Натисніть кнопку ‘Назад’ Повернення на першу Пройдено
форму

Таблиця 2
Test case прецеденту «Редагування даних товару»
Назва: Редагування даних про товар в таблиці
Функція: Дозволяє редагування даних в таблиці
товарів
Дія: Очікуваний Результат
результат: тесту:
Передумова:
Запустити програму Запущена форма Пройдено
адміністратора
(редагування)
Кроки тесту:
Вибір поля для редагування Поле вибрано Пройдено
Редагування ключових елементів (Назва Елементи Пройдено
продукту/Інформація/Кількість/Вартість) відредаговано
Натисніть кнопку ‘Оновити інформацію Зміни збережено Пройдено
про товар’

Таблиця 3
Test case прецеденту «Видалення товарів»
Назва: Видалення вибраних товарів
Функція: Дозволяє видаляти вибрані товари
Дія: Очікуваний результат: Результат тесту:
Передумова:
Запустити програму Запущена форма Пройдено
адміністратора
(редагування)
Кроки тесту:
Вибір елемента для Елемент вибрано Пройдено
видалення
Натиснути кнопку Товар видалений Пройдено
«Видалити товар»

Таблиця 4
Test case прецеденту «Додавання товарів»
Назва: Додавання товарів
Функція: Дозволяє додавати товари
Дія: Очікуваний результат: Результат тесту:
Передумова:
Запустити програму Запущена форма Пройдено
адміністратора
(редагування)
Кроки тесту:
Введення потрібних даних Дані введено Пройдено
у відведені для цього поля
Натиснути кнопку «Додати Товар доданий Пройдено
новий товар»

Таблиця 5
Test case прецеденту «Пошук товарів за їх ім’ям»
Назва: Пошук товарів за їх ім’ям
Функція: Дозволяє знайти потрібний товар за ім’ям
Дія: Очікуваний результат: Результат тесту:
Передумова:
Запустити програму Запущена форма Гість Пройдено
Кроки тесту:
Введення назви товару в Назва введена Пройдено
поле

Таблиця 6 показує розподіл функціональних тестових випадків і


наборів тестів даних для цих випадків за варіантами використання.
Таблиця 6
№ Варіанти використання Тестові випадки Тестові дані
1 Вхід в акаунт 3 3
2 Редагування даних 11 11
3 Видалення товарів 2 2
4 Додавання товарів 16 16
5 Пошук товарів 8 8
Загалом: 40 40

Розроблена програмна система показала хороші показники якості під


час функціонального тестування. Кожну функцію було протестовано із
різними наборами тестових даних, а усі виявлені помилки програми було
успішно виправлено.
Висновки
Виконуючи комплексне практичне індивідуальне завдання я оволодів
навичками застосування теоретичних знань, які я отримав впродовж
вивчення дисципліни «Основи програмної інженерії», і для роботи з базами
даних у Windows Form.
Додаток А
Лістинг коду
Лістинг форми «Form1»:

namespace OIPZ_KPIZ
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void label1_Click(object sender, EventArgs e)


{

private void button2_Click(object sender, EventArgs e)


{
this.Size = new Size(450, 425);
textBox1.Show();
textBox2.Show();
button3.Show();
checkBox1.Show();

private void Form1_Load(object sender, EventArgs e)


{
this.Size = new Size(450, 250);
textBox1.Hide();
textBox2.Hide();
button3.Hide();
label2.Hide();
checkBox1.Hide();
}

private void button1_Click(object sender, EventArgs e)


{
Form f3 = new Form3();
f3.Show();
this.Hide();
}

private void textBox1_TextChanged(object sender, EventArgs e)


{
if (textBox1.Text == "Логін")
{
textBox1.Text = "";
}
}

private void button3_Click(object sender, EventArgs e)


{
if (textBox1.Text == "admin" && textBox2.Text == "admin")
{
Form2 f2 = new Form2();
f2.Show();
this.Hide();
}
else
{
label2.Show();

}
}

private void label2_Click(object sender, EventArgs e)


{

private void textBox1_Click(object sender, EventArgs e)


{
if (textBox1.Text == "Логін")
{
textBox1.Text = "";
}
label2.Hide();
}

private void Form1_Click(object sender, EventArgs e)


{

private void Form1_FormClosing(object sender, FormClosingEventArgs e)


{
Application.Exit();
}

private void textBox2_TextChanged(object sender, EventArgs e)


{

private void textBox2_Click(object sender, EventArgs e)


{
if (textBox2.Text == "Пароль")
{
textBox2.Text = "";
}
label2.Hide();
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)


{
if (checkBox1.Checked)
textBox2.UseSystemPasswordChar = false;
else
textBox2.UseSystemPasswordChar = true;
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)


{
if (!Char.IsLetterOrDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
{
e.Handled = true;
}
}

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)


{
if (!Char.IsLetterOrDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
{
e.Handled = true;
}
}
}
}

Лістинг форми «Form2»:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;

namespace OIPZ_KPIZ
{
public partial class Form2 : Form
{
OleDbConnection conn;
OleDbCommand cmd;
OleDbDataAdapter adapter;
DataTable dt;

public Form2()
{
InitializeComponent();
}

void GetCustomers()
{
conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.16.0; Data Source=pharmacy.accdb");
dt = new DataTable();
adapter = new OleDbDataAdapter("SELECT *FROM Items", conn);
conn.Open();
adapter.Fill(dt);
dgwItems.DataSource = dt;
conn.Close();
}

private void textBox1_TextChanged(object sender, EventArgs e)


{

private void label1_Click(object sender, EventArgs e)


{

private void label2_Click(object sender, EventArgs e)


{

private void textBox1_TextChanged_1(object sender, EventArgs e)


{

private void Form2_FormClosing(object sender, FormClosingEventArgs e)


{
Application.Exit();
}

private void Form2_Load(object sender, EventArgs e)


{
GetCustomers();
}

private void button1_Click(object sender, EventArgs e)


{

}
private void button2_Click(object sender, EventArgs e)
{

private void textBox2_TextChanged(object sender, EventArgs e)


{

private void btnInsert_Click(object sender, EventArgs e)


{
string query = "INSERT INTO Items (Назва,Опис,Кількість,Ціна) VALUES" +
"(@Назва,@Опис,@Кількість,@Ціна)";
cmd = new OleDbCommand(query, conn);
cmd.Parameters.AddWithValue("@Назва", txtName.Text);
cmd.Parameters.AddWithValue("@Опис", txtTitle.Text);
cmd.Parameters.AddWithValue("@Кількість", txtAmount.Text);
cmd.Parameters.AddWithValue("@Ціна", txtPrice.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("Продукт успішно додано.");
GetCustomers();
}

private void btnDelete_Click(object sender, EventArgs e)


{
string query = "DELETE FROM Items WHERE ID=@ID";
cmd = new OleDbCommand(query, conn);
cmd.Parameters.AddWithValue("@ID", txtId.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("Продукт успішно видалено.");
GetCustomers();
}

private void btnUpdate_Click(object sender, EventArgs e)


{
string query = "UPDATE Items SET Назва=@Назва,Опис=@Опис,Кількість=@Кількість,Ціна=@Ціна " +
"WHERE ID=@ID";
cmd = new OleDbCommand(query, conn);
cmd.Parameters.AddWithValue("@Назва", txtName.Text);
cmd.Parameters.AddWithValue("@Опис", txtTitle.Text);
cmd.Parameters.AddWithValue("@Кількість", txtAmount.Text);
cmd.Parameters.AddWithValue("@Ціна", txtPrice.Text);
cmd.Parameters.AddWithValue("@ID", txtId.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("Продукт успішно оновлено.");
GetCustomers();
}

private void txtSearch_TextChanged(object sender, EventArgs e)


{
DataView dv = dt.DefaultView;
dv.RowFilter = "Назва LIKE '%" + txtSearch.Text + "%'";
dgwItems.DataSource = dv;
}

private void dgwItems_CellEnter(object sender, DataGridViewCellEventArgs e)


{
txtId.Text = dgwItems.CurrentRow.Cells[0].Value.ToString();
txtName.Text = dgwItems.CurrentRow.Cells[1].Value.ToString();
txtTitle.Text = dgwItems.CurrentRow.Cells[2].Value.ToString();
txtAmount.Text = dgwItems.CurrentRow.Cells[3].Value.ToString();
txtPrice.Text = dgwItems.CurrentRow.Cells[4].Value.ToString();
}

private void button1_Click_1(object sender, EventArgs e)


{
Form1 f1 = new Form1();
f1.Show();
this.Hide();
}

private void txtName_KeyPress(object sender, KeyPressEventArgs e)


{
if(!Char.IsLetter(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != ' ')
{
e.Handled = true;
}
}

private void txtAmount_KeyPress(object sender, KeyPressEventArgs e)


{
if(!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
{
e.Handled = true;
}
}

private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)


{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
{
e.Handled = true;
}
}

private void txtSearch_KeyPress(object sender, KeyPressEventArgs e)


{
if(!Char.IsLetter(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != ' ')
{
e.Handled = true;
}
}
}
}

Лістинг форми «Form3»:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
namespace OIPZ_KPIZ
{
public partial class Form3 : Form
{
OleDbConnection conn;
OleDbCommand cmd;
OleDbDataAdapter adapter;
DataTable dt;
void GetCustomers()
{
conn = new OleDbConnection("Provider=Microsoft.ACE.OleDb.16.0; Data Source=pharmacy.accdb");
dt = new DataTable();
adapter = new OleDbDataAdapter("SELECT *FROM Items", conn);
conn.Open();
adapter.Fill(dt);
dgwItems.DataSource = dt;
conn.Close();
}
public Form3()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)


{
}

private void Form3_FormClosing(object sender, FormClosingEventArgs e)


{
Application.Exit();
}

private void Form3_Load(object sender, EventArgs e)


{
GetCustomers();
}

private void button1_Click_1(object sender, EventArgs e)


{
Form1 f1 = new Form1();
f1.Show();
this.Hide();
}

private void txtSearch_TextChanged(object sender, EventArgs e)


{
DataView dv = dt.DefaultView;
dv.RowFilter = "Назва LIKE '%" + txtSearch.Text + "%'";
dgwItems.DataSource = dv;
}

private void txtSearch_KeyPress(object sender, KeyPressEventArgs e)


{
if (!Char.IsLetter(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != ' ')
{
e.Handled = true;
}
}
}
}

You might also like