-
Nunit, XML и HttpWebRequest
На этой неделе вожусь с тестированием фукнционала, который присобачила за последние 2 недели.
Для начала немножко об NUnit. Давно я уже его не видела, курса эдак со 2го, да и тогда он, можно сказать, прошел мимо меня, потому что я наивно полагала, что в этой жизни он мне нафиг не упал. О! Как я ошибалась! Похоже, в первый месяц мои работодатели решили разом поднять все, что я недоучила в вузе: xml, кэширование, Nunit… только многопоточности еще не хватает.
В принципе знать о модульном тестировании много не надо:
- делаешь класс с атрибутом [TestFixture]
- в нем пишешь методы-тесты с атрибутом [Test]
- если результатом теста должна быть ошибка пишешь еще атрибут [ExpectedException(typeof(<тип ошибки>))]
- в конце метода, если он не ошибковозвращающий используется класс 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;
Тест 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 выставляет клиент, а не сервер, а так как в данном случае браузер мы не используем, данный параметр прописываем на сервере ручками.
Источники
-
panaryna posted this