Файл: Управление качеством промышленного программного обеспечения.docx
Добавлен: 10.11.2023
Просмотров: 36
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Институт кибернетики
Направление подготовки (специальность) Информационные системы и технологии
Кафедра вычислительной техники
Отчёт по курсовому проекту
Часть 1. Модульное тестирование проектов в MS Visual Studio 2013
по дисциплине «Управление качеством промышленного программного обеспечения»
Выполнили студенты гр. 8ИМ4А ____________ Щукова К.Б.
(Подпись) Паршина Д.С.
_____ _____________ 2015 г.
Отчёт приняла:
Доцент каф. ВТ ____________ Сергеева Е.Е.
(Подпись)
_____ _____________ 2015 г.
Томск 2015 г.
ВВЕДЕНИЕ
Целью данной работы является проведение модульного тестирования проектов, реализованных на языке программирования C# в среде MS Visual Studio, а также документирование полученных результатов после проведения тестирования.
Модульное тестирование основано на тестировании отдельных компонент программы, то есть классов и методов. Существующая методология, называемая Test Driven Development, – это разработка программных продуктов, используя модульные тесты. Она предполагает на начальном этапе создание наборов тестов для будущей функциональности, оценку всех вариантов выполнения и только потом реализация рабочего кода тестов.
Модульное тестирование будет проводиться в среде Visual Studio 2013 Ultimate, которая включает в себя встроенную систему тестирования Unit Testing Framework.
Для проведения модульного тестирования взято несколько видов проектов, реализованных на языке программирования C#:
1. DDL-библиотека классов «Логика».
2. Приложение типа Windows Form «Калькулятор».
3. Проект базы данных SQL интернет-магазина продаж.
1. ОПИСАНИЕ РЕЗУЛЬТАТОВ МОДУЛЬНОГО ТЕСТИРОВАНИЯ
1.1. Тестирование проекта базы данных SQL
Для проведения модульного тестирования за основу взят проект базы данных интернет-магазина продаж. Проект создан в Visual Studio 2013 на языке программирования C#.
Данный проект основан на скрипте SQL, реализующий создание схемы базы данных.
Содержимое скрипта описано ниже:
CREATE SCHEMA [Продажи]
AUTHORIZATION [dbo];
CREATE TABLE [Продажи].[Клиент] (
[IDКлиента] INT IDENTITY (1, 1) NOT NULL,
[ИмяКлиента] NVARCHAR (40) NOT NULL,
[ГодовоеКоличествоЗаказов] INT NOT NULL,
[ГодовоеКоличествоПродаж] INT NOT NULL
);
CREATE TABLE [Продажи].[Заказы] (
[IDКлиента] INT NOT NULL,
[IDЗаказа] INT IDENTITY (1, 1) NOT NULL,
[ДатаЗаказа] DATETIME NOT NULL,
[ДатаСозданияЗаказа] DATETIME NULL,
[СостояниеЗаказа] CHAR (1) NOT NULL,
[КоличествоЗаказов] INT NOT NULL
);
ALTER TABLE [Продажи].[Клиент]
ADD CONSTRAINT [Продажи_Клиент_ГодовоеКолвоЗаказов] DEFAULT 0 FOR [ГодовоеКоличествоЗаказов]; ALTER TABLE [Продажи].[Клиент]
ADD CONSTRAINT [Продажи_Клиент_ГодовоеКолвоПродаж] DEFAULT 0 FOR [ГодовоеКоличествоПродаж]; ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [Продажи_Заказы_ДатаЗаказа] DEFAULT GetDate() FOR [ДатаЗаказа]; ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [Продажи_Заказы_СостояниеЗаказа] DEFAULT 'O' FOR [СостояниеЗаказа]; ALTER TABLE [Продажи].[Клиент]
ADD CONSTRAINT [PK_Продажи_IDКлиента] PRIMARY KEY CLUSTERED ([IDКлиента] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [PK_Заказы_IDЗаказа] PRIMARY KEY CLUSTERED ([IDЗаказа] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF); ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [FK_Заказы_Клиент_IDКлиента] FOREIGN KEY ([IDКлиента]) REFERENCES [Продажи].[Клиент] ([IDКлиента]) ON DELETE NO ACTION ON UPDATE NO ACTION; ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [FK_Заказы_ДатаСозданияЗаказа] CHECK ((ДатаСозданияЗаказа >= ДатаЗаказа) AND (ДатаСозданияЗаказа < '01/01/2030')); ALTER TABLE [Продажи].[Заказы]
ADD CONSTRAINT [FK_Заказы_ДатаЗаказа] CHECK ((ДатаЗаказа > '01/01/2014') and (ДатаЗаказа < '01/01/2030'));
CREATE PROCEDURE [Продажи].[ОтменаЗаказа]
@IDЗаказа INT
AS
BEGIN
DECLARE @Дельта INT, @IDКлиента INT
BEGIN TRANSACTION
SELECT @Дельта = [КоличествоЗаказов], @IDКлиента = [IDКлиента]
FROM [Продажи].[Заказы] WHERE [IDЗаказа] = @IDЗаказа;
UPDATE [Продажи].[Заказы]
SET [СостояниеЗаказа] = 'X'
WHERE [IDЗаказа] = @IDЗаказа;
UPDATE [Продажи].[Клиент]
SET
ГодовоеКоличествоЗаказов = ГодовоеКоличествоЗаказов - @Дельта
WHERE [IDКлиента] = @IDКлиента
COMMIT TRANSACTION
END
CREATE PROCEDURE [Продажи].[СозданиеЗаказа]
@IDЗаказа INT, @ДатаСозданияЗаказа DATETIME
AS
BEGIN
DECLARE @Дельта INT, @IDКлиента INT
BEGIN TRANSACTION
SELECT @Дельта = [КоличествоЗаказов], @IDКлиента = [IDКлиента]
FROM [Продажи].[Заказы] WHERE [IDЗаказа] = @IDЗаказа;
UPDATE [Продажи].[Заказы]
SET [СостояниеЗаказа] = 'F',
[ДатаСозданияЗаказа] = @ДатаСозданияЗаказа
WHERE [IDЗаказа] = @IDЗаказа;
UPDATE [Продажи].[Клиент]
SET
ГодовоеКоличествоПродаж = ГодовоеКоличествоПродаж - @Дельта
WHERE [IDКлиента] = @IDКлиента
COMMIT TRANSACTION
END
CREATE PROCEDURE [Продажи].[СоздатьНовогоКлиента]
@ИмяКлиента NVARCHAR (40)
AS
BEGIN
INSERT INTO [Продажи].[Клиент] (ИмяКлиента) VALUES (@ИмяКлиента);
SELECT SCOPE_IDENTITY()
END
CREATE PROCEDURE [Продажи].[РазместитьНовыйЗаказ]
@IDКлиента INT, @КоличествоЗаказов INT, @ДатаЗаказа DATETIME, @СостояниеЗаказа CHAR (1)='O'
AS
BEGIN
DECLARE @Количество INT
BEGIN TRANSACTION
INSERT INTO [Продажи].[Заказы] (IDКлиента, ДатаЗаказа, ДатаСозданияЗаказа, СостояниеЗаказа, КоличествоЗаказов)
VALUES (@IDКлиента, @ДатаЗаказа, NULL, @СостояниеЗаказа, @КоличествоЗаказов)
SELECT @Количество = SCOPE_IDENTITY();
UPDATE [Продажи].[Клиент]
SET
ГодовоеКоличествоЗаказов = ГодовоеКоличествоЗаказов + @КоличествоЗаказов
WHERE [IDКлиента] = @IDКлиента
COMMIT TRANSACTION
RETURN @Количество
END
CREATE PROCEDURE [Продажи].[ПоказатьДеталиЗаказов]
@IDКлиента INT=0
AS
BEGIN
SELECT [C].[ИмяКлиента], CONVERT(date, [O].[ДатаЗаказа]), CONVERT(date, [O].[ДатаСозданияЗаказа]), [O].[СостояниеЗаказа], [O].[КоличествоЗаказов]
FROM [Продажи].[Клиент] AS C
INNER JOIN [Продажи].[Заказы] AS O
ON [O].[IDКлиента] = [C].[IDКлиента]
WHERE [C].[IDКлиента] = @IDКлиента
END
CREATE TABLE [Продажи].[Пользователи](
[id] [int] IDENTITY(1,1) NOT NULL,
[логин] [nchar](100) COLLATE CI_AS NOT NULL,
[хэш] [nchar](50) COLLATE CI_AS NOT NULL,
[уровень] [int] NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
([id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON))
CREATE UNIQUE NONCLUSTERED INDEX [IX_UserName] ON [Продажи].[Пользователи]
([логин] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
INSERT [Продажи].[Пользователи] ([логин], [хэш], [уровень]) VALUES (N'Kristina', N'827ccb0eea8a706c4c34a16891f84e7b', 1)
INSERT [Продажи].[Пользователи] ([логин], [хэш], [уровень]) VALUES (N'Tester', N'3095C3E4F1465133E5E6BE134EB2EBE2', 1)
INSERT [Продажи].[Пользователи] ([логин], [хэш], [уровень]) VALUES (N'Admin', N'E3AFED0047B08059D0FADA10F400C1E5', 2)
INSERT [Продажи].[Пользователи] ([логин], [хэш], [уровень]) VALUES (N'User1', N'827CCB0EEA8A706C4C34A16891F84E7B', 1)
GO
CREATE PROCEDURE [Продажи].[ПолучитьIdПользователя]
@login nchar(100),
@hash nchar(50)
AS
BEGIN
SELECT ID FROM [Продажи].Пользователи WHERE логин = @login AND хэш = @hash
END
GO
В результате выполнения скрипта создаются таблицы: Заказы, Клиент и Пользователи. Также в скрипте создаются хранимые процедуры, которые необходимо протестировать:
1. ПоказатьДеталиЗаказа.
2. РазместитьНовыйЗаказ.
3. СозданиеЗаказа.
4. СоздатьНовогоКлиента.
Подробное описание перечисленных выше хранимых процедур приведено в таблице 1.1.1.
Таблица 1.1.1 – Описания хранимых процедур для тестирования
Хранимая процедура проекта | Назначение |
1. СозданиеНовогоКлиента | Добавление новой записи в таблицу Клиент, в которой ГодовоеКоличествоПродаж и ГодовоеКоличествоЗаказов равно нулевым значениям. |
2. РазместитьНовыйЗаказ | Добавление записи в таблицу Заказы для конкретного Клиента и обновление значения ГодовоеКоличествоЗаказов на соответствующее значение из таблицы Клиент. |
3. СозданиеЗаказа | Обновление записи в таблице Заказы посредством изменения состояния заказа «О» на «F» и увеличение значения ГодовоеКоличествоПродаж для соответствующей записи в таблице Клиент. |
4. ПоказатьДеталиЗаказа | Процедура объединяет таблицу Заказы с Клиентом и отображает записи для конкретного клиента. |
5. ОтменаЗаказа | Процедура обновляет запись в таблице Заказы и Клиент посредством изменения состояния заказа «О» на «X» (Отменен) и уменьшает ГодовоеКоличествоЗаказов на соответствующую запись в таблице Клиент. |
Данный скрипт использован для импорта схемы БД в проекте. Модульное тестирование выполнено для вышеуказанных хранимых процедур.
В MS Visual Studio 2013 выбрана команда Create Unit Tests. Результаты тестирования сведены в таблицу 1.1.2. Для проведения модульного тестирования созданы 4 тестовых случая.
Таблица 1.1.2 – Описание тестовых случаев для схемы БД интернет-магазина
Предусловие | Тестовый сценарий (шаги) | Ожидаемый результат | Фактический результат | Послесловие |
Добавление нового клиента с именем Client1. | 1. Выполнить запрос типа SELECT для получения имени созданного клиента. 2. Выполнить хранимую процедуру «СоздатьНовогоКлиента». 3. Выполнить запрос типа SELECT для просмотра всех записей в таблице «Клиент». | Проверить, что таблица Клиент содержит одну запись после запуска хранимой процедуры. | Тест пройден. | Удаление клиента с именем Client1. |
Добавление нового клиента с именем Client1 и удаление старых размещенных заказов, связанных с этим клиентом. | 1. Выполнить запрос типа SELECT для получения имени созданного клиента. 2. Выполнить хранимую процедуру «РазместитьНовыйЗаказ». 3. Выполнить запрос типа SELECT, возвращающий годовую сумму заказов, сделанных клиентом с именем Client1. | Проверить, что годовая сумма заказов у клиента Client1 составляет 100 руб., а годовая сумма продаж = 0 руб. | Тест пройден. | Удаление клиента с именем Client1 и всех его размещенных заказов. |
Добавление нового клиента с именем Client1, удаление всех старых заказов данного клиента и размещение для него заказа на сумму 100 руб. | 1. Выполнить запрос типа SELECT для получения имени созданного клиента. 2. Выполнить запрос типа SELECT для подсчета максимального количества заказов, сделанных клиентом Client1. 3. Выполнить хранимую процедуру «СозданиеЗаказа». 4. Выполнить запрос типа SELECT, возвращающий годовую сумму продаж интернет-магазина, выполненных для клиента Client1. | Проверить, что общая сумма годовых заказов и годовых продаж = 100 руб. | Не пройден. Ошибка условия скалярного выражения: значения не совпадают фактическое -100, ожидаемое 100. | Удаление клиента с именем Client1 и всех его размещенных заказов. |
Добавление клиента с именем Client2 и размещения для него заказов на сумму 100, 50 и 5 руб. | 1. Выполнить запрос типа SELECT для получения имени созданного клиента. 2. Выполнить хранимую процедуру «ПоказатьДеталиЗаказа». 3. Выполнить запрос типа SELECT для просмотра характеристик размещенного заказа для клиента Client2. | Проверить, что ХП возвращает правильные номера столбцов, и что результирующие данные имеют ожидаемую контрольную сумму. | Тест пройден. | Удаление клиента с именем Client2 и всех его размещенных заказов. |
Обновление хранимой процедуру для намеренного внесения в нее неправильных условий. | 1. Выполнить запрос типа UPDATE для хранимой процедуры «ОтменаЗаказа» с целью внесения условий невозможности отмены выполненного заказа клиентом. 2. Выполнить запрос типа SELECT для получения имени созданного клиента. 3. Выполнить запрос типа SELECT для подсчета максимального количества заказов, сделанных клиентом Client1. 4. Выполнить хранимую процедуру «ОтменаЗаказа». 5. Выполнить запрос типа SELECT для просмотра неотмененного заказа со статусом «Выполнен» для клиента Client1. | Проверить, что тестовый случай должен завершится ошибкой в случае попытки отмены заказа, который уже был создан и имеет статус «Выполнен (О)». Намеренное внесение условий, которые приведут к ошибке при выполнение тестового случая. Тест должен выполниться с ошибкой «Невозможно отменить выполненный заказ». | Тест пройден. | Обновление хранимой процедуры для возврата к начальным условиям. |
На рисунке 1.1.1 представлены выбранные хранимые процедуры для тестирования.
Рисунок 1.1.1 – Выбранные хранимые процедуры для тестирования
Далее настроена конфигурация тестов SQL Server (рис.1.1.2).
Рисунок 1.1.2 – Настройка конфигурации тестов SQL Server
В таблице 1.1.3 приведено описание ошибки, найденной при проверке выполнения хранимый процедуры «Создание заказа».
Таблица 1.1.3 – Описание ошибки для ХП «Создание заказа»
Короткое описание | Ошибка условия скалярного выражения |
Проект | Тестирование схемы БД интернет-магазина |
Номер версии | 1.0 |
Серьезность | Незначительная |
Приоритет | Высокий |
Автор | - |
Назначен на | Щукова Кристина |
Окружение | |
Конфигурация (ОС, браузер и т.д.) | OC Windows 8 x64 |
Шаги воспроизведения | 1. Добавление нового клиента с именем Client 1. 2. Размещения для него заказов на сумму 100. 3. Выполнение хранимой процедуры «Создание заказа». |
Фактический результат | -100 |
Ожидаемый результат | 100 |
Дополнения | |
Фрагмент ошибки | Фрагмент ошибки при выполнении операции UPDATE в ХП «Создание заказа» (строка 17): |
Предлагаемое решение устранения ошибки | Необходимо изменить знак перед переменной @Delta на «+»: |