Файл: Лабораторная работа 1 по дисциплине программирование критических сервисов Студент гр. Иб22з Фамилия И. О.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.11.2023
Просмотров: 77
Скачиваний: 7
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Кафедра информационных управляющих систем
Лабораторная работа № 1
по дисциплине
«ПРОГРАММИРОВАНИЕ КРИТИЧЕСКИХ СЕРВИСОВ»
Студент гр. ИБ-22з ____________________________ Фамилия И.О.
(подпись)
Проверил ___________________________ Параничев А.В.
(оценка и подпись)
Санкт-Петербург
2023 год
Лабораторная работа № 1
Создание и тестирование прототипа GUI приложения на языке Python
[желтым - для подстановки своих значений; зеленым - прочитать комментарии и удалить перед отправкой; все выделение убрать перед отправкой; файл переименовать по шаблону]
Выполним создание GUI приложения на языке Python для процесса [см. таблицу 1] «Авторизация пользователя в системе» с помощью IDE PyCharm.
Добавим новый модуль в среде PyCharm: File->New->Python file->Python file с именем gui_login. Код добавления соответствующих графических элементов:
from tkinter import *
def login():
# извлекаем данные из формы
uname=username.get()
pwd=password.get()
# проверяем заполненные данные
if uname == '' or pwd == '':
message.set("Заполните пустые поля!!!")
else:
if uname == "abcd@mail.ru" and pwd == "123456":
message.set("Авторизация успешно выполнена!!")
else:
message.set("Неправильная пара логин-пароль!(")
# функция авторизации формы Tk() из библиотеки tkinter
def guest():
message.set("Получен гостевой доступ")
def loginForm():
global login_window
login_window = Tk()
# установка заглавия страницы
login_window.title("Авторизация")
# установка ширины и высоты окна
login_window.geometry("600x400")
#login_window.columnconfigure(0, weight = 2) # вес 0го столбца
#login_window.columnconfigure(1, weight = 1) # вес 1го столбца
# объявление переменных для использования в других функциях
global message
global username
global password
username = StringVar()
password = StringVar()
message = StringVar()
# Размещение элементов на форме: Label, Entry,
lab_enter = Label(login_window, text="Введите логин и пароль для входа в систему",\
bg="green2",fg="orange4")
lab_uname = Label(login_window, text="Логин")
ent_uname = Entry(login_window, textvariable=username)
lab_passw = Label(login_window, text="Пароль")
ent_passw = Entry(login_window, textvariable=password, show="*")
lab_msg = Label(login_window, text="",textvariable=message)
btn_log = Button(login_window, text="Авторизоваться", width=20, height=1, bg="green2", command=login)
btn_guest = Button(login_window, text="Получить гостевой доступ", width=30, height=1, bg="green2",
command=guest)
lab_enter.grid(column = 0, row = 0, columnspan = 2)
lab_uname.grid(column = 0, row = 1)
ent_uname.grid(column = 1, row = 1)
lab_passw.grid(column = 0, row = 2)
ent_passw.grid(column = 1, row = 2)
lab_msg.grid(column = 0, row = 3, columnspan = 2)
btn_log.grid(column = 0, row = 4, columnspan = 2)
btn_guest.grid(column = 0, row = 5, columnspan = 2)
login_window.mainloop()
# вызов функции формы
if __name__ == '__main__':
loginForm()
Индивидуальные задания нужно взять по табл. 1. Поменять все отображаемые цвета по табл. 2.
Таблица 1
Индивидуальные задания (https://pythonru.com/uroki/obuchenie-python-gui-uroki-po-tkinter#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%B0-Label )
№ по журналу | Предметная область | Добавляемые элементы (сами данные взять из 1й лабораторной работы или сформировать снова): для всех вариантов: Button, Entry | |
1 | Сервис поиска (Search Service) | системы хранения данных | Checkbutton, Menu |
2 | проекторы | Radiobutton, Spinbox | |
3 | среды разработки | Checkbutton, Frame | |
4 | мотоциклы | Radiobutton, Scrolledtext | |
5 | клавиатуры | Checkbutton, Spinbox | |
6 | мыши | Radiobutton, Menu | |
7 | бытовые вентиляторы | Checkbutton, Scrolledtext | |
8 | сканеры | Radiobutton, Frame | |
9 | Сервис пользовательских настроек (Account Service) | бытовые нагреватели | Checkbutton, Menu |
10 | системные блоки | Radiobutton, Spinbox | |
11 | видеокарты | Checkbutton, Frame | |
12 | принтеры | Radiobutton, Scrolledtext | |
13 | легковые автомобили | Checkbutton, Spinbox | |
14 | бытовые вентиляторы | Radiobutton, Menu | |
15 | видеорегистраторы | Checkbutton, Scrolledtext | |
16 | операционные системы | Radiobutton, Frame | |
17 | Сервис оплаты (Checkout Service) | телевизоры | Checkbutton, Menu |
18 | грузовые автомобили | Radiobutton, Spinbox | |
19 | смартфоны | Checkbutton, Frame | |
20 | ноутбуки | Radiobutton, Scrolledtext | |
21 | планшеты | Checkbutton, Spinbox | |
22 | жесткие диски | Radiobutton, Menu | |
23 | холодильники и морозильники | Checkbutton, Scrolledtext | |
24 | наушники | Radiobutton, Frame | |
25 | радиотелефоны | Checkbutton, Menu |
Таблица 2
Цветовые решения из библиотеки Tkinter (источник: https://python-scripts.com/tkinter )
Скриншот запуска приложения представлен на рис. 1, фрагмент работы приложения показан на рис. 2.
Рис. 1. Скриншот запуска модуля «Авторизация пользователя в системе» [поменять на свое по варианту!!!] с помощью IDE PyCharm Free Community для варианта 00
Рис. 2. Фрагмент работы приложения среде PyCharm Free Community для варианта 00
На рис. 1 и 2 графические элементы отображены с помощью следующих строк кода:
-
кнопка с текстом (Button) "Авторизоваться" создается с помощью следующих параметров::-
размеры кнопки: …; -
положение на экране;
-
-
окно редактирования (Entry) для ввода логина-пароля создается следующим образом:-
размеры окна редактирования: ; -
положение на экране:..;
-
-
…-
Frame…
-
-
…-
Menu…
-
Для проверки работы прототипа GUI составлены 4 класса по 2 функции-теста в каждом (успешный и неуспешный); реализация выполнена в виде файла testgui_00.py: [в таблицу подставить функции GUI приложения; код дополнить значениями return (см. прилагаемые примеры) для функций GUI, чтобы тест выполнялся без ввода данных пользователем]
import unittest
import db_mysql
class Test_MySQL(unittest.TestCase):
test_mysql_db = db_mysql.dbase_mysql()
def test_dbase_select_unknown(self):
json_wait_repl = '[]'
self.assertEqual(json_wait_repl, self.test_mysql_db.select_data(100500))
def test_dbase_select_Kvadro_1002(self):
json_wait_repl = '[{"KVDR_id": 1002, "KVDR_name": "Pioneer FPV JXD-509G", "KVDR_image": null, ' \
'"KVDR_price": 6404.0, "KVDR_size_id": 1, "KVDR_max_dist": 100, ' \
'"KVDR_time": 8, "KVDR_camera": 2}]'
self.assertEqual(json_wait_repl, self.test_mysql_db.select_data(1002) )
if __name__ == '__main__':
unittest.main()
Таблица 1
Результаты юнит-тестирования функций GUI
Номер теста п/п | Тестовая функция и значения параметров | Ожидаемый результат | Фактический результат | Результат теста |
1 | assertEqual: send_requests("AANDA") | 3 | 3 | OK |
2 | assertNotEqual: send_requests("AANDA") | 0 | 3 | OK |
3 | assertEqual: send_requests("") | 0 | -1 | Failed |
[оформление таблицы, если не вмещается на 1 страницу: указывается "Окончание"]
Таблица 1 (Окончание)
Номер теста п/п | Тестовая функция и значения параметров | Ожидаемый результат | Фактический результат | Результат теста |
4 | | | | |
5 | | | | |
6 | | | | |
7 | | | | |
8 | … | … | … | OK |
В табл. 1 показаны следующие тесты:
-
№ 1, 3, 5 и 7 выполнены успешно (ОК), т.к. ожидаемое значение и фактическое совпали; -
№ 2, 4, 6 и 8 выполнены неуспешно (Failed), т.к. в БД нет идентификатора "100500", невозможно добавить и обновить строку с теми данными, которые уже есть в таблице, невозможно удалить строку по несуществующему индексу 11.
Вывод: о том, какие коды можно присвоить соответствующим функциям для проведения автоматизированного модульного тестирования (юнит-тестирования); об используемых значениях ответа для функций модульного тестирования (юнит-тестирования): 5-6 строк.