Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Порядок выполнения работы. В данном порядке выполнения лабораторной работы будет произведено написание тестов для функций слоя доступа к данным DAO
В данном порядке выполнения лабораторной работы будет произведено написание тестов для функций слоя доступа к данным DAO, разработанным и реализованным в четвертой лабораторной работе. Для тестирования будет использоваться Unit Testing Framework, который включен в Visual Studio 2008. 1. Создайте консольное приложение Windows (нажмите «Файл», в меню выберите «Создать», затем «Проект», в диалоговом окне выберите «Windows», «Консольное приложение», введите имя проекта, например lab6, и выберите каталог, в котором будет храниться проект). 2. Создайте в проекте каталоги dao, domain, mapping. Перенесите в эти каталоги любым доступным способом классы слоя доступа к данным, реализованные в четвертой лабораторной работе. Это можно сделать, например, с использованием файлового менеджера Total Commander. Откройте каталог dao с четвертой лабораторной работы и скопируйте все классы в каталог dao проекта консольного приложения. Результаты копирования представлены на рисунке 6.1. Рисунок 5.1 – Результаты копирования классов с каталога dao предыдущего проекта в каталог dao WEB-приложения Классы каталогов domain и mapping таким же образом необходимо скопировать в соответствующие каталоги консольного приложения. После копирования классов в проекте они не появятся, их следует добавить в проект (нажмите правой кнопкой мыши на каталог dao и в контекстном меню выберете пункт «Добавить», «Существующий элемент», в открывшемся диалоге выберете все классы каталога dao консольного приложения и нажмите «Добавить»). Те же действия произведите с классами каталогов domain и mapping. В проекте должны появиться все классы слоя доступа к данным. 3. Подключите к проекту все необходимые библиотеки. Список библиотек приведен ниже:
Измените namespace каждого класса с lab4 на lab6 как показано в примере:
Исправьте ошибки проекта и откомпилируйте проект с консольным приложением, он должен откомпилироваться без ошибок. Данный проект можно было и не создавать, а использовать проекты из предыдущих лабораторных работ, в которых присутсвует слой доступа к данным DAO. 4. Создайте тестирующий проект (нажмите «Файл», «Создать проект», в диалоговом окне выберите «Тест», «Тестовый проект», введите имя проекта, если имя тестируемого проекта lab6, то принято называть тестовый проект lab6Test, в поле «Решение» выберите «Добавить решение»). В тестовом проекте будут располагаться модульные тесты классов для слоя доступа к данным. Таким образом, у нас в одном решении содержится два проекта: тестируемый проект, классы которого необходимо проверить на работоспособность, и тестирующий проект, в котором будут содержаться модульные тесты. 5. На данный момент в проекте содержится один класс - UnitTest1, в котором содержится один тестовый метод TestMethod1. Если запустить процесс тестирования (нажать «Тест», «Выполнить», «Все тесты решения»), то один единственный тест проекта будет успешно пройден, поскольку в нем не содержится проверок. Удалите класс тестирования, созданный по умолчанию. 6. Подключите к тестирующему проекту проект lab6 и все библиотеки проекта lab6. 7. В тестирующем проекте необходимо создать набор классов, методы которых протестировали бы работоспособность методов классов слоя доступа к данным. Необходимо протестировать класс GroupDAO и класс StudentDAO, но поскольку эти классы являются наследниками шаблонного класса GenericDAO, то логично будет также вынести тестирование методов GenericDAO в шаблонный класс. Создайте в тестовом проекте три класса: TestGenericDAO, TestGroupDAO, TestStudentDAO. В классе TestGenericDAO будет производиться тестирование методов класса GenericDAO, в классе TestGroupDAO будет производиться тестирование методов класса GroupDAO, а в классе TestStudentDAO будет производиться тестирование методов класса StudentDAO. Тестовый класс обычно состоит из набора методов-тестов помеченных атрибутом [TestMethod]. Также может содержаться метод инициализации теста, который вызывается перед запуском метода-теста и помечен атрибутом [TestInitialize], и метод очистки теста, который вызывается каждый раз по завершению метода-теста и помечен атрибутом [TestCleanup]. Также могут присутствовать методы инициализации и очистки уровня класса, которые вызываются перед запуском первого теста и после последнего теста соответственно. 8. Текст тестового класса TestGenericDAO приведен ниже:
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using NHibernate; using NHibernate.Criterion; using System.Collections.Generic; using FluentNHibernate; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using FluentNHibernate.Automapping; using NHibernate.Tool.hbm2ddl; using System.Reflection; using FluentNHibernate.Mapping; using NHibernate.Cfg; using lab6.mapping; using lab6.dao; using lab6.domain;
namespace lab6 { [TestClass()] public abstract class TestGenericDAO< T> where T: EntityBase {
protected static ISessionFactory factory; protected static ISession session; protected DAOFactory daoFactory; protected TestContext testContextInstance; /** DAO that will be tested */ protected IGenericDAO< T> dao = null;
/** First entity that will be used in tests */ protected T entity1 = null; /** Second entity that will be used in tests */ protected T entity2 = null; /** Third entity that will be used in tests */ protected T entity3 = null;
public TestGenericDAO() { session = openSession(" localhost", 5432, " university", " postgres", " 111111"); }
public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } }
/*Getting dao this test case works with*/ public IGenericDAO< T> getDAO() { return dao; }
/*Setting dao this test case will work with*/ public void setDAO(IGenericDAO< T> dao) { this.dao = dao; }
[ClassCleanup] public static void ClassCleanup() { session.Close(); }
[TestInitialize] public void TestInitialize() { Assert.IsNotNull(dao, " Please, provide IGenericDAO implementation in constructor"); createEntities(); Assert.IsNotNull(entity1, " Please, create object for entity1"); Assert.IsNotNull(entity2, " Please, create object for entity2"); Assert.IsNotNull(entity3, " Please, create object for entity3"); checkAllPropertiesDiffer(entity1, entity2); checkAllPropertiesDiffer(entity1, entity3); checkAllPropertiesDiffer(entity2, entity3); saveEntitiesGeneric(); }
[TestCleanup] public void TestCleanup() { try { if ((entity1 = dao.GetById(entity1.Id))! = null) dao.Delete(entity1); } catch (Exception){ Assert.Fail(" Problem in cleanup method"); } try { if ((entity2 = dao.GetById(entity2.Id))! = null) dao.Delete(entity2); } catch (Exception) { Assert.Fail(" Problem in cleanup method"); } try { if ((entity3 = dao.GetById(entity3.Id))! = null) dao.Delete(entity3); } catch (Exception) { Assert.Fail(" Problem in cleanup method"); } entity1 = null; entity2 = null; entity3 = null; }
[TestMethod] public void TestGetByIdGeneric() { T foundObject = null; // Should not find with inexistent id try { long id = DateTime.Now.ToFileTime(); foundObject = dao.GetById(id); Assert.IsNull(foundObject, " Should return null if id is inexistent"); } catch (Exception) { Assert.Fail(" Should return null if object not found"); } // Getting all three entities getEntityGeneric(entity1.Id, entity1); getEntityGeneric(entity2.Id, entity2); getEntityGeneric(entity3.Id, entity3); }
[TestMethod] public void TestGetAllGeneric() { List< T> list = getListOfAllEntities(); Assert.IsTrue(list.Contains(entity1), " After dao method GetAll list should contain entity1"); Assert.IsTrue(list.Contains(entity2), " After dao method GetAll list should contain entity2"); Assert.IsTrue(list.Contains(entity3), " After dao method GetAll list should contain entity3"); }
[TestMethod] public void TestDeleteGeneric() { try { dao.Delete((T)null); Assert.Fail(" Should not delete entity will null id"); } catch (Exception) { } // Deleting second entity try { dao.Delete(entity2); } catch (Exception) { Assert.Fail(" Deletion should be successful of entity2"); }
// Checking if other two entities can be still found getEntityGeneric(entity1.Id, entity1); getEntityGeneric(entity3.Id, entity3);
// Checking if entity2 can not be found try { T foundEntity = null; foundEntity = dao.GetById(entity2.Id); Assert.IsNull(foundEntity, " After deletion entity should not be found with id " + entity2.Id); } catch (Exception) { Assert.Fail(" Should return null if finding the deleted entity"); }
// Checking if other two entities can still be found in getAll list List< T> list = getListOfAllEntities(); Assert.IsTrue(list.Contains(entity1), " After dao method GetAll list should contain entity1"); Assert.IsTrue(list.Contains(entity3), " After dao method GetAll list should contain entity3"); }
protected abstract void createEntities();
protected abstract void checkAllPropertiesDiffer(T entityToCheck1, T entityToCheck2);
protected abstract void checkAllPropertiesEqual(T entityToCheck1, T entityToCheck2);
protected void saveEntitiesGeneric() { T savedObject = null; try { dao.SaveOrUpdate(entity1); savedObject = getPersistentObject(entity1); Assert.IsNotNull(savedObject, " DAO method saveOrUpdate should return entity if successfull"); checkAllPropertiesEqual(savedObject, entity1); entity1 = savedObject; } catch (Exception) { Assert.Fail(" Fail to save entity1"); } try { dao.SaveOrUpdate(entity2); savedObject = getPersistentObject(entity2); Assert.IsNotNull(savedObject, " DAO method saveOrUpdate should return entity if successfull"); checkAllPropertiesEqual(savedObject, entity2); entity2 = savedObject; } catch (Exception) { Assert.Fail(" Fail to save entity2"); }
try { dao.SaveOrUpdate(entity3); savedObject = getPersistentObject(entity3); Assert.IsNotNull(savedObject, " DAO method saveOrUpdate should return entity if successfull"); checkAllPropertiesEqual(savedObject, entity3); } catch (Exception) { Assert.Fail(" Fail to save entity3"); } }
protected T getPersistentObject(T nonPersistentObject) { ICriteria criteria = session.CreateCriteria(typeof(T)) .Add(Example.Create(nonPersistentObject)); IList< T> list = criteria.List< T> (); Assert.IsTrue(list.Count > = 1, " Count of grups must be equal or more than 1"); return list[0]; }
protected void getEntityGeneric(long id, T entity) { T foundEntity = null; try { foundEntity = dao.GetById(id); Assert.IsNotNull(foundEntity, " Service method getEntity should return entity if successfull"); checkAllPropertiesEqual(foundEntity, entity);
} catch (Exception) { Assert.Fail(" Failed to get entity with id " + id); } }
protected List< T> getListOfAllEntities() { List< T> list = null;
// Should get not null and not empty list try { list = dao.GetAll(); } catch (Exception) { Assert.Fail( " Should be able to get all entities that were added before"); } Assert.IsNotNull(list, " DAO method GetAll should return list of entities if successfull"); Assert.IsFalse(list.Count == 0, " DAO method should return not empty list if successfull"); return list; }
//Метод открытия сессии public static ISession openSession(String host, int port, String database, String user, String passwd) { ISession session = null; if (factory == null) { FluentConfiguration configuration = Fluently.Configure() .Database(PostgreSQLConfiguration .PostgreSQL82.ConnectionString(c => c .Host(host) .Port(port) .Database(database) .Username(user) .Password(passwd))) .Mappings(m => m.FluentMappings.Add< StudentMap> ().Add< GroupMap> ()) .ExposeConfiguration(BuildSchema); factory = configuration.BuildSessionFactory(); } //Открытие сессии session = factory.OpenSession(); return session; }
//Метод для автоматического создания таблиц в базе данных private static void BuildSchema(Configuration config) { new SchemaExport(config).Create(false, true); } } }
9. Текст тестового класса TestGroupDAO приведен ниже:
using System; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using lab6.domain; using lab6.dao;
namespace lab6 { [TestClass] public class TestGroupDAO: TestGenericDAO< Group> {
protected IGroupDAO groupDAO = null; protected Student student1 = null; protected Student student2 = null; protected Student student3 = null;
public TestGroupDAO(): base() { DAOFactory daoFactory = new NHibernateDAOFactory(session); groupDAO = daoFactory.getGroupDAO(); setDAO(groupDAO); }
protected override void createEntities() { entity1 = new Group(); entity1.GroupName = " KS-091"; entity1.CuratorName = " Pronin P. P."; entity1.HeadmanName = " Volosniy R. R.";
entity2 = new Group(); entity2.GroupName = " KS-092"; entity2.CuratorName = " Eroshenko G. L."; entity2.HeadmanName = " Kruglenko T. R.";
entity3 = new Group(); entity3.GroupName = " KS-093"; entity3.CuratorName = " Grab E. E."; entity3.HeadmanName = " Stecenko Q R."; }
protected override void checkAllPropertiesDiffer(Group entityToCheck1, Group entityToCheck2) { Assert.AreNotEqual(entityToCheck1.GroupName, entityToCheck2.GroupName, " Values must be different"); Assert.AreNotEqual(entityToCheck1.CuratorName, entityToCheck2.CuratorName, " Values must be different"); Assert.AreNotEqual(entityToCheck1.HeadmanName, entityToCheck2.HeadmanName, " Values must be different"); }
protected override void checkAllPropertiesEqual(Group entityToCheck1, Group entityToCheck2) { Assert.AreEqual(entityToCheck1.GroupName, entityToCheck2.GroupName, " Values must be equal"); Assert.AreEqual(entityToCheck1.CuratorName, entityToCheck2.CuratorName, " Values must be equal"); Assert.AreEqual(entityToCheck1.HeadmanName, entityToCheck2.HeadmanName, " Values must be equal"); }
[TestMethod] public void TestGetByIdGroup() { base.TestGetByIdGeneric(); }
[TestMethod] public void TestGetAllGroup() { base.TestGetAllGeneric(); }
[TestMethod] public void TestDeleteGroup() { base.TestDeleteGeneric(); }
[TestMethod] public void TestGetGroupByName() { Group group1 = groupDAO.getGroupByName(entity1.GroupName); Assert.IsNotNull(group1, " Service method getGroupByName should return group if successfull"); Group group2 = groupDAO.getGroupByName(entity2.GroupName); Assert.IsNotNull(group2, " Service method getGroupByName should return group if successfull"); Group group3 = groupDAO.getGroupByName(entity3.GroupName); Assert.IsNotNull(group3, " Service method getGroupByName should return group if successfull"); checkAllPropertiesEqual(group1, entity1); checkAllPropertiesEqual(group2, entity2); checkAllPropertiesEqual(group3, entity3); }
[TestMethod] public void TestGetAllStudentOfGroup() { createEntitiesForStudent(); Assert.IsNotNull(student1, " Please, create object for student1"); Assert.IsNotNull(student2, " Please, create object for student2"); Assert.IsNotNull(student3, " Please, create object for student3");
entity1.StudentList.Add(student1); student1.Group = entity1; entity1.StudentList.Add(student2); student2.Group = entity1; entity1.StudentList.Add(student3); student3.Group = entity1;
Group savedObject = null; try { dao.SaveOrUpdate(entity1); savedObject = getPersistentObject(entity1); Assert.IsNotNull(savedObject, " DAO method saveOrUpdate should return entity if successfull"); checkAllPropertiesEqual(savedObject, entity1); entity1 = savedObject; } catch (Exception) { Assert.Fail(" Fail to save entity1"); }
IList< Student> studentList = groupDAO.getAllStudentOfGroup(entity1.GroupName); Assert.IsNotNull(studentList, " List can't be null"); Assert.IsTrue(studentList.Count == 3, " Count of students in the list must be 3"); checkAllPropertiesEqualForStudent(studentList[0], student1); checkAllPropertiesEqualForStudent(studentList[1], student2); checkAllPropertiesEqualForStudent(studentList[2], student3); }
[TestMethod] public void TestDelGroupByName() { try { groupDAO.delGroupByName(entity2.GroupName); } catch (Exception) { Assert.Fail(" Deletion should be successful of entity2"); }
// Checking if other two entities can be still found getEntityGeneric(entity1.Id, entity1); getEntityGeneric(entity3.Id, entity3);
// Checking if entity2 can not be found try { Group foundGroup = null; foundGroup = dao.GetById(entity2.Id); Assert.IsNull(foundGroup, " After deletion entity should not be found with groupName " + entity2.GroupName); } catch (Exception) { Assert.Fail(" Should return null if finding the deleted entity"); }
// Checking if other two entities can still be found in getAll list List< Group> list = getListOfAllEntities(); Assert.IsTrue(list.Contains(entity1), " After dao method GetAll list should contain entity1"); Assert.IsTrue(list.Contains(entity3), " After dao method GetAll list should contain entity3"); }
protected void createEntitiesForStudent() { student1 = new Student(); student1.FirstName = " Ivanov"; student1.LastName = " Kiril"; student1.Sex = 'M'; student1.Year = 1995;
student2 = new Student(); student2.FirstName = " Petrenko"; student2.LastName = " Ivan"; student2.Sex = 'M'; student2.Year = 1997;
student3 = new Student(); student3.FirstName = " Karpov"; student3.LastName = " Danil"; student3.Sex = 'M'; student3.Year = 2000; }
protected void checkAllPropertiesEqualForStudent(Student entityToCheck1, Student entityToCheck2) { Assert.AreEqual(entityToCheck1.FirstName, entityToCheck2.FirstName, " Values must be equal"); Assert.AreEqual(entityToCheck1.LastName, entityToCheck2.LastName, " Values must be equal"); Assert.AreEqual(entityToCheck1.Sex, entityToCheck2.Sex, " Values must be equal"); Assert.AreEqual(entityToCheck1.Year, entityToCheck2.Year, " Values must be equal"); } } }
10. Текст тестового класса StudentDAO приведен ниже
using System; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using lab6.domain; using lab6.dao; using NHibernate.Criterion; using NHibernate;
namespace lab6 { [TestClass] public class TestStudentDAO: TestGenericDAO< Student> { protected IStudentDAO studentDAO = null; protected IGroupDAO groupDAO = null; protected Group group = null;
public TestStudentDAO(): base() { DAOFactory daoFactory = new NHibernateDAOFactory(session); studentDAO = daoFactory.getStudentDAO(); groupDAO = daoFactory.getGroupDAO(); setDAO(studentDAO); }
protected override void createEntities() { entity1 = new Student(); entity1.FirstName = " Ivanov"; entity1.LastName = " Kiril"; entity1.Sex = 'M'; entity1.Year = 1995;
entity2 = new Student(); entity2.FirstName = " Petrenko"; entity2.LastName = " Ivan"; entity2.Sex = 'M'; entity2.Year = 1997;
entity3 = new Student(); entity3.FirstName = " Karpov"; entity3.LastName = " Danil"; entity3.Sex = 'M'; entity3.Year = 2000; }
protected override void checkAllPropertiesDiffer(Student entityToCheck1, Student entityToCheck2) { Assert.AreNotEqual(entityToCheck1.FirstName, entityToCheck2.FirstName, " Values must be different"); Assert.AreNotEqual(entityToCheck1.LastName, entityToCheck2.LastName, " Values must be different"); Assert.AreNotEqual(entityToCheck1.Year, entityToCheck2.Year, " Values must be different"); }
protected override void checkAllPropertiesEqual(Student entityToCheck1, Student entityToCheck2) { Assert.AreEqual(entityToCheck1.FirstName, entityToCheck2.FirstName, " Values must be equal"); Assert.AreEqual(entityToCheck1.LastName, entityToCheck2.LastName, " Values must be equal"); Assert.AreEqual(entityToCheck1.Sex, entityToCheck2.Sex, " Values must be equal"); Assert.AreEqual(entityToCheck1.Year, entityToCheck2.Year, " Values must be equal"); }
[TestMethod] public void TestGetByIdStudent() { base.TestGetByIdGeneric(); }
[TestMethod] public void TestGetAllStudent() { base.TestGetAllGeneric(); }
[TestMethod] public void TestDeleteStudent() { base.TestDeleteGeneric(); }
[TestMethod] public void TestGetStudentByGroupFirstNameAndLastName() { group = new Group(); group.GroupName = " KS-091"; group.CuratorName = " Pronin P. P."; group.HeadmanName = " Volosniy R. R."; group.StudentList.Add(entity1); entity1.Group = group; group.StudentList.Add(entity2); entity2.Group = group; group.StudentList.Add(entity3); entity3.Group = group; Group savedGroup = null; try { groupDAO.SaveOrUpdate(group); savedGroup = getPersistentGroup(group); Assert.IsNotNull(savedGroup, " DAO method saveOrUpdate should return group if successfull"); checkAllPropertiesEqualGroup(savedGroup, group); group = savedGroup; } catch (Exception) { Assert.Fail(" Fail to save group"); } getStudentByGroupFirstNameAndLastName(entity1, group.GroupName, entity1.FirstName, entity1.LastName); getStudentByGroupFirstNameAndLastName(entity2, group.GroupName, entity2.FirstName, entity2.LastName); getStudentByGroupFirstNameAndLastName(entity3, group.GroupName, entity3.FirstName, entity3.LastName); group.StudentList.Remove(entity1); group.StudentList.Remove(entity2); group.StudentList.Remove(entity3); entity1.Group = null; entity2.Group = null; entity3.Group = null; groupDAO.Delete(group); }
protected void getStudentByGroupFirstNameAndLastName(Student student, string groupName, string firstName, string lastName) { Student foundStudent = null; try { foundStudent = studentDAO.getStudentByGroupFirstNameAndLastName( groupName, firstName, lastName); Assert.IsNotNull(studentDAO, " Service method should return student if successfull"); checkAllPropertiesEqual(foundStudent, student); } catch (Exception) { Assert.Fail(" Failed to get student with groupName " + groupName + " firstName " + firstName+" and lastName " + lastName); } }
protected Group getPersistentGroup(Group nonPersistentGroup) { ICriteria criteria = session.CreateCriteria(typeof(Group)) .Add(Example.Create(nonPersistentGroup)); IList< Group> list = criteria.List< Group> (); Assert.IsTrue(list.Count > = 1, " Count of grups must be equal or more than 1"); return list[0]; }
protected void checkAllPropertiesEqualGroup(Group entityToCheck1, Group entityToCheck2) { Assert.AreEqual(entityToCheck1.GroupName, entityToCheck2.GroupName, " Values must be equal"); Assert.AreEqual(entityToCheck1.CuratorName, entityToCheck2.CuratorName, " Values must be equal"); Assert.AreEqual(entityToCheck1.HeadmanName, entityToCheck2.HeadmanName, " Values must be equal"); } } }
11. Произведите тестирование классов слоя доступа к данным. Все тесты должны быть успешно пройдены.
|