Форум программистов, компьютерный форум, киберфорум
seweb
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Написание тестов для программ на Си

Запись от seweb размещена 17.04.2015 в 19:47
Показов 17926 Комментарии 2
Метки c

В этой заметке я хочу написать о том, как реализовать тестирование вашей программы написанной на Си. По сути, это довольно просто, главное - иметь функцию assert, которая останавливает выполнение, если какой-то тест не прошел.

Кстати, для этого уже есть библиотеки, например, CUnit, Check и другие, но я пишу эту заметку для новичков.
Теория

Давайте напишем простую функцию, которая принимает логическое значение status и, если это false, останавливает дальнейшее выполнение программы:

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
void assert(bool status) {
    if (!status) {
        printf("Test failed.\n");
        exit(1);
    }
}
А теперь создадим несколько тестов, где один неправильный.

C
1
2
3
4
5
6
7
8
9
10
11
int main(void) {
    int x = 10, y = x * x;
 
    assert(x * x == y);
    assert(x == (int) y/x);
    assert(10 == 20); // неправильный тест
 
    printf("All tests passed.\n");
 
    return 0;
}
Первые два проходят проверку, а третий - нет, поэтому на экран выводится "Test failed." и программа останавливается как и полагается.

Такой подход хоть и работает правильно, но поиск теста, который не сработал может занять некоторое время. В стандатртную библиотеку включен заголовочный файл assert.h, который содержит макрос assert и он намного функциональнее выше написанной функции.

C
1
2
3
4
# define assert(expr)                           \
  ((expr)                              \
   ? __ASSERT_VOID_CAST (0)                        \
   : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
Этот макрос содержит тернарный оператор, который при условии true возвращает void, то есть ничего не делает, в противном случае печатает переданное выражение expr, файл, строку теста и функцию из которой вызвался тест.

Давайте теперь запустим программу и посмотрим на вывод, но перед этим удалите функцию assert и замените все подключаемые файлы на эти:

C
1
2
#include <stdio.h>
#include <assert.h>
Результат после запуска программы:

Bash
1
test: /path/to/test.c:9: main: Assertion '10 == 20' failed.
Собственно, все данные, которые необходимы для определения местоположения несработавшего теста у нас есть.

Практика

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

Итак, код вычисления будет выглядеть так:

C
1
2
3
4
5
6
7
8
9
10
11
12
#define average(x, y) (((x)+(y)) / 2)
#define improve(x, y) (average((x), ((y) / (x))))
#define square(x) ((x) * (x))
// стандартная функция из stdlib.h принимает только целые числа
#define abs(x) ((x < 0) ? ((x) * -1) : (x))
 
double sqrt_iter(double guess, int x, double accuracy) {
    if (abs(square(guess) - x) < accuracy)
        return guess;
    else
        return sqrt_iter(improve(guess, x), x, accuracy);
}
И тесты:

C
1
2
3
4
5
6
7
8
#include <assert.h>
 
int main(void) {
    assert(sqrt_iter(1.0, 3, 0.000001) > 1.73205081);
    assert(sqrt_iter(0.2, 1, 0.001) > 1);
    assert((int) sqrt_iter(1.0, 81, 0.00000001) == 9);
    // ...
}
Тесты написаны. Конечно, алгоритм вычисления квадратного корня можно заменить другим, но тесты будут оставаться прежними и результат их выполнения должен быть положительным.

Заключение

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

Тестирование программного обеспечения важная часть его разработки.
Метки c
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Evg
    Чисто на всякий случай
    https://www.cyberforum.ru/blogs/18334/blog104.html
    Запись от Evg размещена 17.04.2015 в 20:26 Evg вне форума
  2. Старый комментарий
    Цитата Сообщение от Evg
    Чисто на всякий случай
    https://www.cyberforum.ru/blogs/18334/blog104.html
    Не на всякий, а как раз на важный.

    Думаю, моя статья будет кратким введением в Вашу и она, безусловно, подлежит прочтению каждому.
    Запись от seweb размещена 18.04.2015 в 11:28 seweb вне форума
 
Новые блоги и статьи
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru