Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/47: Рейтинг темы: голосов - 47, средняя оценка - 4.96
0 / 0 / 2
Регистрация: 25.10.2014
Сообщений: 56

Юнит тест для сравнения массивов

15.02.2015, 09:50. Показов 9789. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте,
Есть сортировка выбором
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void selection(int *y,int n) {
    int o;
    for (int i = 0; i < n; ++i)
    {
        int pos = i;
        o = y[i];
        for (int j = i + 1; j < n; ++j)
        {
            if (y[j] < o)
            {
                pos = j;
                o = y[j];
            }
        }
        y[pos] = y[i];
        y[i] = o;
    }
}
Скажите пожалуйста, как должен выглядеть юнит тест, который сравнивает массив к которому применена функция сортировки и другой массив.Я написал что-то такое, но это неправильно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace UnitTest1
{       
    TEST_CLASS(UnitTest1)
    {
    public:
        
 
        
        TEST_METHOD(TestMethod1)
        {
        
            int y[5] = { 1, 2, 3, 4, 5 };
            
        int x[5] = { 1, 2, 3, 4, 5 };
 
            Assert::AreEqual(x[5], selection(y, 5));
            
        }
 
    };
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2015, 09:50
Ответы с готовыми решениями:

Что такое юнит-тест
В задании требуется наличие юнит-тестов к программе. Что это? Как выглядит? Как работает?

Перегрузка оператора сравнения (==) для массивов
Имеется класс-массив. Нужно сравнить два массива при помощи перегрузки оператора (==) Помогите написать пожалуйста!!! class array ...

Функция для сравнения двух массивов
Функция нужна для ответа на вопрос задачи &quot;Верно ли, что все элементы 1-ой последовательности входят во 2-ю последовательность.&quot;...

15
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 228
15.02.2015, 10:16
У меня подозрение, что это Java и JUnit. По-моему, там есть Assert::AreEqual для массивов. Если нет то можно сравнивать поэлементно, примерно, так:

C++
1
2
3
4
5
6
7
int actual[5] = { 1, 2, 3, 4, 5 };
selection( actual, 5 );
 
int expected[5] = { 1, 2, 3, 4, 5 };
 
for ( unsigned int i = 0; i < 5; ++i ) 
    Assert::AreEqual(expected[i], actual[i] );
Добавлено через 6 минут
Если захотите писать на C++ c юнит тестами, то лучшего фреймворка, чем Google Test (и Google Mock) на сегодня нет. Вот моя видео-инструкция

Добавлено через 1 минуту
А, я понят, это не JUnit, а Microsoft.VisualStudio.TestTools
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.02.2015, 10:34
Одного массива для сортировки явно недостаточно для теста. Нужно несколько разных входных массивов, отличающихся своими свойствами. Типа:
1, 2, 3, 4, 5 - отсортирован в одну сторону
5, 4, 3, 2, 1 - отсортирован в другую сторону
4, 3, 1, 5, 2 - не отсортирован
1, 1, 1, 1, 1 - всякие разновидности массивов с повторяющимися элементами
1, 2, 2, 2, 2
1, 1, 1, 2, 1
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
15.02.2015, 11:43
Цитата Сообщение от Evg Посмотреть сообщение
Нужно несколько разных входных массивов
В том числе пустой и состоящий из одного элемента.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 11:51
Цитата Сообщение от 8Observer8 Посмотреть сообщение
то лучшего фреймворка, чем Google Test (и Google Mock) на сегодня нет.
Тогда уж в этот список следует добавить Boost.Test.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2015, 14:05
Цитата Сообщение от Nick Alte Посмотреть сообщение
В том числе пустой и состоящий из одного элемента.
Покажите пример: как вы будите сравнивать пустой массив.

Цитата Сообщение от Убежденный Посмотреть сообщение
Тогда уж в этот список следует добавить Boost.Test.
Отсутствие смертельных тестов, и возможности мокать поведение сильно огорчает.

По сути это означает невозможность без приседаний протестировать
"систему безопасности и отказоустойчивости" механизма.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 14:11
Цитата Сообщение от hoggy Посмотреть сообщение
Отсутствие смертельных тестов, и возможности мокать поведение сильно огорчает.
По сути это означает невозможность без приседаний протестировать
"систему безопасности и отказоустойчивости" механизма.
Давайте заведем для этого холивара отдельную тему ?
Ну и там предлагаю первым делом ответить - для чего вам в юнит-тестах
проверять систему отказоустойчивости ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.02.2015, 14:33
Цитата Сообщение от hoggy Посмотреть сообщение
Покажите пример: как вы будите сравнивать пустой массив
В качестве параметра n подсунуть 0
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2015, 14:40
Цитата Сообщение от Убежденный Посмотреть сообщение
Давайте заведем для этого холивара отдельную тему ?
Это не холивар.

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

Другое дело, что область применения известная,
и ограничена типичным набором типичных возможностей.

Существуют сводные таблицы по различных фреймворкам,
где описано поддерживает ли данный фрейморк ту, или иную возможность.

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

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

Говорят, что грамотно спроектированная программа состоит из кирпичиков.
И если каждый из этих кирпичиков протестирован,
то это дает профит к гарантии качества всего приложения в целом.

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

Для этого существуют смертельные тесты.
Тесты, которые гарантируют, что юнит пофиксил и отреагировал на "нештатную ситуацию".
---------------------------------------------------

Кроме того, великий процент возможных ошибок кроется не внутри кирпичика,
а на стыке взаимодействия с другими.

Если верить Макконеллу, ошибок взаимодействия больше, они коварнее, и дороже в исправлении, нежели ошибки логики в самих юнитах.

И вот тогда на сцену выходит "мок".
Технология, которая позволяет тестировать не только юнит, но и взаимодействие юнитов.

---------------------------------------------------------

На вопрос: зачем это нужно, ответ у меня простой:
1. если необходимо иметь гарантии качества, стабильности работы компонентов.
2. TDD.

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

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
В качестве параметра n подсунуть 0
Мне не очевидно, какой такой параметр n, и куда вы будите его подсовывать,
что бы протестировать "пустой массив".

Хороший юнит-тест можно рассматривать вместо документации,
как пример-иллюстрацию.

Хотелось бы глянуть на то, как сравнивают "пустые массивы".
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.02.2015, 14:43
Цитата Сообщение от hoggy Посмотреть сообщение
Мне не очевидно, какой такой параметр n, и куда вы будите его подсовывать,
что бы протестировать "пустой массив"
В функцию selection из самого первого поста, если ты вдруг не понимаешь, о чём идёт речь в данной теме. До кучи параметр n должен быт беззнакового типа (а точнее, даже size_t), коль скоро по смыслу он не может быть отрицательным
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2015, 14:59
Цитата Сообщение от Evg Посмотреть сообщение
В функцию selection из самого первого поста, если ты вдруг не понимаешь, о чём идёт речь в данной теме.
Понял. Меня сбило с толку словосочетание "пустой массив".
Потому что под массивом я понимаю сишный массив - известный тип данных,
чей размер известен времени компиляции.

В связи с чем не очень понятно, что вы там собрались делать с "пустым массивом".

Собственно, у меня вообще не укладывается как массив может быть пустым,
и зачем это может быть нужно.


Кликните здесь для просмотра всего текста
Пустой массив можно создать, например, так:

C++
1
2
3
4
5
6
7
8
9
10
struct example
{
    int va[]; //<--- если не ошибаюсь, считается "неполным типом"
};
 
int main()
{
   
    example ex;
}
Не понятно для чего такое может быть нужно на практике,
и как это вообще использовать потом.

Вот и стало любопытно.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.02.2015, 15:04
hoggy, спасибо за развернутый ответ по делу. Я лишь не согласен вот в этим:

Цитата Сообщение от hoggy Посмотреть сообщение
единственный плюс boost.test - он доступен из коробки boost.
Из всех тест-фреймворков, с которыми довелось работать (всего около десяти разных),
для меня только Boost.Test, googletest и, может быть, Catch, оказались реально
применимыми в самых разных условиях, а все остальное, включая "раскрученные" CppUnit и
MS.Test - дикий ужас с кучей недоработок, о которых даже вспоминать не хочется.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.02.2015, 15:21
Цитата Сообщение от hoggy Посмотреть сообщение
В связи с чем не очень понятно, что вы там собрались делать с "пустым массивом"
Вообще это не я что-то собрался делать, а Nick Alte, но скорее всего он ошибся в терминологии, хотя я не знаю, каким термином это правильно назвать. Но в любом случае функция должна адекватно реагировать на подобные входные данные, поскольку они нормально укладываются в понятие "размер массива", а потому для полноценного тестирования такой тест нужен.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.02.2015, 15:24
Цитата Сообщение от Убежденный Посмотреть сообщение
Я лишь не согласен вот в этим:
Имхо, с точки зрения дизайна, у них у всех примерно одинаково.

Так например, возьмем нуль-пост:

C++
1
2
for ( unsigned int i = 0; i < 5; ++i ) 
    Assert::AreEqual(expected[i], actual[i] );
Не особой разницы, например с gtest:

C++
1
2
for ( unsigned int i = 0; i < 5; ++i ) 
    EXPECT_EQ(expected[i],  actual[i] );
или boost.test

C++
1
2
for ( unsigned int i = 0; i < 5; ++i ) 
    BOOST_CHECK_EQUAL(expected[i],  actual[i]);
Я хочу сказать, различие не в дизайне, а в поддерживаемых возможностях.

Так то я в основном пользуюсь либо boost.test,
либо gmock (в который интегрирован gtest).

И пришел к выводу, что boost.test это по сути все тоже самое,
только возможностей поменьше.

Добавлено через 40 секунд
Цитата Сообщение от Evg Посмотреть сообщение
а потому для полноценного тестирования такой тест нужен.
Разумеется.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
15.02.2015, 15:28
Цитата Сообщение от Evg Посмотреть сообщение
я не знаю, каким термином это правильно назвать
А я знаю, назвать можно термином "пустой массив". Разумеется, если ограничивать себя какими-то дополнительными условиями, в духе "это обязательно должно быть что-то укладывающееся в правила декларации массивов на Си без новомодных глупостей в духе VLA и ненулевого размера и чтобы пах ванилью с примесью лимона", то с пустотой массива могут возникнуть сложности. А без таких изуверских ограничений всё в порядке.
Цитата Сообщение от hoggy Посмотреть сообщение
Покажите пример: как вы будите сравнивать пустой массив.
С чем вообще можно сравнивать пустой массив и с какой целью? Если имеется в виду сравнение элементов массива, то никак: нет элементов, нет сравнений.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 228
15.02.2015, 17:14
Цитата Сообщение от hoggy Посмотреть сообщение
EXPECT_EQ(expected[i], *actual[i] );
В данном контексте нужно: ASSERT_EQ(expected[i], actual[i] );

Добавлено через 26 минут
С массивом не знаю как поступить, а c std::vector можно возвращать false, если входных данных нет:

C++
1
bool selection( std::vector<int> &arr );
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TEST( test001, EmptyDataTest )
{
    // Input
    std::vector<int> inputVec;
 
    // Actual
    bool actual = selection( inputVec );
 
    // Expected
    bool expected = false;
 
    // Check
    ASSERT_EQ( expected, actual );
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2015, 17:14
Помогаю со студенческими работами здесь

Организация цикла сравнения значений элементов двух массивов
Надо, чтобы программа сравнивала РАЗНЫЕ элементы ОДНОГО МАССИВА. Например, со и т.п. Организовал вот так: for (int m = 0; m &lt;...

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

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

Юнит-тест для метода
Есть класс но сделать под него юнит тест не выходит если ты добрый человек помоги прошу public class Knopka1 { ...

Юнит-тест для асинхронного метода
Доброго всем времени суток! В теме &quot;Логирование при использовании многопоточности&quot; уважаемый kolorotur помог мне написать...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru