Форум программистов, компьютерный форум, киберфорум
Разработка и тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387

Написание unit test

21.11.2016, 10:35. Показов 1889. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разбираюсь с написанием unit test. Вот что не могу понять. В примерах, сами тесты встраивают в само приложение и при запуске приложение тестирует само себя. Но ведь это излишняя растрата памяти и размера бинарника. Ведь по мимо тестов должен же быть и боевой режим. Или я чего то не понял ?

Как правильно должны быть архитектурно созданы автоматические тесты ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2016, 10:35
Ответы с готовыми решениями:

Написание unit test на nunit, который вернет объект
Доброго времени суток. Прошу помощи в решении проблемы. Необходимо реализовать юнит тест на nunit, метод которого вернет объект. ...

Что такое unit test и regression test
Что такое unit test и regression test?

Unit Test
Как пишутся модульные тесты?прочитал несколько книг, но не в одной не встречал глав/заголовков о тестировании посоветуйте статьи или...

15
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.11.2016, 03:55
Цитата Сообщение от admsasha Посмотреть сообщение
В примерах, сами тесты встраивают в само приложение и при запуске приложение тестирует само себя.
В каких примерах?

Цитата Сообщение от admsasha Посмотреть сообщение
Как правильно должны быть архитектурно созданы автоматические тесты ?
Обычно оформляются в отдельное приложение, но бывает и такое.

В общем, давайте конкретный пример.
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
23.11.2016, 04:09  [ТС]
т.е. пишутся два приложения (основное и тестирование) одновременно, с дублями инициализаций и загрузок из базы (если требуются), а потом на основе этого делаются тесты?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.11.2016, 04:22
Цитата Сообщение от admsasha Посмотреть сообщение
с дублями инициализаций и загрузок из базы (если требуются)
В идеале unit-тесты не должны зависеть от внешних систем, т.е. базы быть не должно. Если получение данных для тестирования все-таки нужно делать через интерфейс доступа к БД, то см. mock object.
1
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
24.11.2016, 11:29  [ТС]
0x10, Спасибо за подсказку о mock object. Интересная идея.

Добавлено через 7 часов 22 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
В идеале unit-тесты не должны зависеть от внешних систем, т.е. базы быть не должно. Если получение данных для тестирования все-таки нужно делать через интерфейс доступа к БД, то см. mock object.
Например хочу протестировать метод класса checkLoginPassword(std::string,std::stri ng)

Данный метод использует несколько других классов (работа с конфигом, работа с базой, работа с вызовом методов из другой dll (плагин)), как такое тестировать ?

Элементарно, как подделать работу класса, например работы с конфигом ? Ведь его вызов осуществляется не проверяющим тестом, а из тестируемого метода. И тестируемый метод ничего о том, тестирует его или нет не знает.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.11.2016, 12:09
Цитата Сообщение от admsasha Посмотреть сообщение
Данный метод использует несколько других классов (работа с конфигом, работа с базой, работа с вызовом методов из другой dll (плагин)), как такое тестировать ?
Как объекты этих классов попадают в тестируемый класс? Про моки точно читали? В простейшем случае тестируемый класс в конструкторе принимает зависимости по интерфейсам: IConfig, IDatabaseAccessor. У каждого интерфейса минимум две реализации: одна настоящая (читает конфиг-файл, подключается к БД), другая — с заглушками.

Для управления сложностью инициализации можно использовать какой-нибудь IoC-контейнер, например: https://github.com/ybainier/Hypodermic
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
25.11.2016, 03:21  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Как объекты этих классов попадают в тестируемый класс?
Они создаются самим методом, поэтому никакой передачи интерфейсов и нет. Некоторые классы внутри данного метода инициализируются от публичной (extern) переменной.

про mock я читал, и прекрасно понимаю, что если бы было именно так "В простейшем случае тестируемый класс в конструкторе принимает зависимости по интерфейсам", то можно было бы использовать как раз их. С этим как раз вроде как всё понятно.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
25.11.2016, 04:16
Цитата Сообщение от admsasha Посмотреть сообщение
Они создаются самим методом
Если так и должно быть, то в этом случае нужно абстрагироваться от конкретного метода их создания. Т.е. в методе должна быть доступна абстрактная фабрика, боевая реализация которой будет создавать настоящие инстансы, работающие с окружением, а тестовая — моки.
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
29.11.2016, 09:00  [ТС]
т.е. из одного метода создавать куча дополнительных классов и методов, которые будут создавать окружение для реального метода ? Опять же существуют, например, вызов статических методов.

В итоге получается что код который нужно тестирований разбухнет и потребует тестирований классов для поддержки тестирований. Или я чего то не понимаю.

например, есть класс

C++
1
2
3
4
class test {
     static int a(int p){...}
     static int b(int p){...}
}
есть метод который надо тестировать

C++
1
2
3
int method(int z){
   return test::a(z);
}

каким образом тестировать method ?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.11.2016, 07:29
Цитата Сообщение от admsasha Посмотреть сообщение
Опять же существуют, например, вызов статических методов.
И эти статические методы жестко связаны с вводом-выводом, бд и прочим? Предположим, что так.

