|
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
|
|
Unit - тестирование с использованием gtest. Что должен включать в себя тест? (подробнее в описании)22.05.2019, 14:00. Показов 2322. Ответов 8
Метки нет (Все метки)
Доброго всем времени суток.
Господа, требуется ваша помощь в разъяснении ряда терминов. Имеется программа, реализующая алгоритм сортировки (думаю не столь важно какой). Требуется написать 2 типа тестов для этой программы: тест производительности и тест корректности. Но не совсем понятно, что включают в себя эти понятия. В результате гугления получил обзорные представления о том как пишутся тесты. Интуитивно догадываюсь, что тест производительности должен показать, сколько ресурсов потребляет программа, а корректности - правильный ли результат выдает. Буду очень благодарен, если кто-нибудь поможет раскрыть суть данных терминов.
0
|
|
| 22.05.2019, 14:00 | |
|
Ответы с готовыми решениями:
8
Как написать unit test (gtest) для работы с файлом? Unit -тестирование или автоматизированное тестирование
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||
| 22.05.2019, 14:14 | ||||
|
Добавлено через 1 минуту А просто тест производительности.
1
|
||||
|
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
|
||
| 22.05.2019, 14:20 [ТС] | ||
|
А не подскажите тогда такие моменты, если не сложно.
Насколько верен подход проверки на корректность следующий способ. Задать в качестве входного параметра некоторой сортирующей функции известный мне заранее массив, получить результат, а затем с помощью ASSERT_EQ проверить на равенство каждый элемент выходного массива с тем, что должно быть.
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 22.05.2019, 14:26 | |||
|
Потом создал бы контрольный массив, (т.е. взял тот же что и раньше, но посортировал бы его руками), потом просто на выходе функции сравнил бы входной массив и контрольный. У вас же наверное уже известная сортировка? Которая сортирует например за логирифмичное время? Вот и проверьте это, напишите пузырьковую сортировку и сравните с ней. Можете на разных платформах прогнать
1
|
|||
|
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
|
|||
| 22.05.2019, 14:31 [ТС] | |||
|
Добавлено через 3 минуты
0
|
|||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||||
| 22.05.2019, 14:38 | ||||||||
|
Еще наверное стоит сделать отдельные кейсы, если у вас сортировка работает не только с целыми числами. Для более сложного варианта, можно контрольный сортировать каким-то, qsort из std.Если вам вдруг зачем-то надо будет проверять на 10тыс. элементов. Добавлено через 7 минут ![]()
Вот здесь еще пример есть А еще лучше заменить ctime на chrono
1
|
||||||||
|
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
|
|
| 22.05.2019, 14:44 [ТС] | |
|
Кажется что-то стало прорисовываться. осталось только ответить на один вопрос: А причем тут gtest. Это вроде как и без него можно сделать.
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||
| 22.05.2019, 14:48 | ||
|
Ну а вообще, для удобства, вы же не будете каждый раз писать свои обертки для тестирования?
1
|
||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||
| 22.05.2019, 16:59 | |||
typical_workВо-первых, и это очень важно, вам нужно понимать, что именно вы собрались тестировать. Юнит-тесты тестируют не программу. Юнит тесты тестируют юнит. Юнит - функция, класс, библиотека, etc. Что значит "протестировать работу функции" ? Это значит убедиться, что функция работает правильно. Что нужно сделать для этого? Нужно написать код, который запустит функцию правильным образом, и посмотреть - отработала ли функция именно так, как ожидалось. Другими словами, "тест функции" - это на самом деле пример-иллюстрация, как эту функцию нужно будет использовать в реальном коде. Это первый и самый главный фундаментальным принцип TDD Если глядя на тест, вы не можете сразу же понять, что именно здесь тестируется, и как оно должно работать, значит это - халтура, а не тест. Такое сразу в мусорку. Таким образом, в первую очередь вы пишите тесты, которые иллюстрируют дизайн вашего юнита. Я называю такие тесты "тестами первой серии" Или: "типичная работа" 2. rangeТесты второй серии - это запуски юнита на различных пограничных входных данных. Если функция принимает число, давайте запустим её с очень большим числом. А потом запустим с очень маленьким. А потом запустим с нулем. А потом - с положительным. А потом - с отрицательным. И тд. Тесты второй серии наглядно показывают, каким может быть диапазон допустимых значений. 3. invariantСамые интересные, и самые сложные. В программировании есть одно очень важное понятие. Называется оно "инвариант". Инвариант - это характеристика юнита (функции, класса, библиотеки, etc) Которая характеризует способность юнита сохранять собственную работоспособность независимо от корректности вызывающей стороны. Если функцию запустить правильным образом, с правильными аргументами, тогда она ожидаемо отработает правильно. Но что, если функцию запустить неправильным образом, или с неправильными аргументами? Хорошая функция инвариантна. То есть, она не должна сломаться только потому, что ей скормили некорректные данные. Третия серия тестов - это в каком то смысле попытки сломать юнит. Будем запускать функцию с самыми дикими аргументами. И самым диким образом. Хороший юнит: не должен сломаться, не должен обрушить процесс. не должен допустить порчи данных. 4. death testЧто нужно, что бы функция была инвариантной? Для этого нужно, что бы функция всегда первым делом проверяла корректность всех входных данных. Вот специально для людей, которые с первого раза не слышат, и им кажется, что проверок слишком много, я повторю ещё раз: всегда и каждая Каждая функция всегда должна проверить все входные аргументы. Инвариантный юнит не доверяет никому и никогда. Он в любой момент времени ожидает гадость от внешнего мира. И всегда готов к защите. Если возникла какая то проблема, то хороший юнит всегда найдет способ, как предупрежить хозяина (программиста) "Обработка ошибок" - это обширная тема для очень долгих разговоров. Этой теме посвящены целые книги. На практике же, как правило, любой возможный подход сводится к 3м категориям: 4.1. Коды ошибок, аварийные коллебеки Нужно убедиться что юнит возвращает именно тот код ошибки, какой мы ожидаем для каждой конкретной ситуации. С коллебками аналогично. убеждаемся, что для каждой конкретной ситуации будет своевременно запущен соответствующий коллбек. 4.2. Ловушки исключений. Когда юнит по каким то причинам не может продолжать свою работу, Он выбрасывает наверх исключение. что бы предупредить внешний мир о возникшей проблеме. Нужно убедиться, что наш юнит не забыл об этом. И всякий раз, когда по нашей задумке должно вылететь исключение, оно действительно вылетает. 4.3. Смертельный тест. Программные ошибки - ошибки, которых быть не должно. Не должно быть вообще, и в принципе. Проверка "не сбыточных" условий - компетенция assertПри помощи assert достигается разумный баланс между надежностью (количеством проверок всего и всея) и производительностью (скорость работы) Ассертам можно посвятить целую главу в какой ни будь книге. Главное, что нужно понимать в ассертах: ассерты срабатывают только в дебаге. в релизе нарушение контракта ассерта это UB Сработавший ассерт - смерть процесса. Убедимся, что при определенных некорректных входных данных, юнит поджгёт ассерт, и процесс рухнет с соответствующей диагностикой. Что бы тест завершился успехом, программа должна рухнуть. Тест, результат которого - гибель процесса, называется "смертельным". Ещё к юниту могут быть такие требования: "лучше процесс не сделает ничего, чем сделает неправильно" Допустим, наш поток захватывает мутекс. И оказывается, что мутекс - брошенка. Что это значит? Это значит, что мутекс был разблокирован системой. А что значит системой? Значит его предыдущий владелец не разлочил его. А почему не разлочил? Потому что что-то не хорошее случилось. Например, его прежний владелец не успел разлочить мутекс, потому что крашнулся на половине пути. А у нас тут банковское ПО, и все основания полагать, Что случилось что-то плохое. И черт его знает в каком состоянии теперь находятся оберегаемые мутексом данные. В этой непростой ситуации маленькому юниту придётся принимать решение за всю программу. Юнит не может позволить нестабильному процессу продолжать жить. Если юнит не остановит процесс "здесь", тогда "там" (а "там" ещё даже могут не подозревать об аварии) может таких дров наломать. В подобной ситуации некоторые юниты обязаны совершить самоубийство (std::terminate) Главная задача смертельных тестов: убедиться в том, что если процесс должен погибнуть, он действительно погибнет. ------------------- 5. Стресс-тесты. Все предыдущие виды тестов исскуственно воспроизводили различные ситуации. В боевых условиях могут возникать какие угодно сочетания событий. Многие из которых могут быть далеки от исскуственно воссозданных. Например, нужно протестировать функцию Sleep, которая усыпляет поток на 1 секунду. Нужно убедиться что поток действительно проспит не менее 1 секунды, плюс может быть небольшая погрешность. На тестах всё было хорошо. В боевых условиях функция дала погрешность порядка 200 миллисекунд, что далеко за пределами максимально допустимой. Или нужно протестировать тред-пул. Тред-пул - механизм для работы с потоками. На тестах всегда всё хорошо. А на бою произошло зависание (предположительно дедлок) Почему на тестах все хорошо, а на бою вылезают самые разнообразные баги? Потому что тест запускали на компьютере где не было нагрузки. А на бою система в какой то миг была перегруженна, и начала лагать/подтормаживать. Планировщик задач системы начал выдавать потокам кванты времени сильно неравномерно. В результате первыми обычно отказывают таймеры. Затем часто ломается механика, которая обеспечивает многопоточную работу. Что бы выявить подобные "уязвимости", необходимо запускать тесты в самых разных условиях. Под нагрузкой и без нагрузки. И по много-много раз. Например, что будет, если запустить не 1 тестовое приложение, а сразу же сотню экземпляров? Как минимум, мы сразу же получим сотню активных процессов в системе. что создаст экстремальную нагрузку. Запуски "много-много раз" позволяют выявлять ошибки связанные с многопоточкой. У меня был реальный случай, когда я выявила дедлок в кастомной классе мьютекса. Баг удалось выявить только в ходе много кратных запусков десятка экземпляров тестового приложения одновременно. 6. Производительность. Однажды, на одном из форумов, один парень привел такой код: https://ideone.com/7zvVjP В своей теме он написал:
если в его в коде просто переставить местами два цикла: сначала пусть отработает цикл со смартами, и только потом с сырыми указателями. Почему так получается? На производительность влияет очень много различных факторов. Включая такие жутко сложные материи, как "механизм предсказаний процессора", "прогретая память", "кэш и кэш-миссы", и тп. Написать хороший надежный бенчмарк (бенчмарк - тест производительности) - задача нетривиальная. И если обычно тестовое приложение содержит в себе сразу же все 100500 различных тестов, то бенчмарк - вся программа это один единственный тест. Что бы не получилось, как у того парня. Нельзя тестировать производительность "двух разных циклов" в одной программе. Нельзя запускать два разных теста в одной программе. Для функции сортировки бенчмарк: perfomans_1.exe время сортировки массива из 1 элемента perfomans_10.exe время сортировки массива из 10 элементов ... perfomans_1000000.exe время сортировки массива из 1'000'000 элементов Каждая из этих программ в результате своей работы вернет длительность работы функции сортировки в миллисекундах Берем perfomans_1.exe, и в цикле запускаем его 1'000'000, Фиксируем среднее время работы функции (не процесса!). Потом берем perfomans_10.exe, и по аналогии. И так же с остальными. 7. Сравнительные тесты. Тесты производительности любят сравнения. Рядышком с perfomans_1.exe нужно положить какой ни будь perfomans_1_std.exeкоторый делает суть тоже самое, только там используется какая ни будь стандартная qsort По итогам тестов обычно делают сводную табличку, с результатами замеров. И уже можно делать выводы о качестве тестируемого инструмента.
3
|
|||
| 22.05.2019, 16:59 | |
|
Помогаю со студенческими работами здесь
9
Сохранить изменения в HTML документе.(Подробнее в описании) Что должен знать и уметь, дабы считать себя готовым?
Unit - тестирование Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
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
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|