Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 22.07.2017
Сообщений: 18

Юнит тестирование методов, работающих с файлами

16.11.2017, 01:48. Показов 2281. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток! Возникла у меня небольшая проблема с тестированием методов, которые выполняют сериализацию объекта в XML, JSON. Приведу немного кода, чтобы была понятна ситуация, а потом поясню, что имею ввиду.

ISerializer
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public interface ISerializer
    {
        void Serialize(FileStream fs, object serializable);
        object Deserialize(FileStream fs);
    }
 
public class STJsonSerializer : ISerializer
    {
        DataContractJsonSerializer serializer;
 
        public STJsonSerializer(DataContractJsonSerializer serializer)
        {
            this.serializer = serializer;
        }
 
        public object Deserialize(FileStream fs)
        {
            return serializer.ReadObject(fs);
        }
 
        public void Serialize(FileStream fs, object serializable)
        {
            serializer.WriteObject(fs, serializable);
        }
    }
 
public class STXmlSerializer : ISerializer
    {
        XmlSerializer serializer;
 
        public STXmlSerializer(XmlSerializer serializer)
        {
            this.serializer = serializer;
        }
 
        public object Deserialize(FileStream fs)
        {
            return serializer.Deserialize(fs);
        }
 
        public void Serialize(FileStream fs, object serializable)
        { 
             serializer.Serialize(fs, serializable);
        }
 
    }
Собственно, хочу протестировать два метода Serialize и Deserialize классов STXmlSerializer и STJsonSerializer, но так как нам придется работать с файлами, то никак не могу придумать с какой стороны подойти к тестам. То есть я создаю абстрактный класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[TestClass]
    public abstract class UnitTest
    {
        FileInfo fileInfo;
        protected string filePath;
 
        private void DeleteFileIfExists()
        {
            FileInfo fileInfo = new FileInfo(filePath);
            if (fileInfo.Exists)
                fileInfo.Delete();
        }
 
        protected void TestInitialize(string filePath)
        {
            this.filePath = filePath;
            DeleteFileIfExists();
 
 
        }
 
        protected void TestCleanup()
        {
            DeleteFileIfExists();
        }
    }
наследуюсь от него в тесте
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[TestClass]
    public class STXmlSerializerTests : UnitTest
    {
 
        [TestInitialize]
        public void TestInitialize()
        {
            base.TestInitialize("test.xml");
        }
 
        [TestCleanup]
        public new void TestCleanup()
        {
            base.TestCleanup();
        }
 
 
        [TestMethod]
        public void IsISerializer()
        {
            Assert.IsTrue(typeof(ISerializer).IsAssignableFrom(typeof(STXmlSerializer)));
        }
 
        [TestMethod]
        public void SuccessfulSerializeAndDeserialize()
        {
 
            XmlSerializer xml = new XmlSerializer(typeof(StubModel));
            ISerializer serializer = new STXmlSerializer(xml);
 
            using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
            {
                serializer.Serialize(fs, new StubModel() { AnyPropery1 = "propertyValue1", AnyPropery2 = "propertyValue2" });
            }
 
            using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
            {
                StubModel model = (StubModel)serializer.Deserialize(fs);
                Assert.IsTrue(model.IsValid);
            }
 
        }
 
        [Serializable]
        public class StubModel
        {
            public string AnyPropery1 { get; set; }
            public string AnyPropery2 { get; set; }
 
            
            public bool IsValid
            {
                get { return AnyPropery1 != null && AnyPropery2 != null; }
            }
        }
    }
И, собственно, проблем я думаю тут много, но самое важное, что мне кажется подход как в SuccessfulSerializeAndDeserialize не очень корректным. Просто два раза открывать файл в методе, который по-хорошему должен бы относиться только к сериализации, не очень. Поэтому и назвал так. Просто получается, что чтобы проверить сериализацию, нужно все равно десериализовать файл и проверить на корректность модель. Вопрос в том, как это все дело сделать правильно? Буду очень благодарен любым ответам. Спасибо за внимание!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2017, 01:48
Ответы с готовыми решениями:

Тестирование (или Юнит тестирование)
Доброго времени суток, возник такой вопрос, раньше встречался на фронтенде с js тестированием, сейчас задался вопросом по поводу...

Тести́рование програ́ммного обеспе́чения(Модульное тестирование, или юнит-тестирование)
Извиняюсь перед администрацией что разместил тему в несоответствующем разделе, не мог найти про тестирование ПО. На днях встал вопрос о...

Юнит тестирование
Добрый день. Осваиваю азы написания юнит тестов. С обычными калькуляторами, простыми классами, возвращающими значения разобрался. Но...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18283 / 14206 / 5368
Регистрация: 17.03.2014
Сообщений: 28,884
Записей в блоге: 1
16.11.2017, 02:22
IvanRadiant, на мой взгляд тесты для реализаций ISerializer несут мало пользы т.к. они по сути тестируют внешний код - классы DataContractJsonSerializer и XmlSerializer - которые работают верно. Даже если там есть баги, то мы их исправить не можем. Я бы писал тесты для проверок своих классов путем полного сравнения оригинального объекта с десериализованным. С другой стороны тебе как автору кода лучшее виднее что тестировать. Упростить проверку можно если заменить FileStream на Stream. Тогда можно будет выполнять сериализацию в MemoryStream.
2
2 / 2 / 0
Регистрация: 22.07.2017
Сообщений: 18
16.11.2017, 03:50  [ТС]
OwenGlendower, спасибо. Я тоже уже начал задумываться, что тестирование адаптеров несут мало пользы.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
16.11.2017, 10:48
Цитата Сообщение от OwenGlendower Посмотреть сообщение
путем полного сравнения оригинального объекта с десериализованным
В одно время, из за наличия сложной модели, тестировал как раз кусочки сериализации и десериализации по причине появления public readonly свойств и null значений объектов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2017, 10:48
Помогаю со студенческими работами здесь

Юнит-тестирование
Всем доброго времени суток! В последнее время меня начал сильно интересовать вопрос о юнит-тестировании: что это такое и с чем его едят. ...

Юнит-тестирование
Расскажите про юнит тест на с++ , как его писать?Синтаксис? (У меня такое задание: написать юнит тест к программе которая находит...

Юнит тестирование С++ (Google Mock)
Добрый день. Я только начинаю знакомиться с Юнит тестированием и фреймворком Google. может ли мне кто-нибудь подсказать, почему данный тест...

Что такое юнит тестирование? Как им пользоваться?
Народ можете, кто-нибудь на просто примере показать, как тестировать какой-либо функционал в WinForms или WPF проекте? Чтобы было понятно в...

Юнит-тестирование в Visual C++ 2012 Express для Desktop
Посоветуйте самый простой способ организовать сабж. В идеале - чтобы достаточно было заинклюдить один h-файл.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru