Как проверить программу на си

Составить программу-тест в MVS на языке программирования С++: на экране по очереди появляются вопросы (вопросы выбираются программистом), с вариантами ответов. В конце работы программа выдает количество заработанных баллов по результатам ответа.

Решение данной задачи неоднозначно, у каждого программиста мозг работает по своему. Поэтому код будет отличаться в любом случае, даже если вы тоже в программе используете операторы выбора if и оператор множественного выбора switch. Кстати, среду программирования выбирайте на свое усмотрение, не обязательно использовать Microsoft Visual Studio. Результат работы программы у вас должен получиться такой:

// switch_test.cpp: определяет точку входа для консольного приложения. #include «stdafx.h» #include using namespace std; int main(int argc, char* argv[]) < int answer1, answer2, answer3, answer_case = 0; // вспомогательные переменные cout 5 lives n-> 7 lives n-> 9 livesnyour answer: «; // Сколько жизней у кошки? cin >> answer1; cout 10 centimeters n-> 100 centimeters n-> 1000 centimetersnyour answer: «; // Сколько сантиметров в одном метре? cin >> answer2; cout 340 m/s n-> 320 m/s n-> 240 m/s nyour answer: «; //Скорость звука? cin >> answer3; if (answer1 == 9) answer_case ++; // проверяем ответ на первый вопрос if (answer2 == 100) answer_case ++; // проверяем ответ на второй вопрос if (answer3 == 340) answer_case ++; // проверяем ответ на третий вопрос cout case 2: case 3: default : cout system(«pause»); return 0; >

Вопросы формируются оператором cout, после чего, операторы выбора if анализируют ответы, инкрементируют переменную answer_case, если ответ правильный, в противном случае значение в этой переменной не меняется. Далее в операторе множественного выбора switch определяется количество заработанных балов. Ниже, смотрим результат работы программы:

Как начать изучать программирование? С++, С#

CppStudio.com

1)How many cat lives?
answers:
-> 5 lives
-> 7 lives
-> 9 lives
your answer: 9

2)How many centimeters in a meter?
answers:
-> 10 centimeters
-> 100 centimeters
-> 1000 centimeters
your answer: 100

2)The speed of sound?
answers:
-> 340 m/s
-> 320 m/s
-> 240 m/s
your answer: 340

Источник: cppstudio.com

Юнит тесты на Си — нет ничего проще

Прочитав статью «Тестирование встроенных систем» и комментарии к ней я был несколько поражен тем фактом, что многие хабровчане знакомы с книгой «Test Driven Development for Embedded C (Pragmatic Programmers)» и framework-ом Unity, но не используют весь арсенал средств, которые предлагают ребята из throwtheswitch.org.

Читайте также:
Лучшая программа для карт Андроид

Хочу кратко поделится опытом использования этих самых средств.

О себе

Так получилось, что я нарабатывал свой опыт в программировании встраиваемых систем через тесты (Unit, Integration, System, Stress). За три года мне посчастливилось пройти путь от Junior’a и написания тестов, покрывающих код других специалистов, до Senior’a с опытом разработки систем с использованием TDD методологии.

Как работает C/C++?

Обещанное

Упомянутый выше framework Unity очень прост и удобен в использовании. Но это всего лишь вершина айсберга. На странице throwtheswitch.org есть следующие инструменты.

CMock — инструмент позволяющий автоматически генерировать Си-код mock-ов для Ваших тестов. Написан на Ruby. Утверждаю, как человек, который на протяжении трех лет «генерировал» mock-и руками — это просто подарок для Си-разработчика. Но использовать его автономно без следующего инструмента, на мой взгляд, не рационально.

Ceedling — это целая билд-система, как утверждают сами авторы. Но по сути — это все, что Вам нужно для работы. Данный пакет содержит в себе все необходимое: Unity («тест-раннеры» и «чекалки» значений), CMock (генератор моков) и поддержку командной строки через ruby make.

Other — под этим странным заголовком находится очень, полезный, на мой взгляд инструмент — CException. Невероятно маленькая библиотека для Си позволяющая получить некое подобие исключений. Но дезинформировать не буду. В проектах использовать не довелось.

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

Прежде всего, Ceedling должен быть корректно установлен и проверен на работоспособность как указано тут.

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

ceedling new MyNewProject

  • build — сюда будут помещаться все артефакты при сборке и прогоне тестов
  • src- это место для нашего «боевого» кода, который подлежит тестированию
  • test — будут лежать все наши тесты
  • vendor — собственно сам framework, с документацией и плагинами
  • project.yml — конфигурационный файл тестового проекта. Позволяет делать хороший тюнинг, но это с опытом

