Unit Testing Framework от Microsoft

Visual Studio Unit Testing Framework – инструмент модульного тестирования для платформы .NET, встроенный в среду разработки Visual Studio 2005 и выше. Чтобы определить, что класс является тестирующим, необходимо пометить его атрибутом [TestClass]. Если класс помечен этим атрибутом, то он может содержать в себе тестовые методы. Обычно тестирующий класс называют так же, как и тестируемый, только с префиксом Test.

В тестирующем классе могут содержаться тестирующие методы и обычно для всех методов тестируемого класса, которые возвращают значение, создается отдельный тестирующий метод. Тестирующий метод обычно называют, так же как и тестируемый, только с префиксом Test.

Кроме тестирующих методов в тестирующем классе могут быть методы инициализации и очистки. Метод инициализации помечается атрибутом [TestInitialize] и позволяет инициализировать необходимые переменные перед выполнением метода-теста. Метод очистки помечается атрибутом [TestCleanup] и позволяет очистить результаты выполнения теста, например, очистить файл, удалить лишние записи с базы данных, присвоить переменным значения по умолчанию.

Кроме методов инициализации и очистки на уровне теста, в тестирующем классе могут присутствовать методы инициализации и очистки уровня класса. Эти методы вызываются один раз. Методы инициализации уровня класса вызывается один раз перед вызовом первого теста, а метод очистки уровня класса вызывается после выполнения последнего теста. Метод инициализации уровня класса помечается атрибутом [ClassInitialize], а метод очистки уровня класса помечается атрибутом [ClassCleanup]. Ниже приведен пример тестового класса.

 

using Microsoft.VisualStudio.TestTools.UnitTesting;

 

namespace Test

{

[TestClass]

public class TestClass

{

public TestClass(){}

 

//Тестовый контекст

private TestContext testContextInstance;

 

public TestContext getTestContext(){

return testContextInstance;

}

 

public void setTestContext(TestContext testContext){

this.testContextInstance = testContextInstance;

}

 

[ClassInitialize]

public static void TestClassInitialize(TestContext testContext) {

/*Код будет выполняться до вызова первого теста*/

}

 

[ClassCleanup]

public static void TestCClassCleanup(){

/*Код будет выполняться после вызова последнего теста*/

}

 

[TestInitialize]

public void TestInitialize(){

/*Код будет выполняться перед выполнением каждого теста*/

}

 

[TestCleanup]

public void TestCleanup(){

/*Код будет выполняться после выполнением каждого теста*/

}

 

[TestMethod]

public void TestMethod(){

/*Код теста*/

}

}

}

 

В тестовом классе для проверки значений, возвращаемых тестируемыми методами, используются статические методы класса Assert.

Список всех методов класса Assert приведен в таблице 6.1.

Таблица 6.1 – Методы класса Assert для тестирования

Название метода Описание
Assert.AreEqual Проверяет, равны ли заданные значения. Ошибка возникает, если значения неравны.
Assert.AreNotEqual Проверяет, чтобы заданные значения небыли равны. Ошибка возникает если значения, если значения равны.
Assert.AreSame Проверяет, указывают ли ссылки на один и тот же объект. Ошибка возникает, если ссылки указывают на разные объекты.
Assert.AreNotSame Проверяет, чтобы ссылки не указывали на один и тот же объект. Ошибка возникает, если ссылки указывают на один и тот же объект.
Assert.Fail Ошибка возникает без каких-либо проверок.
Assert.IsTrue Проверяет, является ли передаваемое значение истинным. Ошибка возникает если значение ложно.
Assert.IsFalse Проверяет, является ли передаваемое значение ложным. Ошибка возникает если значение истинно.
Assert.IsNull Проверяет, является ли передаваемое значение null. Ошибка возникает, если значение не null.
Assert.IsNotNull Проверяет, чтобы передаваемое значение не было null. Ошибка возникает, если передаваемое значение null.
Assert.IsInstanceOfType Проверяет, является ли передаваемый объект экземпляром заданного класса. Ошибка возникает, если значение не является экземпляром заданного типа.
Assert.IsNotInstanceOfType Проверяет, чтобы передаваемый объект не являлся экземпляром заданного класса. Ошибка возникает, если объект является экземпляром заданного класса.

Порядок выполнения работы

В данном порядке выполнения лабораторной работы будет произведено написание тестов для функций слоя доступа к данным 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. Подключите к проекту все необходимые библиотеки. Список библиотек приведен ниже:

Npgsql.dll
Mono.Security.dll
NHibernate.dll
Antlr3.Runtime.dll
Iesi.Collections.dll
log4net.dll
Castle.DynamicProxy2.dll
Castle.Core.dll
NHibernate.ByteCode.Castle.dll
FluentNHibernate.dll

Измените namespace каждого класса с lab4 на lab6 как показано в примере:

namespace lab4.dao { abstract public class DAOFactory { public abstract IStudentDAO getStudentDAO();   public abstract IGroupDAO getGroupDAO(); } } namespace lab6.dao { abstract public class DAOFactory { public abstract IStudentDAO getStudentDAO();   public abstract IGroupDAO getGroupDAO(); } }

 

Исправьте ошибки проекта и откомпилируйте проект с консольным приложением, он должен откомпилироваться без ошибок. Данный проект можно было и не создавать, а использовать проекты из предыдущих лабораторных работ, в которых присутсвует слой доступа к данным 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. Произведите тестирование классов слоя доступа к данным. Все тесты должны быть успешно пройдены.

Задание на лабораторную работу

Создайте тестовые классы для слоя доступа к данным, разработанного и реализованного в предыдущих лабораторных работах. Варианты заданий необходимо выбрать с таблицы 6.2.

Номер варианта определяется последней цифрой зачетной книжки. Варианты полностью соответствуют вариантам заданий с предыдущей лабораторной работы.

Таблица 6.2 – Варианты заданий

Номер варианта Предметная область
Пиццерия (Официант, Посетитель)
Магазин (Поставщик, Товар)
Супермаркет (Продавец, Товар)
Отделение милиции (Милиционер, Нарушитель)
Больница (Врач, Пациент)
Кинотеатр (Кинозал, Посетитель)
Корабль (Каюта, Пассажир)
Предприятие (Отдел, Сотрудник)
Библиотека (Книга, Читатель)

 

Содержание отчета

- фамилия и имя исполнителя лабораторной работы;

- номер и название лабораторной работы;

- цель лабораторной работы;

- краткие теоретические сведенья на одну страницу;

- ход работы (листинги программ, скриншоты программ);

- выводы о проделанной работе.

Контрольные вопросы

1. Что такое модульное тестирование?

2. Какие библиотеки модульного тестирования вы знаете?

3. Какая структура модульного теста в Unit Testing Framework?

4. Как проверить, что значение, возвращаемого метода соответствует необходимому значению?

5. Какие атрибуты используются в Unit Testing Framework для определения тестового класса тестового метода, методов инициализации и очистки класса и методов тестирования?


Рекомендованная литература

1. Эндрю Троелсен. Язык программирования С# 2005 и платформа .NET 2.0, 3-е издание.: Пер. с англ.- М.: «Вильямс», 2007.-1168с.

2. Джесс Либерти. Программирование на С# (2-е издание).- СПб.: Символ, 2003.-688с.

3. Нэш Трей C# 2010: ускоренный курс для профессионалов.: Пер. с англ. – М.: ООО «И. Д. Вильямс», 2010.-592с.

4. Эспозито Д. Microsoft ASP.NET 2.0. Базовый курс. Мастер-класс / Пер. с англ. - М.: Издательство «Русская редакция» ; Питер, 2007.- 688с.