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с.