Форум программистов, компьютерный форум, киберфорум
D (DLang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/109: Рейтинг темы: голосов - 109, средняя оценка - 4.67
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Как писать юнит тесты?

05.03.2015, 15:29. Показов 20391. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Приведите, пожалуйста, какой-нибудь простенький пример использования юнит-тестов на D. Я ни разу не пользовался юнит-тестами. Хочу понять, как писать юнит-тесты.
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2015, 15:29
Ответы с готовыми решениями:

Обьясните как писать юнит тесты новичку
Как правильно тестировать данное небольшое приложение, объясните пожалуйста чайнику! html: <!DOCTYPE html> <html> ...

Юнит-тесты в javascript: как обработать зависимость
Ребята, сама я не сильна в JavaScript и во фреймворках тестирования тоже. Но волей судьбы так получилось, что пишу юнит-тесты на то, что...

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

22
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
05.03.2015, 19:56
Для того, чтоб понять как пользоваться юнит тестами, надо разобраться для чего в D используют элемент контрактного программирования assert.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
05.03.2015, 20:05  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
надо разобраться для чего в D используют элемент контрактного программирования assert.
Тьфу. Я то думал, что это, как include <cassert> в C++.
Попробую теперь разобраться.
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
05.03.2015, 20:09
Например, попробуем повторить подвиг tarasa atavina и напишем расчёт сложного процента.
Но для начала бы разберёмся как он считается, и напишем юнит тест для проверки.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
05.03.2015, 21:50  [ТС]
XRuZzz, так ведь это тоже самое, что и в C++.
Вот, например, я порвал контракт:
C++
1
2
3
4
5
6
7
8
import std.stdio;
 
void main() {
 
    int a = 5;
 
    assert(a == 4);
}
Простой и удачный пример, иллюстрирующий контрактное программирование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import std.stdio;
 
void main() {
 
    long square_root(long x)
    in
    {
        assert(x >= 0);
    }
    out (result)
    {
        assert((result * result) <= x && (result+1) * (result+1) > x);
    }
    body
    {
        return cast(long)std.math.sqrt(cast(real)x);
    }
 
    writeln(square_root(9));
}
А как для этого примера написать юнит-тесты? Я так понимаю, что в данном случае юнит-тесты должны проверять корректность контрактных условий, содержащихся в блоках in и out, с помощью перебора параметра функции x.

Ну и как, например, запустить этот юнит-тест?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void myFunc(T)(T[] data)
{
    if (data.length > 2)
        data[0] = data[1];
}
 
@safe nothrow unittest
{
    auto arr = [1,2,3];
    myFunc(arr);
    assert(arr == [2,2,3]);
}
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
05.03.2015, 22:08
Лучший ответ Сообщение было отмечено Dennis Ritchie как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void myFunc(T)(T[] data)
{
    if (data.length > 2)
        data[0] = data[1];
}
 
unittest
{
    import std.stdio;
    auto arr = [1,2,3];
    myFunc(arr);
    assert(arr == [2,2,3]);
    writeln("tested");
}
+
Bash
1
rdmd -unittest --main \home\volvo\dlang\test.d
выводит "tested"
2
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 00:37  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
выводит "tested"
А команду для Windows не подскажете?
Написано, что нужно вводить в таком формате, но у меня ничего не получилось:
Code
1
rdmd -unittest -main $libs $includes $sources
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.03.2015, 01:05
лично я, через dub компилирую.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
06.03.2015, 01:20
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А команду для Windows не подскажете?
Пардон, а что, под Windows уже нет rdmd? Насколько я понимаю, та же команда должна работать (ну, только путь придется задать правильно к d-файлу)
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 13:19  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Пардон, а что, под Windows уже нет rdmd?
Есть, но ему чего-то import std.stdio в девятой строке не нравится:
Code
1
2
3
C:\Windows\system32>rdmd -unittest --main C:\Users\REiS\Documents\Projects\Dlang\Dlang\main.d
C:\Users\REiS\Documents\Projects\Dlang\Dlang\main.d(9): Error: found 'import' instead of statement
Failed: dmd -unittest -v -o- "C:\Users\REiS\Documents\Projects\Dlang\Dlang\main.d" -I"C:\Users\REiS
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33393 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
06.03.2015, 13:35
Ну, не знаю, смотри:



первый прогон - со строкой, которая юниттест не должна пройти:
C++
12
assert(arr == [4,2,3]);
, второй - с той, что на скрине... Пройдено, как видишь
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 13:40  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Ну, не знаю, смотри:
У меня тоже заработало в cmd, но пришлось удалить import std.stdio и writeln("tested").
Я так понимаю, что юнит-тесты нужны для тестирования отдельных функций?
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.03.2015, 16:09
в идеале надо весь код покрывать юнит-тестами, в больших проектах это играет ключевую роль и позволяет сократить срок разработки до нескольких лет.
Смысл тестов в том, что они могут проверить весь код когда компилируем с флагом unittest, и могут быть полностью исключены при компиляции релиза.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 16:29  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
сократить срок разработки до нескольких лет.
Ну если так, то, конечно, юнит-тесты - это true.
А как и где запускать этот dub?
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.03.2015, 16:32
скачать, установить, изучить
http://code.dlang.org/about
если изучать лень, то общий смысл, это настроить json файл в корне проекта, и просто запускать команду dub, хотя я использую модуль DDT для Eclipse. то есть у меня всё кнопочками само запускается.
dub нужен для автоматического управления зависимостями[библиотеками]
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 16:39  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
скачать, установить, изучить
Коротко и содержательно (скачать и установить - давно сделано).
Цитата Сообщение от XRuZzz Посмотреть сообщение
модуль DDT для Eclipse
А отладчик для D в Eclipse работает?
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.03.2015, 17:18
чтоб отладчик в Eclipse заработал, надо вроде gdb ставить. У меня как то само собой заработало :]
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 17:33  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
У меня как то само собой заработало :]
Версия Eclipse для C/C++ подойдёт? Или нужно какую-то другую ставить?
И как потом DDT туда приклеить?
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
06.03.2015, 20:47
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Версия Eclipse для C/C++ подойдёт? Или нужно какую-то другую ставить?
Может и подойдёт, я обычно качаю голый Eclipse и ставлю нужные модули.
Help-> Install New Software ...
Там нажимаем кнопку Add, потом читаем тут
https://github.com/bruno-medei... stallation
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.03.2015, 22:39  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
Там нажимаем кнопку Add, потом читаем тут
DDT давно уже установил, но похоже, что не всё настроил (выдаёт ошибки):
Миниатюры
Как писать юнит тесты?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2015, 22:39
Помогаю со студенческими работами здесь

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

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

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

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

Виртуальные методы и юнит-тесты
В C# пришел недавно из Java, где все методы виртуальные. И сразу столкнулся с тем, что в C# по умолчанию методы невиртуальные, более того,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь 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. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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 с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru