csharp.net

Nunit, XML и HttpWebRequest

На этой неделе вожусь с тестированием  фукнционала, который присобачила за последние 2 недели. 

Для начала немножко об NUnit. Давно я уже его не видела, курса эдак со 2го, да и тогда он, можно сказать, прошел мимо меня, потому что я наивно полагала, что в этой жизни он мне нафиг не упал. О! Как я ошибалась! Похоже, в первый месяц мои работодатели решили разом поднять все, что я недоучила в вузе: xml, кэширование, Nunit… только многопоточности еще не хватает.

В принципе знать о модульном тестировании много не надо: 

  1. делаешь класс с атрибутом [TestFixture]
  2. в нем пишешь методы-тесты с атрибутом [Test]
  3. если результатом теста должна быть ошибка пишешь еще атрибут [ExpectedException(typeof(<тип ошибки>))]
  4. в конце метода, если он не ошибковозвращающий используется класс Assert и его чудо-методы, который определяет, успешно ли пройден тест. 

Далее о самих тестах этого понедельника.

Тест 1: сделать запрос страницы, о которой уже упомяналось ранее и проверить, что возвращенный XML именно то, что мы хотели получить. Чтобы не писать кучу проверок, сделала только проверки на наличие ключевых узлов и атрибутов. 

Кочка номер один: послать запрос на сервер. 

Проще простого на деле просто пишешь код вида:

	XmlDocument resultXML = new XmlDocument();
	HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(connection);
	using (var response = new StreamReader(request.GetResponse().GetResponseStream()))
	{
		resultXML.LoadXml(response.ReadToEnd());
	}

Кочка номер два: выбрать ключевые узлы и проанализировать их.

По незнанию сперва сделала быдло-методом. Стыдно, конечно, но больше такой ошибки не повторю:

	XmlNodeList resultNode = resultXML.GetElementsByTagName("Result");
	if (resultNode.Count != 0)
	{
		XmlNode rootChild = resultNode[0].FirstChild;
		if (rootChild.Name == "Item" && rootChild.Attributes["type"].Value == "ItemType")
		{
			for (int i = 0; i < rootChild.ChildNodes.Count; i++)
			{
				if (rootChild.ChildNodes[i].Name == "name" && rootChild.ChildNodes[i].InnerText.ToLower() == param.ToLower())
				{
					testRes = true;
					break;
				}
			}
		}
	}

Уже после того, как мой мудрый суgервайзер сказал, что это бред, сделала как надо:

	XPathNavigator nav = resultXML.CreateNavigator();

	XPathNodeIterator iterator = (XPathNodeIterator)nav.Select("//Result/Item[@type='ItemType']/name['Part']");

	if (iterator.Count != 0)

		testRes = true;

External image

Тест 2: как послать повторный запрос на сервер, чтобы в итоге от вернул 304?

string connection = ConnectionInfo.InnovatorServerURL.ToString() + “/ItemType.aspx”;

HttpWebResponse response = (HttpWebResponse)HttpWebRequest.Create(connection).GetResponse();

HttpWebRequest resRequest = (HttpWebRequest)HttpWebRequest.Create(connection);

resRequest.IfModifiedSince = response.LastModified;

HttpWebResponse resResponse = (HttpWebResponse)resRequest.GetResponse();

Так и только так, потому что заголовок IfModifiedSince выставляет клиент, а не сервер, а так как в данном случае браузер мы не используем, данный параметр прописываем на сервере ручками. 

Источники

  1. поиск по документу с xpath
  2. доступ к атрибутам модели dom
  3. запрос к вебстранице из кода
  4. работа с xml в .net
habrahabr.ru
Грамотная серверная валидация C#

Для прокачки мозга смотрела очередной доклад Гайдара Магданурова на этот раз на тему оптимизации asp.net приложений. Пришла в голову мысль, что проверка валидности введенных данных на сервере проводилась у меня довольно-таки просто (даже тупо): нет ни красоты ни грамотности. Поэтому решила это дело загуглить. И нашла эту замечательную статейку. Надо при оказии проверить на практике. 

Сериализация времени выполнения

Сериализация - это процесс, при котором данные объекта переносятся из памяти в поток данных для сохранения. Десериализация - обратный процесс, заключающийся в восстановлении состояния объекта из потока. Сохранение полей объекта требует сохранения всех данных агрегируемых объектов, т.е. требуется сохранить граф зависимых объектов. Механизм сериализации:

  • Сериализация времени выполнения
  • Сериализация контрактов данных
  • XML-сериализация

Keep reading

XML-сериализация

Сериализацию в формате XML можно выполнить при помощи класса XmlSerializer из пространства имен System.Xml.Serialization. Сохраняются public элементы объекта, тип объекта должен быть открытым и иметь public-конструктор без параметров. 

Keep reading

Сериализация контрактов данных

Контракт данных - это тип (класс или структура), описывающий информационный фрагмент. Если в качестве контракта данных используется обычный класс, информационный фрагмент образуют открытые поля и свойства. Можно пометить тип атрибутом [DataContract]. Тогда информационный фрагмент будут составлять поля и свойства, помеченные атрибутом [DataMember] (в этом случае видимость роли не играет):

Keep reading

Гексаграмма WPF

На матмоделировании дали задание: сгенерировать методом середины квадрата и конгруэнтным методом n случайных чисел и протестировать, насколько эти числа получились случайными (независимость и равномерность распределения). Для этого необходимо было подсчитать сколько значений попало в определенный интервал (шаг) и вывести на экран гексаграмму. Сами методы у меня заняли недолго. Загвоздка оказалась именно в графике. Думала сделать все в winForms, да не тут-то было. Технология вывода графиков тут не менее запутана, чем в WPF, а то и еще хуже. Оказалось, у меня осталась лабораторная работа с позапрошлого семестра по методам численного анализа, где, собственно, я уже выводила график (по точкам). Для вывода того графика я использовала WPF Toolkit, которую можно скачать тут. Reference на WPFToolkit, тем не менее, не добавляется, пока не перезагрузишь компьютер. Однако, и этого оказалось мало. Поэтому пришлось просто скопировать ту самую лабораторную (номер 4) и попытаться ее модифицировать. И все бы ничего, если бы графики по точкам не строились совершенно непонятным для меня образом. Казалось бы, что может быть проще, чем соединить 2 точки одной линией, но нет — у него своя, непостижимая мною, технология. В итоге, так ничего и не сделав, легла спать. Сутра увидела (вива twitter), что друг посоветовал использовать Visifire. Нашла, скачала, установила. Очень повезло, что в упаковке с библиотекой было еще и пара примерчиков использования. В общей сложности создание нового окна wpf, обработка событий и модификация графика с visifire заняло у меня окло 2 часов с учетом еще и отладки. Программу можно скачать здесь.