среда, 21 апреля 2021 г.

Правила Well Formed XML

Это выдержка из моей статьи «Что такое XML»

Разработчик сам решает, какой XML будет считаться правильным, а какой нет. Но есть общие правила, которые нельзя нарушать. XML должен быть well formed, то есть синтаксически корректный.

Чтобы проверить XML на синтаксис, можно использовать любой XML Validator (так и гуглите). Я рекомендую сайт w3schools. Там есть сам валидатор + описание типичных ошибок с примерами.

В готовый валидатор вы просто вставляете свой XML (например, запрос для сервера) и смотрите, всё ли с ним хорошо. Но можете проверить его и сами. Пройдитесь по правилам синтаксиса и посмотрите, следует ли им ваш запрос.

Правила well formed XML:

  1. Есть корневой элемент.
  2. У каждого элемента есть закрывающийся тег.
  3. Теги регистрозависимы!
  4. Соблюдается правильная вложенность элементов.
  5. Атрибуты оформлены в кавычках.




Давайте пройдемся по каждому правилу и обсудим, как нам применять их в тестировании. То есть как правильно «ломать» запрос, проверяя его на well-formed xml. Зачем это нужно? Посмотреть на фидбек от системы. Сможете ли вы по тексту ошибки понять, где именно облажались?

См также:
Сообщения об ошибках — тоже документация, тестируйте их! — зачем тестировать сообщения об ошибках



1. Есть корневой элемент


Нельзя просто положить рядышком 2 XML и полагать, что «система сама разберется, что это два запроса, а не один». Не разберется. Потому что не должна.

И если у вас будет лежать несколько тегов подряд без общего родителя — это плохой xml, не well formed. Всегда должен быть корневой элемент:
НетДа
<test>
  <user>Тест</user>
  <pass>123</pass>
</test>
<dev>
  <user>Антон</user>
  <pass>123</pass>
</dev>

Есть элементы «test» и «dev», но они расположены рядом, а корневого, внутри которого все лежит — нету. Это скорее похоже на 2 XML документа
<credential>
  <test>
    <user>Тест</user>
    <pass>123</pass>
  </test>
  <dev>
    <user>Антон</user>
    <pass>123</pass>
  </dev>
</credential>

А вот тут уже есть элемент credential, который является корневым

Что мы делаем для тестирования этого условия? Правильно, удаляем из нашего запроса корневые теги!



2. У каждого элемента есть закрывающийся тег


Тут все просто — если тег где-то открылся, он должен где-то закрыться. Хотите сломать? Удалите закрывающийся тег любого элемента.

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

<name/>

Это тоже самое, что передать в нем пустое значение

<name></name>

Аналогично сервер может вернуть нам пустое значение тега. Можно попробовать послать пустые поля в Users в методе FullUpdateUser. И в запросе это допустимо (я отправила пустым поле name1), и в ответе SOAP Ui нам именно так и отрисовывает пустые поля.



Итого — если есть открывающийся тег, должен быть закрывающийся. Либо это будет один тег со слешом в конце.

Для тестирования удаляем в запросе любой закрывающийся тег.
НетДа
<user>Тест

<user>Тест</user>

Тест</user>

<user/>




3. Теги регистрозависимы


Как написали открывающий — также пишем и закрывающий. ТОЧНО ТАК ЖЕ! А не так, как захотелось.

А вот для тестирования меняем регистр одной из частей. Такой XML будет невалидным
НетДа
<Name>Тест</name>
<NAME>Иван</name>
<NAME>Тест</name>

<name>Тест</name>





4. Правильная вложенность элементов


Элементы могут идти друг за другом



Один элемент может быть вложен в другой



Но накладываться друг на друга элементы НЕ могут!



НетДа
<fio>Иванов <name>Иван</fio> 
Иванович </name>

<fio>Иванов Иван Иванович</fio>
<name>Иван</name>

<fio>Иванов <b> <name>Иван</name> 
Иванович</fio></b>

<fio>Иванов <name>Иван</name> Иванович</fio>





5. Атрибуты оформлены в кавычках


Даже если вы считаете атрибут числом, он будет в кавычках:

<query attr1=“123”>Виктор Иван</query>
<query attr1=“атрибутик” attr2=“123” >Виктор Иван</query>

Для тестирования пробуем передать его без кавычек:

<query attr1=123>Виктор Иван</query>


См также:
Что такое XML — подробнее о формате

PS — это выдержка из моей книги терминов, написана в помощь студентам моей школы для тестировщиков

Комментариев нет:

Отправка комментария