Пора писать первый тест.

Поместим в папку test файл test_calc.c следующего содержания:

Читайте также:
Программы похожие на zenwriter

#include «unity.h» #include «calc.h» void setUp(void) < >void tearDown(void) < >void test_add( void )

Запускаем тест командой:

ceedling test:test_calc.c

Результат ожидаемый. Тест есть, кода нет. Проект не может быть собран.

Добавляем код.
В папку src помещаем два файла:

#ifndef CALC_H #define CALC_H int calc_add(int a, int b); #endif
#include «calc.h» int calc_add(int a, int b)

Повторяем сборку и попытку прогнать тест:

ceedling test:test_calc.c

Если все сделано правильно, то в консоли должны быть результаты теста:

Test ‘test_calc.c’ —————— Compiling test_calc_runner.c. Compiling test_calc.c. Compiling calc.c. Compiling unity.c. Compiling cmock.c. Linking test_calc.out.

Running test_calc.out. ————————- OVERALL UNIT TEST SUMMARY ————————- TESTED: 1 PASSED: 1 FAILED: 0 IGNORED: 0

Этот короткий пример показывает, что test-runner был сгенерирован и добавлен в сборку автоматически. Его код можно найти в папке build/test/runners.

Попробуем усложнить задачу и предположим, что наш «боевой» файл должен уметь считать только при определенном условии, проверка которого осуществляется в другом программном модуле (например, rules.c). Модифицируем код, для иллюстрации:

#include «calc.h» #include «rules.h» int calc_add(int a, int b) < if (rules_is_addition_allowed()) < return a + b; >return 0; >

Добавим еще один файл в папку src:

#ifndef RULES_H #define RULES_H int rules_is_addition_allowed(void); #endif

Попытка запустить тест будет неудачной, так как нет определения для функции rules_is_addition_allowed().

Самое время воспользоваться CMock.
Изменим тест следующим образом:

#include «unity.h» #include «calc.h» #include «mock_rules.h» void setUp(void) < >void tearDown(void) < >void test_add( void ) < int result = 0; rules_is_addition_allowed_ExpectAndReturn(1); result = calc_add(2,2); TEST_ASSERT_EQUAL_INT( 4, result ); >void test_add_off_nominal( void )

Таким образом, мы получили автоматически сгенерированный mock одним лишь указанием «#include «mock_rules.h». Исходный код данного файла можно найти в директории build/test/mocks. Его изучение даст хорошее представление о том, каким образом можно менять поведение подменяемого модуля.

Оговорочки

1. Я использую данный framework только для тестирования кода на PC. Это диктует определенные правила к архитектуре разрабатываемого ПО. Прогонять юнит тесты на реальном железе смысла не вижу. HAL — он либо работает либо нет и тестируется мануально (мое видение ситуации);
2. Я не использую данный framework для тестирования нескольких потоков. Потокобезопастность данного инструмента мной не исследовалась;
3. Данная статья не учит как правильно писать код и/или тесты, а всего-лишь дает краткое представление об упомянутых выше инструментах разработки.

  • Тестирование IT-систем
  • TDD
Читайте также:
Лучшая программа для сушки тела для мужчин

Источник: habr.com

Использование макроса assert в Си и C++

Есть такая интересная штука в стандартной библиотеке Си, как макрос assert. Что же он делает? Зачем нужен? Как работает? Прошу под кат.

Макрос проверяет переданное ему выражение на истинность(то есть true или false). Если выражение true — программа выполняется дальше, если false — программа аварийно завершается(подробнее далее). Давайте напишем пример, который проиллюстрирует работу макроса:

#include //подключаем заголовочный файл для assert #include int main(int argc, char *argv[]) < printf(«Выполнение assert(true)rn»); //выводим на экран строку assert(0 == 0); //передаем в assert TRUE printf(«Выполнение assert(false)rn»); //выводим на экран строку assert(0 == 1); //передаем в assert FALSE /*Пытаемся вывести еще одну строку, но этот код не будет выполнен так как предыдущий assert завершил выполнение программы*/ printf(«Завершение программыrn»); return 0; >

В результате программа выдаст следующее:

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

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

#include #include int main(int argc, char *argv[])

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

#include int main(int argc, char *argv[])

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

Спрашивайте свои ответы, пишите пожелания.

Похожие записи:

  1. Указатели в C/C++ для новичков (Часть 1)
  2. Указатели в C/C++ для новичков (Часть 2)
  3. Немного о программе make
  4. Пробуем программировать в Linux

Источник: jakeroid.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru