Программная инженерия лабораторный практикум
Скачать 1.48 Mb.
|
34 Рис. 6.1. Диаграмма состояний для моделирования поведения банкомата Контрольные вопросы 1. Поясните два подхода к моделированию поведения системы. Объясните достоинства и недостатки каждого из этих подходов. 2. Охарактеризуйте вершины и дуги диаграммы схем состоя- ний. В чем состоит назначение этой диаграммы? 3. Как отображаются действия в состояниях диаграммы схем состояний? 4. Как показываются условные переходы между состояниями? 5. Как задаются вложенные состояния в диаграммах схем со- стояний? 6. Поясните понятие исторического подсостояния. 35 Лабораторная работа №7 РЕАЛИЗАЦИЯ КОМПОНЕНТОВ ПРОГРАММНЫХ СРЕДСТВ Программа выполнения работы 1.Изучить методику представления на физическом уровне эле- ментов программных систем с помощью диаграмм компонентов UML. 2.Изучить технологию построения диаграмм компонентов UML в среде Rational Rose. Методически указания Диаграмма компонентов служит частью физического представ- ления модели, играет важную роль в процессе ООАП и является не- обходимой для генерации программного кода. Общие рекомендации по построению диаграммы компонентов были рассмотрены в лекции 12 курса «Основы объектно-ориентированного моделирования в но- тации UML». Для разработки диаграмм компонентов в браузере про- екта предназначено отдельное представление компонентов (Component View), в котором уже содержится диаграмма компонен- тов с пустым содержанием и именем по умолчанию Main (Главная). Активизация диаграммы компонентов может быть выполнена одним из следующих способов: - Щелкнуть на кнопке с изображением диаграммы компонен- тов на стандартной панели инструментов. - Раскрыть представление компонентов в браузере (Component View) и дважды щелкнуть на пиктограмме Main (Главная). - Через пункт меню Browse Component Diagram (Браузер Диаграмма компонентов). В результате выполнения этих действий появляется новое окно с чистым рабочим листом диаграммы компонентов и специальная па- нель инструментов, содержащая кнопки с изображением графических примитивов, необходимых для разработки диаграммы компонентов (табл. 7.1). 36 Таблица 7.1. Назначение кнопок специальной панели инструментов диаграм- мы компонентов Графическое изображение Всплывающая подсказка Назначение кнопки Selection Tool Превращает изображение курсора в форму стрелки для последующего выделения эле- ментов на диаграмме Text Box Добавляет на диаграмму текстовую область Note Добавляет на диаграмму примечание Anchor Note to Item Добавляет на диаграмму связь примечания с соответствующим графическим элемен- том диаграммы Component Добавляет на диаграмму компонент Package Добавляет на диаграмму пакет Dependency Добавляет на диаграмму отношение зави- симости Subprogram Specification Добавляет на диаграмму спецификацию подпрограммы Subprogram Body Добавляет на диаграмму тело подпрограм- мы Main Program Добавляет на диаграмму главную програм- му Package Specification Добавляет на диаграмму спецификацию па- кета Package Body Добавляет на диаграмму тело пакета Task Specification Добавляет на диаграмму спецификацию за- дачи Task Body Добавляет на диаграмму тело задачи Generic Subprogram Добавляет на диаграмму типовую подпро- граммы(по умолчанию отсутствует) Generic Package Добавляет на диаграмму типовой пакет (по умолчанию отсутствует) Database Добавляет на диаграмму базу данных (по умолчанию отсутствует) 37 Как видно из этой таблицы, по умолчанию на панели инстру- ментов отсутствуют только три графических элемента из рассмот- ренных ранее элементов диаграммы компонентов, а именно - кнопки с пиктограммами типовой подпрограммы, типового пакета и базы данных. При необходимости их можно добавить на специальную па- нель диаграммы компонента стандартным способом. Таблица 7.2. Графическое изображение стереотипов компонентов и их характеристика Графическое изобра- жение и имя по умол- чанию Название стереотипа Характеристика стереотипа компонента Subprogram Specification Спецификация подпрограммы. Содержит описание переменных, процедур и функ- ций и не содержит определений классов Subprogram Body Тело подпрограммы. Содержит реализа- цию процедур и функций, не относящих- ся к каким-то классам, при этом не со- держит определений классов или реали- заций операций других классов Main Program Главная программа. Реализует базовую логику работы программного приложе- ния и содержит ссылки на другие компо- ненты модели Package Specification Спецификация пакета. Содержит опреде- ление класса, его атрибутов и операций. В языке программирования С++ специ- фикации пакета соответствует отдельный файл с расширением «h» 38 Package Body Тело пакета. Содержит код реализации операций класса. В языке программиро- вания С++ спецификации пакета соответ- ствует отдельный файл с расширением «cpp» Task Specification Спецификация задачи. Может содержать определение класса, его атрибутов и опе- раций, которые предполагается исполь- зовать в независимом потоке управления Task Body Тело задачи. Может содержать реализа- цию операций класса, которые имеют не- зависимый поток управления. Generic Subprogram Типовая подпрограмма. Содержит опи- сание переменных, процедур и функций, которые могут быть использованы в не- скольких программных приложениях. При этом типовая подпрограмма не со- держит определений классов Generic Package Типовой пакет. Содержит определение класса, его атрибутов и операций, кото- рое может быть использовано в несколь- ких программных приложениях Database База данных. Содержит определение од- ного или нескольких классов, их атрибу- тов и, возможно, операций. При этом со- ответствующие классы могут быть реа- лизованы в форме одной или нескольких таблиц базы данных Использование рассмотренных стереотипов существенно уве- личивают наглядность графического представления диаграммы ком- понентов и позволяют архитектору уточнить характер реализации модели программистом на выбранном языке программирования. Для завершения построения диаграммы компонентов рассмат- риваемого примера следует выполнить следующие действия: 1. Добавить компонент с именем: Устройства Банкомата, для которого задать стереотип Task Specification. 39 2. Добавить компоненты с именами: Устройство чтения кар- точки, Клавиатура Банкомата, Принтер Банкомата, Экран Банкомата, Устройство выдачи наличных, для которых задать стереотип Task Body. 3. Добавить зависимость от компонента с именем MainATM.exe к компоненту с именем Устройства Банкомата. 4. Добавить зависимость от компонента с именем Устройство чтения карточки к компоненту с именем Устройства Банкомата. 5. Добавить зависимость от компонента с именем Клавиатура Банкомата к компоненту с именем Устройства Банкомата. 6. Добавить зависимость от компонента с именем Принтер Банкомата к компоненту с именем Устройства Банкомата. 7. Добавить зависимость от компонента с именем Экран Бан- комата к компоненту с именем Устройства Банкомата. 8. Добавить зависимость от компонента с именем Устройство выдачи наличных к компоненту с именем Устройства Банкомата. Построенная таким образом диаграмма компонентов будет иметь следующий вид (рис. 7.1). Рис. 7.1. Окончательный вид диаграммы компонентов разрабатываемой модели управления 40 Лабораторная работа №8 ТЕСТИРОВАНИЕ И ОТЛАДКА ПРОГРАММНЫХ СРЕДСТВ Цель работы : получить навыки тестирования модулей в среде MS Visual Studio .Net Программа выполнения работы 1. Изучить возможности модульного тестирования в MS Visual Studio средствами Nunit и Unit Testing Framework 2. Выполнить тестирование заданного модуля программы на языке C# Содержание отчета 1.Тестовые варианты. 2. Протокол тестирования заданных модулей ( классов) Методически указания Unit-тестирование средствами .NET Основная идея юнит (или модульного, как его еще называют) тестирования – тестирование отдельных компонентов программы, т.е. классов и их методов. При работе в среде Visual Studio .Net получили распространения следующие два средства модульного тестирования: Nunit и Unit Testing Framework. Unit Testing Framework — это встроенная в Visual Studio система тестирования, разрабатываемая Майкрософт, постоянно развиваю- щаяся. Ее особенность - хорошая интеграция в IDE и функция под- счета процента покрытия кода в программе. Юнит-тесты кода Рассмотрим тестированию кода на примере небольшого ASP.NET приложение с реализацией шаблона MVC. Модель пред- ставляет собой отдельную сборку под названием DAL и включает в себя враппер доступа к БД. Одним из требований было использова- ние именно DataReader в ADO.NET. Настройки, как это принято, хра- нятся в web.config. Код для тестирования 41 namespace LinkCatalog.DAL { public class UserModel { ........... public static int GetUserIdByName(string username) { string query = " SELECT ID FROM Users WHERE Login = @login;"; DB. get ().CommandParameters. Add ( new SqlParameter("@login", username)); int id = -1; int .TryParse(DB. get ().GetOneCell(query).ToString(), out id); return id; } } public class DB { ........... private static DB instance; public static DB get () { if (instance == null ) instance = new DB(); return instance; } private SqlConnection connection ; private SqlDataReader reader; public List CommandParameters; private DB() { this. connection = new SqlConnection(WebConfigurationManager.ConnectionS trings["DBConnectionString"].ConnectionString); this.CommandParameters = new List(); } public object GetOneCell(string query) { SqlCommand sc = new SqlCommand(query, this. connection ); if (this.CommandParameters. Count != 0) sc. Parameters .AddRange(this.CommandParameters.ToArray()); this. connection . Open (); object res = sc.ExecuteScalar(); this.CommandParameters.Clear(); this. Close (); return res; } } } * This source code was highlighted with Source Code Highlighter. 42 Добавляем в проект новый юнит-тест и получаем файл такого содержания : using System; using System.Text; using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace LinkCatalog.Tests { [TestClass] public class UserModel_Tests { [TestMethod] public void TestMethod1() { } } } * This source code was highlighted with Source Code Highlighter. 43 Атрибут [TestClass] означает, что этот класс содержит тестовые методы, а [TestMethod] – что такой метод представляет собой кон- кретный метод. Добавляем в проект ссылку на сборку DAL и импортируем про- странство имен LinkCatalog.DAL. Подготовительные работы закон- чены, настало время писать тесты. using Microsoft.VisualStudio.TestTools.UnitTesting; namespace LinkCatalog.Tests { using LinkCatalog.DAL; [TestClass] public class UserModel_Tests { [TestMethod] public void GetUserById_Test() { Assert.AreNotEqual(UserModel.GetUserIdByName(" Admin "), -1); } } } * This source code was highlighted with Source Code Highlighter. У нас всегда есть администратор с таким логином и потому его иден- тификатор не может быть -1. Запускаем тест – и ошибка: Выскочило исключение : Test method LinkCatalog.Tests.UserModel_Tests.GetUserById_Test threw excep- tion: System.NullReferenceException: Object reference not set to an instance of an object . LinkCatalog.DAL.DB..ctor() in C:\Users\Ванек\Documents\Visual Studio 2010\Projects\Practice\DAL\Database.cs: line 35 LinkCatalog.DAL.DB. get () in C:\Users\Ванек\Documents\Visual Studio 2010\Projects\Practice\DAL\Database.cs: line 17 LinkCatalog.DAL.UserModel.GetUserIdByName( String username) in C:\Users\Ванек \Documents\Visual Studio 2010\Projects\Practice\DAL\Models\UserModel.cs: line 63 LinkCatalog.Tests.UserModel_Tests.GetUserById_Test() in C:\Users\Ванек\Docum 44 ents\Visual Studio 2010\Projects\Practice\LinkCatalog.Tests\UserModel_Tests.cs: line 12 * This source code was highlighted with Source Code Highlighter. Как видно, ошибка заключается в конструкторе класса DB – он не может найти файл конфигурации и, вследствие этого, тест завер- шается не только неудачно, но и с ошибкой. Решение проблемы конфигурационных файлов довольно про- стое. Среда тестирования не подключит web.config автоматически. Вместо этого каждый тест-проект создает свой файл конфигурации app.config, и все, что требуется – дописать в него необходимые на- стройки. xml version ="1.0" encoding ="utf-8" ? > < configuration > < configSections > < sec- tion name ="DatabaseUnitTesting" type ="Microsoft.Data.Schema.UnitTesting.Confi guration.DatabaseUnitTestingSection, Microsoft.Data.Schema.UnitTesting, Ver- sion=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> configSections > < DatabaseUnitTesting > < DataGeneration ClearDatabase ="true" /> < ExecutionContext Provider ="System.Data.SqlClient" ConnectionString ="Data Source=SIRIXPC\sqlexpress;Initial Catalog=TestDB;Integrated Securi- ty=True;Pooling=False" CommandTimeout ="30" /> < PrivilegedContext Provider ="System.Data.SqlClient" ConnectionString ="Data Source=SIRIXPC\sqlexpress;Initial Catalog=TestDB;Integrated Securi- ty=True;Pooling=False" CommandTimeout ="30" /> DatabaseUnitTesting > < connectionStrings > < add name ="DBConnectionString" connectionString ="Data Source=SIRIXPC\SQLEXPRESS;Initial Catalog=tbd;Integrated Security=True" providerName ="System.Data.SqlClient" /> connectionStrings > configuration > * This source code was highlighted with Source Code Highlighter. Теперь тест проходит успешно : 45 Немного изменим тест [TestMethod] public void GetUserById_Test() { Assert.AreNotEqual(UserModel.GetUserIdByName( "Admin" ), -1); Assert.AreEqual(UserModel.GetUserIdByName( "0-934723 ### 12sdf s" ), - 1); } * This source code was highlighted with Source Code Highlighter. В базе гарантированно нет такого логина(логин должен быть без про- белов, за этим следят валидаторы в контроллере при регистрации), и это вторая и последняя проверка метода . Тест опять не проходится – смотрим детализацию: |