Конфликт здесь понятен. Приемы выше — подмена реализации во время выполнения. Подмена вызова статик метода может быть выполнена только на этапе компиляции. Для этого можно тестируемый класс/метод сделать шаблонным. Параметр шаблона — тип статического класса. Другой вариант — можно вынести реализацию статического класса в отдельный файл и написать тестовую реализацию в другом файле. Первый файл включать в боевую сборку, другой — в тестовую.

Ни первый, ни второй способ не считаю подходящим. Использование шаблонов в принципе кажется неуместным для такой цели, да и есть теоретическая вероятность упереться в специализацию шаблона. Разный состав сборки — тоже лишние заморочки.

Цитата Сообщение от admsasha Посмотреть сообщение
В итоге получается что код который нужно тестирований разбухнет и потребует тестирований классов для поддержки тестирований.
Классическая проблема — кто будет сторожить сторожей?

Резюме такое. Не всякий код удобно покрывать юнит-тестами. Не всякий код можно покрыть юнит-тестами. Есть несколько вариантов решения проблемы.

Первый — отрефакторить существующий код. Вынести все зависимости, добавить точек гибкости.

Второй — сказать, что рефакторить слишком дорого и забить на юнит-тесты. Писать интеграционные, которые будут сами поднимать базу, готовить данные, посылать запросы в приложение и проверять результат в базе. «Посылать запросы» можно по-разному: http, rpc или эмуляцией кликов в интерфейс, в зависимости от типа приложения. Если получается оторвать интерфейс и тестировать библиотеку, то можно как обычно звать функции из кода. Но от поднятия БД и подготовки данных все равно не уйти.

Третий — забить на автоматические тесты, проверять работоспособность вручную. В некоторых ситуациях это нормальное решение.
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
30.11.2016, 18:09  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Второй — сказать, что рефакторить слишком дорого и забить на юнит-тесты.
Цитата Сообщение от 0x10 Посмотреть сообщение
Третий — забить на автоматические тесты, проверять работоспособность вручную. В некоторых ситуациях это нормальное решение.
Так я просто решил поизучать написание тестов. И взял первый попавшийся проект (точнее рассмотрел 5 программ, но везде подобное). Суть как раз в том, что бы понять как они пишутся. И сразу же столкнулся с проблемами.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
01.12.2016, 06:58
Если задача — познакомиться с библиотекой для написания юнит-тестов и понять, как собирать проект, то проще написать небольшой проект с нуля, чем рефакторить существующее легаси.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
05.12.2016, 15:01
Цитата Сообщение от admsasha Посмотреть сообщение
т.е. из одного метода создавать куча дополнительных классов и методов, которые будут создавать окружение для реального метода ?
Вы хотите написать тест для одного метода или тест, который заодно будет проверять кучу дополнительных классов и методов?
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
06.12.2016, 11:47  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы хотите написать тест для одного метода или тест, который заодно будет проверять кучу дополнительных классов и методов?
Я хочу написать тесты и для мелких методов (например,сортировка) и для метода которые берет из extern массива данные сортирует и выдает сортированный массив.
0
Модератор
Эксперт функциональных языков программирования
3135 / 2282 / 469
Регистрация: 26.03.2015
Сообщений: 8,884
06.12.2016, 12:00
Желательно, чтобы каждый тест проверял что-то одно.
Тест для сортировки должен проверять правильность сортировки. Тест для "метода которые берет из extern массива данные сортирует и выдает сортированный массив" должен проверять, вызывался ли метод сортировки и не должен проверять правильность сортировки. Поэтому этот тест вместо обращения к "настоящим" методам должен использовать обращения к фиктивным методам.
0
28 / 27 / 7
Регистрация: 11.06.2011
Сообщений: 387
07.12.2016, 03:15  [ТС]
Shamil1, тестом я хотел бы проверить правильность работы с массивом, например правильно ли он регистрирует ошибки (например, наличие/отсутствие какого либо элемента), правильно ли забирает данные (со всех ли источников), правильно ли выдает данные (например, только 5 первых элементов массива).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2016, 03:15
Помогаю со студенческими работами здесь

Unit Test
Я проверяю результат который я ожидаю и будет ли он выполняться. Я знаю, что по запросу который я посылаю должно отображаться 4 строки с...

Unit Test и System.IO
Здравствуйте, есть такая проблема, добавил кнопку на чтение из файла .txt, соответственно добавил и библиотеку System.IO. Проблема в том...

Unit test библиотеки
Всем привет, ситуация такая. Использую для сетевых запросов Retrofit. Собственно эта библиотека отвечает за всё, за подключение, за ошибки,...

Unit Test Asserts
Selenium, Unit Test, VS. Есть автоматизированный сценарий, нужно в конструкции assert на страницу поиска проверить все ли отели находятся в...

Unit-test Python
Здравствуйте! я самый-самый новичок в Python... Написала функцию, которая отправляет Post запрос (надеюсь, что правильно хоть это...). ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru