Есть ли какой-то смысл модульного тестирования сериализации? - PullRequest
14 голосов
/ 09 июля 2009

У меня есть класс, который сериализует набор объектов (с использованием XML-сериализации), которые я хочу провести модульное тестирование.

Моя проблема в том, что я чувствую, что буду тестировать реализацию XML-сериализации .NET, а не что-нибудь полезное. У меня также есть небольшой сценарий с курицей и яйцом, когда для тестирования Reader мне понадобится файл, созданный Writer.

Я думаю, что вопросы (есть 3, но они все связаны), я в конечном счете ищу обратную связь:

  1. Можно ли протестировать Writer без использования Reader?
  2. Какова лучшая стратегия для тестирования ридера (XML-файл? Насмешка с записью / воспроизведением)? Действительно ли все, что вы действительно будете делать, это тестировать значения свойств объектов, которые были десериализованы?
  3. Какая лучшая стратегия для тестирования писателя!

Справочная информация о сериализации Xml

Я не использую схему, поэтому все элементы и атрибуты XML соответствуют свойствам объектов. Поскольку схемы нет, теги / атрибуты, которые не соответствуют атрибутам, найденным в свойствах каждого объекта, просто игнорируются XmlSerializer (поэтому значение свойства равно нулю или по умолчанию). Вот пример

<MyObject Height="300">
    <Name>Bob</Name>
    <Age>20</Age>
<MyObject>

будет отображаться в

public class MyObject
{
  public string Name { get;set; }
  public int Age { get;set; }

  [XmlAttribute]
  public int Height { get;set; }
}

и наоборот. Если объект изменится на приведенный ниже, XML все равно будет успешно десериализован, но FirstName будет пустым.

public class MyObject
{
  public string FirstName { get;set; }
  public int Age { get;set; }

  [XmlAttribute]
  public int Height { get;set; }
}

Недопустимый XML-файл будет десериализован правильно, поэтому модульный тест пройдет, если вы не запустили утверждения для значений MyObject.

Ответы [ 13 ]

0 голосов
/ 09 июля 2009

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

Говоря об этом, я недавно применил практику, где я проверяю такие вещи во время компиляции , а не во время выполнения модульных тестов. Это немного утомительно, но у меня есть компонент, который может пройти через AST, а затем я могу прочитать его в шаблоне T4 и написать множество #error сообщений, если я встречаю что-то, чего там не должно быть.

0 голосов
/ 09 июля 2009

Если формат сериализованного XML имеет значение, вам нужно проверить сериализацию. Если важно, чтобы вы могли десериализовать его, то вам нужно протестировать десериализацию.

0 голосов
/ 09 июля 2009

Если вы ничего не можете сделать, чтобы изменить способ сериализации вашего класса, то вы тестируете реализацию XML-сериализации в .NET; -)

...