Форум программистов, компьютерный форум, киберфорум
Разработка и тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229

Юнит тесты для MVVM архитектуры

13.06.2017, 10:50. Показов 2097. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой проблемой: есть несколько абстрактных базовых классов вьюмоделей (для простого объекта, коллекции и дерева). У них один общий базовый класс ViewModel. Вьюмодели поддерживают отмену/сохранение/обновление своих данных. При использовании в коде можно создавать целые графы зависимостей одних вьюмоделей от других, т.е., например, на форме есть дерево, каждый элемент дерева содержит список элементов, которые при выборе узла дерева отображаются в определенном месте формы, каждый элемент этой коллекции может состоять из набора различных достаточно больших объектов (для которых нужны свои вьюмодели), в зависимости от типа.
Начал писать тесты для базовых вьюмоделей и столкнулся с такой проблемой, что мои тесты очень простые и всегда проходят, но для каких-нибудь сложных сценариев взаимодействия между вьюмоделями могут возникать ошибки (не все изменения в графе отменились, где-то упало и часть изменений отменить потом не удается, сохранение в некоторых случаях записывает не все данные в базу и т.д.).
Как правильно писать тесты нигде не нашел. Везде рекомендации общего плана, типа тестируйте одно действие за один раз, а что делать, если к ошибке может привести не каждое действие в отдельности, а их комбинация?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2017, 10:50
Ответы с готовыми решениями:

Юнит-тесты для C++
Уважаемые дамы и господа! Интересует, пользовались вы какими-нибудь фреймворками для юнит-тестирования вашего C++ кода, если пользовались,...

Написать юнит-тесты и реализовать функцию для матрицы
Всем привет. Очередной раз преподы в универе удивляют меня своими заданиями. Необходимо выполнить задание: #################### ...

Существуют ли юнит-тесты для проверки html-кода?
Доброго дня, уважаемые гуру веба. подскажите, пожалуйста, есть ли какие-то аналоги юнит-тестирования для разметки сайта? понятно что есть...

5
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.06.2017, 18:08
Цитата Сообщение от SharpProg Посмотреть сообщение
а что делать, если к ошибке может привести не каждое действие в отдельности, а их комбинация?
вас интересует mock.

http://artlang.net/article/view/14/
0
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229
19.06.2017, 08:49  [ТС]
Не очень понял как mock помогает решить эту проблему.
Допустим в моей вьюмодели есть свойство IsEmpty, которое проверяет, что все её свойства заполнены значениями по умолчанию. Тогда:
1) если мы изменяем какое-нибудь свойство - IsEmpty == false;
2) если изменяем какое-нибудь свойство и делаем отмену - IsEmpty == true;
3) если изменяем какое-нибудь свойство и сохраняем - IsEmpty == true;
4) если изменяем какое-нибудь свойство, сохраняем и пробуем отменить - IsEmpty == false;
5) если изменяем какое-нибудь свойство и обновляем вьюмодель - IsEmpty == true;

Это простой пример. Угадать все цепочки возможных действий нереально. Но уже видно, что отмена во втором случае и в четвертом приводит к разному значению IsEmpty.

Теперь придуманный пример: есть некоторая реализация списка на основе массива.
1) Тестируем добавление элемента - тест проходит.
2) Тестируем удаление элемента - тест проходит.

В релизе программы встретился код: list.Add(item); list.Remove(item); list.Add(item); - программа упала (хотя тесты проходили). При отладке выяснилось, что в методе удаления не происходил декремент индекса и последующий Add привел к выходу индекса за границы массива. Это грубый пример и такая ошибка скорее всего не доживет до продакшена, но он демонстрирует, что простая невнимательность может привести к подобным неочевидным ошибкам, хотя тесты будут успешно проходить. Однако, данная ошибка не произойдет, если Add добавляет элемент, но в массиве еще достаточно места: list.Add(item); list.Remove(item); list.Add(item); - сработает, но в массиве будет "дырка" вместо элемента, которая может спровоцировать совсем другие ошибки.

Возможно я еще не разобрался как правильно писать тесты, но хочу это сделать.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
19.06.2017, 12:24
Цитата Сообщение от SharpProg Посмотреть сообщение
Теперь придуманный пример: есть некоторая реализация списка на основе массива.
1) Тестируем добавление элемента - тест проходит.
2) Тестируем удаление элемента - тест проходит.
Тест должен не просто вызывать метод, а вызывать метод и проверять состояние объекта после вызова метода.
То есть, нам недостаточно того, чтобы метод Сложение отработал без ошибок - нам нужно ещё, чтобы он правильную сумму вернул.
0
7 / 7 / 1
Регистрация: 24.01.2017
Сообщений: 229
19.06.2017, 13:08  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Тест должен не просто вызывать метод, а вызывать метод и проверять состояние объекта после вызова метода.
То есть, нам недостаточно того, чтобы метод Сложение отработал без ошибок - нам нужно ещё, чтобы он правильную сумму вернул.
Метод Add ничего не возвращает. Мы можем лишь получить добавленный элемент по индексу. Тут всё в порядке.
Метод Remove возвращает true, если элемент был удален. Мы можем проверить отсутствие элемента с помощью метода Contains. Тут тоже всё в порядке. Однако программа упадет, т.к. нет декремента индекса у внутреннего массива.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
19.06.2017, 15:29
Цитата Сообщение от SharpProg Посмотреть сообщение
Метод Add ничего не возвращает.
Метод Add меняет состояние объекта. Тест должен проверить, правильно ли поменялось состояние объекта.

Добавлено через 58 секунд
Это общий недостаток "объектов с состоянием". Чем меньше у вас таких объектов, тем проще и надёжней программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2017, 15:29
Помогаю со студенческими работами здесь

Обновление БД в реальном времени с использованием EF для архитектуры MVVM
Доброго времени суток. Возможно ли отображение всех изменений в БД в реальном времени? Например добавил я через другую программу строку в...

Юнит-тесты
Всем доброго время суток! У меня возникли траблы с написанием юнит-тестов к функциям сортировки пузырьком и подсчётом, а точнее понятия не...

Юнит тесты на JS
Что пользовать для модульных тестов на JS? Смотрю пол дня доку по Mocha но чет не въезжаю, может есть что попроще и с более понятной...

Юнит-тесты
Разбираюсь с юнит тестами. Надо обложить тестами функцию пузырьковой сортировки. Бьюсь несколько дней, и просто в мэйне сделал функцию, и...

Юнит тесты
Помогите разобраться, не проходят два теста, я уже не знаю почему. //Проверка на ввод числа BOOST_AUTO_TEST_CASE(isNumbers) { ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru