| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Добавление модульных тестов в проект C - Практическое руководство по IDE NetBeans |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: Добавление модульных тестов в проект C - Практическое руководство по IDE NetBeans - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, Добавление модульных тестов в проект C - Практическое руководство по IDE NetBeans |
| |
| _Составитель: link:mailto:susanm@netbeans.org[+_Сьюзан Морган (Susan Morgan)_+] |
| Март 2014 г._ [Номер версии: V8.0-1] |
| |
| |
| |
| == Требования |
| |
| *Для работы с этим учебным курсом требуется программное обеспечение, указанное ниже.* |
| |
| |=== |
| |Программное обеспечение |Требуемая версия |
| |
| |IDE NetBeans (включая поддержку C/C++/Fortran) |link:https://netbeans.org/downloads/index.html[+версия 7.4 или 8.0 с подключаемым модулем NetBeans C/C+++] |
| |
| |Комплект для разработчика на языке Java (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Версия 7 или 8+] |
| |
| |Инфраструктура тестирования CUnit 2.1 |link:http://sourceforge.net/projects/cunit/[+Инфраструктура модульного тестирования для проектов C на sourceforge.+] |
| |=== |
| |
| |
| Дополнительные сведения о загрузке и установке необходимого программного обеспечения NetBeans см. в разделах link:../../../community/releases/80/install.html[+Инструкции по установке IDE NetBeans+] и link:../../../community/releases/80/cpp-setup-instructions.html[+Настройка IDE NetBeans для C/C++/Fortran+] |
| . |
| |
| |
| == Введение |
| |
| IDE NetBeans c подключаемым модулем C/C++/Fortran поддерживает модульное тестирование в проектах C/C++. В среде IDE можно создавать и выполнять тесты C и C++, осуществлять их отладку и просматривать результаты. В этой статье описывается использование модульных тестов в проектах C/C++ в среде IDE. |
| |
| При создании управляемого проекта создается логическая папка 'Файлы тестов' для работы с модульными тестами проекта. Тесты можно создавать непосредственно в этой папке 'Файлы тестов' или группировать их во вложенные логические папки. Узел теста в папке 'Файлы тестов' представляет собой специальную папку для выполнения действий, связанных с тестом. При сборке теста основной файл будет исключен из проекта. В противном случае будут использоваться все остальные параметры проекта. |
| |
| IDE поддерживает только форматы CUnit, CppUnit и свой собственный "простой" формат выходных данных. Это означает, что результаты тестов представляют собой выходные данные в одном из указанных форматов. В среде IDE предусмотрены шаблоны модульных тестов: |
| |
| * Простой тест C |
| * Простой тест C++ |
| * Тест CUnit |
| * Тест CppUnit |
| * Средство запуска теста CppUnit |
| |
| В этом руководстве описывается использование инфраструктуры тестирования CUnit и простых тестов C в среде NetBeans на Ubuntu Linux, но приведенные здесь инструкции применимы и к другим типам тестов на других плафтормах. Инфраструктуры тестирования CUnit и CppUnit в этом руководстве не рассматриваются. Информацию об использовании этих инфраструктур можно найти в соответствующей документации. |
| |
| |
| == Установка инфраструктуры тестирования CUnit |
| |
| Чтобы выполнить практические задания, представленные в этом руководстве, необходимо сначала установить CUnit на локальном компьютере. Дополнительные сведения об инфраструктуре CUnit см. в разделе link:http://sourceforge.net/projects/cunit/[+Проект инфраструктуры тестирования C Unit на sourceforge.+] |
| |
| Документация по CUnit включена в загружаемый пакет CUnit. Также с документацией можно ознакомиться на веб-сайте по адресу link:http://cunit.sourceforge.net/doc/index.html[+http://cunit.sourceforge.net/doc/index.html+]. |
| |
| Следуйте инструкциям по установке для вашей платформы: |
| |
| * <<linux,Установка CUnit на Linux или Mac OS>> |
| * <<solaris,Установка CUnit на Oracle Solaris 11>> |
| * <<mingw,Установка CUnit на Windows и MinGW>> |
| * <<cygwin,Установка CUnit на Windows и Cygwin>> |
| |
| |
| === Установка CUnit на Linux или Mac OS |
| |
| При установке на платформу Linux должна быть возможность установить пакеты libcunitl, libcunitl-doc и libcunitl-dev из репозитория пакетов. |
| |
| Если пакеты libcunitl* недоступны на Mac OS или Linux, можно загрузить исходный код CUnit и выполнить сборку в соответствии с инструкциями в данном документе. |
| |
| Приведенные ниже инструкции подразумевают, что вы загрузили файл CUnit-2.1-2-src.tar.bz2 в каталог /tmp. Если загруженный файл имеет другое имя, обязательно укажите фактическое имя загружаемого файла CUnit и фактический каталог, в который был сохранен этот файл. |
| |
| 1. Загрузите исходный код CUnit-2.1-2-src.tar.bz2 со страницы link:http://sourceforge.net/projects/cunit/files[+Файлы CUnit+] и сохраните его в каталог временных файлов, например /tmp. |
| 2. В окне терминала распакуйте файл ``CUnit-2.1-2-src.tar.bz2`` следующим образом: |
| |
| [source,shell] |
| ---- |
| |
| $ cd /tmp |
| $ bunzip2 CUnit-2.1-2-src.tar.bz2 |
| $ tar -xvf CUnit-2.1-2-src.tar |
| ---- |
| |
| [start=3] |
| . Создайте конфигурацию, выполните сборку и установку CUnit из каталога /tmp следующим образом: |
| |
| [source,shell] |
| ---- |
| |
| $ cd CUnit-2.1-2 |
| $ ./configure --prefix=/usr |
| $ make |
| $ sudo make install |
| ---- |
| |
| После выполнения команды 'make install' инфраструктура тестирования CUnit готова к использованию в среде IDE. Мoжно переходить к разделу <<project,Создание проекта>>. |
| |
| |
| [[solaris]] |
| === Установка CUnit на Oracle Solaris |
| |
| Перед использованием тестов CUnit необходимо выполнить сборку CUnit в системе сборки link:http://en.wikipedia.org/wiki/GNU_build_system[+GNU+]. Система сборки GNU в Oracle Solaris 11, как правило, не установлена по умолчанию. Компоненты системы сборки GNU можно получить из репозитория пакетов Oracle Solaris 11 с помощью следующих команд: |
| |
| |
| [source,java] |
| ---- |
| |
| pkg install pkg://solaris/developer/build/gnu-make |
| pkg install pkg://solaris/developer/build/make |
| pkg install pkg://solaris/developer/gcc-45 |
| pkg install pkg://solaris/system/header |
| pkg install pkg://solaris/developer/build/autoconf |
| pkg install pkg://solaris/developer/build/automake-110 |
| ---- |
| |
| Приведенные ниже инструкции подразумевают, что вы загрузили файл CUnit-2.1-2-src.tar.bz2 в каталог /tmp. Если загруженный файл имеет другое имя, обязательно укажите фактическое имя загружаемого файла CUnit и фактический каталог, в который был сохранен этот файл. |
| |
| 1. Загрузите исходный код CUnit-2.1-2-src.tar.bz2 со страницы link:http://sourceforge.net/projects/cunit/files[+Файлы CUnit+] и сохраните его в каталог временных файлов, например /tmp. |
| 2. В окне терминала распакуйте файл ``CUnit-2.1-2-src.tar.bz2`` следующим образом: |
| |
| [source,shell] |
| ---- |
| |
| $ cd /tmp |
| $ bunzip2 CUnit-2.1-2-src.tar.bz2 |
| $ tar -xvf CUnit-2.1-2-src.tar |
| ---- |
| |
| [start=3] |
| . Создайте конфигурацию, выполните сборку и установку CUnit из каталога /tmp следующим образом: |
| |
| [source,shell] |
| ---- |
| |
| $ cd CUnit-2.1-2 |
| $ ./configure --prefix=/usr |
| $ make |
| $ make install |
| ---- |
| |
| После выполнения команды 'make install' инфраструктура тестирования CUnit готова к использованию в среде IDE. Мoжно переходить к разделу <<project,Создание проекта>>. |
| |
| |
| === Установка CUnit на Windows и MinGW |
| |
| Приведенные ниже инструкции подразумевают, что вы загрузили файл CUnit-2.1-2-src.tar.bz2 в каталог C:/distr. Если загруженный файл имеет другое имя, обязательно укажите фактическое имя загружаемого файла CUnit и фактический каталог, в который был сохранен этот файл. |
| |
| 1. Загрузите исходный код CUnit-2.1-2-src.tar.bz2 со страницы link:http://sourceforge.net/projects/cunit/files[+Файлы CUnit+] и сохраните его в каталог временных файлов, например C:/distr. |
| 2. Запустите оболочку MinGW в Windows (выберите Пуск > Все программы > MinGW > MinGW Shell). |
| 3. В окне MinGW Shell распакуйте файл ``CUnit-2.1-2-src.tar.bz2`` следующим образом: |
| |
| [source,shell] |
| ---- |
| |
| $ cd c:/distr |
| $ bunzip2.exe CUnit-2.1-2-src.tar.bz2 |
| $ tar xvf CUnit-2.1-2-src.tar |
| $ cd ./CUnit-2.1-2 |
| ---- |
| |
| [start=4] |
| . Найдите путь Unix к MinGW с помощью команды mount. |
| |
| [source,shell] |
| ---- |
| |
| $ mount |
| ---- |
| Результат будет выглядеть примерно так: |
| |
| [source,java] |
| ---- |
| |
| C:\Users\username\AppData\Local\Temp on /tmp type user (binmode,noumount) |
| C:\MinGW\msys\1.0 on /usr type user (binmode,noumount) |
| C:\MinGW\msys\1.0 on / type user (binmode,noumount) |
| *C:\MinGW on /mingw type user (binmode)* |
| ---- |
| В последней строке, выделенной полужирным шрифтом, показан путь Unix: /mingw. Система может выдать и другой результат. Запишите этот путь, так как его потребуется указать в следующей команде. |
| |
| [start=5] |
| . Создайте конфигурацию Makefile с помощью следующей команды. |
| Если оболочка MinGW расположена на пути, отличном от /mingw, обязательно укажите соответствующее местосположение MinGW в Unix с помощью параметра --prefix=. |
| |
| [source,shell] |
| ---- |
| |
| $ ./configure --prefix=/mingw |
| _(lots of output about checking and configuring) |
| ..._ |
| config.status: executing depfiles commands |
| config.status: executing libtool commands |
| |
| ---- |
| |
| [start=6] |
| . Выполните сборку библиотеки для CUnit: |
| |
| [source,shell] |
| ---- |
| |
| $ make |
| make all-recursive |
| make[1]: Entering directory 'c/distr/CUnit-2.1-2' |
| Making all in CUnit |
| ... |
| _(lots of other output)_ |
| make[1]: Leaving directory 'c/distr/CUnit-2.1-2' |
| $ |
| ---- |
| |
| [start=7] |
| . Установите библиотеку CUnit в каталоги C:/MinGW/include/CUnit, C:/MinGW/share/CUnit и C:/MinGW/doc/CUnit с помощью команды make install: |
| |
| [source,shell] |
| ---- |
| |
| $ make install |
| Making install in CUnit |
| make[1]: Entering directory 'c/distr/CUnit-2.1-2/CUnit' |
| Making install in Sources |
| make[1]: Entering directory 'c/distr/CUnit-2.1-2/Cunit/Sources' |
| ... |
| _(lots of other output)_ |
| make[1]: Leaving directory 'c/distr/CUnit-2.1-2' |
| $ |
| ---- |
| |
| [start=8] |
| . Если вы используете версию Java 7 Update 21, 25 или 40, необходимо применить временное решение link:https://netbeans.org/bugzilla/show_bug.cgi?id=236867[+проблемы 236867+], чтобы использовать CUnit для выполнения заданий этого практического руководства. |
| |
| 1. Перейдите в раздел Сервис > Параметры > C/C++ > Средства сборки и выберите набор средств MinGW. |
| 2. Измените запись комынды make на make.exe без указания полного пути. |
| 3. Выйдите из среды IDE. |
| 4. В Windows 7 или более поздних версиях введите *var* в поле поиска в меню 'Пуск' для быстрого поиска ссылки 'Изменит системные переменные среды'. |
| 5. Перейдите на вкладку 'Дополнительно' и щелкните 'Переменные среды'. |
| 6. На панели 'Системные переменные' в диалоговом окне 'Переменные среды' нажмите 'Создать'. |
| 7. В поле 'Имя переменной' введите MAKE, а в поле 'Значение переменной' - make.exe. |
| 8. Нажмите кнопку OK в каждом диалоговом окне, чтобы сохранить изменения. |
| 9. Запустите IDE и перейдите к следующему разделу. |
| |
| После выполнения команды make install инфраструктура CUnit готова к использованию в среде IDE. Мoжно переходить к разделу <<project,Создание проекта>>. |
| |
| |
| === Установка CUnit на Windows и Cygwin |
| |
| В Cygwin для установки CUnit можно использовать стандартный установщик Cygwin, setup-x86.exe или setup-x86_64.exe, который можно загрузить на веб-сайте http://cygwin.com/install.html. Пакет CUnit находится в категории 'Библиотеки', и его можно установить точно так же, как и другие пакеты. |
| |
| Проверьте правильность используемой версии. Если вы работаете в 64-разрядной версии IDE NetBeans, необходимо использовать 64-разрядную версию Cygwin и CUnit. |
| |
| Если среда Cygwin еще не установлена, воспользуйтесь общими инструкциями по установке Cygwin в разделе link:../../../community/releases/80/cpp-setup-instructions.html#cygwin[+ Настройка NetBeans IDE для C/C++/Fortran+]. Чтобы установить CUnit, можно выбрать соответствующий файл в категории 'Библиотеки' в программе установки. |
| |
| |
| == Создание проекта для учебного курса |
| |
| Чтобы изучить компоненты модульных тестов, необходимо сначала создать новое приложение C: |
| |
| 1. Выберите команду "Файл" > "Новый проект". |
| 2. В мастере создания проектов выберите 'C/C++', а затем 'Приложение C/C++'. |
| 3. В диалоговом окне 'Создание приложения C/C++' выберите 'Создать основной файл', затем выберите язык C. Оставьте все остальные настройки по умолчанию без изменения. |
| image::images/c-unit-new-project.png[] |
| |
| [start=4] |
| . Нажмите 'Готово'. В результате будет создан проект Cpp_Application__x_. |
| |
| [start=5] |
| . В окне 'Проекты' откройте папку 'Исходные файлы' и дважды щелкните файл `main.c`, чтобы открыть его в редакторе. Содержимое файла будет выглядеть примерно так, как показано на рисунке: |
| image::images/c-unit-mainc-initial.png[] |
| |
| [start=6] |
| . Чтобы дать программе задачу, замените код в файле `main.c` на следующий код. В результате получится простая программа вычисления факториала: |
| |
| [source,c] |
| ---- |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| long factorial(int arg) { |
| long result = 1; |
| int i; |
| for (i = 2; i <= arg; ++i) { |
| result *= i; |
| } |
| return result; |
| } |
| |
| int main(int argc, char** argv) { |
| printf("Type an integer and press Enter to calculate the integer's factorial: \n"); |
| int arg; |
| fflush(stdout); |
| scanf("%d", &arg); |
| |
| printf("factorial(%d) = %ld\n", arg, factorial(arg)); |
| |
| return (EXIT_SUCCESS); |
| } |
| |
| ---- |
| |
| После редактирования файл принимает следующий вид: |
| |
| image::images/c-unit-mainc-edited.png[] |
| |
| [start=7] |
| . Сохраните файл нажатием клавиш Ctrl+S. |
| |
| [start=8] |
| . Выполните сборку и запуск проекта, чтобы проверить его работоспособность. Для этого нажмите кнопку 'Выполнить' на панели инструментов IDE. |
| Если в качестве целого числа указать 8, должен получиться следующий результат: |
| image::images/c-unit-output-factorial.png[] |
| |
| На некоторых платформах может потребоваться двукратное нажатие на клавишу Enter. |
| |
| |
| == Добавление тестов CUnit в управляемый проект NetBeans |
| |
| В процессе разработки приложения полезно добавить модульные тесты. |
| |
| Каждый тест должен содержать функцию `main` и создавать один исполняемый файл. |
| |
| 1. В окне 'Проекты' дважды щелкните исходный файл `main.c` и выберите Создать тест > Создать тест CUnit. |
| image::images/c-unit-create-test.png[] |
| |
| Открывается мастер создания тестов. |
| |
| |
| [start=2] |
| . В окне 'Выбор элементов' установите флажок напротив функции `main`. В результате будут выбраны все функции в файле `main`. В нашей программе есть только одна функция - `factorial()`. |
| |
| [start=3] |
| . Нажмите 'Далее'. |
| |
| [start=4] |
| . Оставьте заданное по умолчанию имя New CUnit Test без изменения и нажмите 'Готово'. |
| |
| В структуре папки 'Файлы тестов' появляется новый узел New CUnit Test. |
| |
| Папка New CUnit Test содержит следующие шаблоны файлов для теста. В эту папку можно добавлять новые файлы тем же способом, каким вы добавляете исходные файлы в проект - с помощью команды в контекстном меню папки. |
| |
| [start=5] |
| . Разверните структуру папки New CUnit Test. В этой структуре должен присутствовать файл `newcunittest.c`. Откройте этот файл в редакторе. |
| |
| [start=6] |
| . В файле `newcunittest.c` обратите внимание на оператор `#include "CUnit/Basic.h"`, предназначенный для обращения к библиотеке CUnit. Файл `newcunittest.c` содержит автоматически генерируемую тестовую функцию `testFactorial` для функции `factorial()` в основном файле `main.c`. |
| |
| image::images/c-unit-includes.png[] |
| |
| Если среда IDE не обнаружила файл `CUnit/Basic.h`, можно изменить путь include, чтобы он указывал на правильное местоположение. Например, если библиотека CUnit установлена в Windows в каталог `C:\Tools\CUnit-2.1-2`, необходимо изменить путь на следующий: |
| |
| `#include <C:\Tools\CUnit-2.1-2\CUnit\Headers\Basic.h>` |
| |
| Созданный тест является заглушкой, которую следует отредактировать для создания более функциональных тестов, но этот тест может успешно выполняться и без редактирования. |
| |
| |
| == Выполнение теста C Unit |
| |
| В среде IDE предусмотрено несколько способов выполнения тестов. Для запуска тестов можно щелкнуть правой кнопкой мыши узел проекта, папку 'Файлы теста или вложенную папку теста и выбрать Тест. Также можно выбрать команду Выполнить > Тестировать проект в строке меню или нажать сочетание клавиш Alt+F6. |
| |
| 1. Запустите тест, щелкнув правой кнопкой мыши папку New CUnit Test и выбрав 'Тест'. |
| |
| В среде IDE открывается окно 'Результаты теста, в котором должны отображаться выходные данные, сходные с показанными ниже. Эти данные указывают на то, что тест не пройден. |
| |
| Если окно 'Результаты теста' не отображается, откройте его самостоятельно. Для этого выберите Окно > Средства IDE > Результаты теста или нажмите сочетание клавиш Alt+Shift+R. |
| |
| image::images/c-unit-run-test-orig.png[] |
| |
| [start=2] |
| . Окно 'Результаты теста разделено на две части. |
| В правой части отображаются консольные выходные данные тестов. В левой части отображается сводная информация о пройденных и непройденных тестах, а также описание непройденных тестов. |
| |
| [start=3] |
| . В окне 'Результаты теста дважды щелкните узел `testFactorial caused an ERROR` для перехода к функции `testFactorial` в редакторе исходного кода. |
| Очевидно, что эта функция сама по себе ничего не проверяет, а только подтверждает, что модульный тест не пройден, задавая параметр CU_ASSERT(0). Значение условия равно 0, что эквивалентно значению FALSE, поэтому инфраструктура CUnit интерпретирует это значение как неуспешный результат теста. |
| |
| [start=4] |
| . Измените строку CU_ASSERT(0) на CU_ASSERT(1) и сохраните файл (Ctrl+S). |
| |
| [start=5] |
| . Запустите тест повторно, щелкнув правой кнопкой мыши папку New CUnit Test и выбрав 'Тест'. |
| В окне 'Результаты теста выводятся данные, указывающие на то, что тест пройден. |
| image::images/c-unit-run-test-pass.png[] |
| |
| |
| == Добавление еще одного теста CUnit |
| |
| 1. Создайте общий шаблон теста CUnit. Для этого щелкните правой кнопкой мыши папку 'Файлы тестов' и выберите 'Создать тест CUnit'. |
| image::images/c-unit-new-cunit-test.png[] |
| |
| [start=2] |
| . Назовите тест My CUnit Test (имя файла должно иметь вид `mycunittest`) и нажмите 'Готово'. |
| image::images/c-unit-create-mycunittest.png[] |
| |
| [start=3] |
| . Создается новая папка теста My CUnit Test. Эта папка содержит файл `mycunittest.c`, который открывается в редакторе. |
| |
| [start=4] |
| . Изучите файл теста `mycunittest.c`. Этот файл содержит два теста. Тест с именем test1 будет пройден, поскольку имеет значение TRUE, а тест с именем test2 завершится с ошибкой, поскольку имеет значение FALSE (2*2 не равно 5). |
| |
| [source,java] |
| ---- |
| |
| void test1() |
| { |
| CU_ASSERT(2*2 == 4); |
| } |
| void test2() |
| { |
| CU_ASSERT(2*2 == 5); |
| } |
| ---- |
| |
| [start=5] |
| . Выполните тест так же, как предыдущий. Отобразится следующий результат: |
| image::images/c-unit-run-mytest1.png[] |
| |
| [start=6] |
| . Выполните все тесты. Для этого в главном меню IDE выберите Запуск > Тестировать проект (Cpp_Application__x_). Будут выполнены оба набора тестов, и результаты их выполнения (успешные и неуспешные) отобразятся в окне 'Результаты теста'. |
| |
| [start=7] |
| . Наведите указатель мыши на непройденный тест, чтобы просмотреть сведения об ошибке. |
| image::images/c-unit-test-fail-annotation.png[] |
| |
| [start=8] |
| . С помощью кнопок в левой части окна 'Результаты теста' можно показать или скрыть пройденные или непройденные тесты. |
| |
| |
| == Отладка теста My CUnit Test |
| |
| Отладка тестов осуществляется так же, как и отладка исходных файлов проекта. Процесс отладки описан в link:https://netbeans.org/kb/docs/cnd/debugging.html[+Практическом руководстве по отладке проектов C/C+++]. |
| |
| 1. В окне 'Проекты' щелкните правой кнопкой мыши папку My CUnit Test и выберите 'Шаг с заходом в тест'. |
| |
| Также можно запустить отладчик. Для этого щелкните тест правой кнопкой мыши в окне 'Результаты теста' и выберите 'Отладка'. |
| |
| |
| Отображается панель инструментов отладчика. |
| |
| [start=2] |
| . Нажмите кнопку 'Шаг с заходом' для пошагового выполнения программы. При каждом нажатии этой кнопки выполняется один оператор. |
| image::images/c-unit-debug-icons.png[] |
| |
| [start=3] |
| . Откройте окно 'Стек вызовов' (Окно > Отладка > Стек вызовов), чтобы просматривать вызовы функций во время пошагового выполнения теста. |
| |
| |
| == Добавление простого тeста |
| |
| Простые тесты C используют собственную простую инфраструктуру тестирования IDE. Для использования простых тестов не требуется загружать отдельную инфраструктуру тестирования. |
| |
| 1. В окне 'Проекты' щелкните правой кнопкой мыши исходный файл ``main.c`` и выберите Создать тест > Создать простой тест C. |
| image::images/c-unit-mainc-new-simple-test.png[] |
| |
| [start=2] |
| . В окне 'Выбор элементов' мастера создания тестов установите флажок напротив функции ``main`` и нажмите 'Далее'. |
| image::images/c-unit-mainc-new-simple-test-select.png[] |
| |
| [start=3] |
| . В полях 'Имя' и 'Местоположение' оставьте заданное по умолчанию имя New C Simple Test и нажмите 'Готово'. |
| |
| В структуре папки 'Файлы тестов' появляется новый узел New C Simple Test. |
| |
| |
| [start=4] |
| . Разверните структуру папки New C Simple. Эта папка должна содержать файл `newsimpletest.c`. Откройте этот файл в редакторе исходного кода. |
| image::images/c-unit-mainc-new-simple-test-folder.png[] |
| |
| [start=5] |
| . Аналогично тесту CUnit файл `newsimpletest.c` содержит автоматически генерируемую тестовую функцию `testFactorial` для функции `factorial()` основного файла `main.c`. |
| image::images/c-unit-mainc-new-simple-test-code.png[] |
| |
| Оператор ``if`` должен проверять условие. Если условие имеет значение true, тест считается непройденным. Маркер ``%%TEST_FAILED%%`` инициирует отображение графического обозначения неуспешного выполнения тестов в окне 'Результаты теста'. Оператор ``if`` в созданном тесте задает для условия значение true (1), поэтому при запуске этого теста без предварительного редактирования он всегда будет неуспешным. |
| |
| Другие маркеры в функции ``main`` , такие как ``%%TEST_STARTED%%`` и ``%%TEST_FINISHED%%`` упрощают чтение выходных данных в командной строке при выполнении тестов. |
| |
| Параметр ``time=0`` используется для добавления в тест измерения времени. |
| |
| Параметр ``message`` позволяет выводить сообщение о неуспешном результате теста. |
| |
| |
| [start=6] |
| . Выполните тест. В окне 'Результаты теста' должен отобразиться неуспешный результат. |
| |
| Теперь необходимо отредактировать файл теста, чтобы посмотреть успешное выполнение тестов. |
| |
| |
| == Изменение простого теста C |
| |
| 1. Скопируйте и вставьте новую функцию под функцией `testFactorial`. |
| Новая функция имеет вид: |
| |
| [source,java] |
| ---- |
| |
| void testNew() { |
| int arg = 8; |
| long result = factorial(arg); |
| if(result != 40320) { |
| printf("%%TEST_FAILED%% time=0 testname=testNew (newsimpletest) message=Error calculating %d factorial.\n", arg); |
| } |
| } |
| ---- |
| |
| Функцию `main` также необходимо изменить, чтобы она могла вызывать новую тестовую функцию. |
| |
| |
| [start=2] |
| . Скопируйте следующие строки в функции `main`: |
| |
| [source,java] |
| ---- |
| |
| printf("%%TEST_STARTED%% testFactorial (newsimpletest)\n"); |
| testFactorial(); |
| printf("%%TEST_FINISHED%% time=0 testFactorial (newsimpletest)\n"); |
| |
| ---- |
| |
| [start=3] |
| . Вставьте скопированные строки сразу под исходными и измените в скопированных строках имя `testFactorial` на `testNew`. Во всем файле необходимо изменить три вхождения. |
| Готовый файл `newsimpletest.c` выглядит следующим образом: |
| |
| [source,c] |
| ---- |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| /* |
| * Simple C Test Suite |
| */ |
| |
| long factorial(int arg); |
| |
| void testFactorial() { |
| int arg; |
| long result = factorial(arg); |
| if(1 /*check result*/) { |
| printf("%%TEST_FAILED%% time=0 testname=testFactorial (newsimpletest) message=When value is 1 this statement is executed.\n"); |
| } |
| } |
| |
| |
| void testNew() { |
| int arg = 8; |
| long result = factorial(arg); |
| if(result != 40320) { |
| printf("%%TEST_FAILED%% time=0 testname=testNew (newsimpletest) message=Error calculating %d factorial.\n", arg); |
| } |
| } |
| |
| |
| int main(int argc, char** argv) { |
| printf("%%SUITE_STARTING%% newsimpletest\n"); |
| printf("%%SUITE_STARTED%%\n"); |
| |
| printf("%%TEST_STARTED%% testFactorial (newsimpletest)\n"); |
| testFactorial(); |
| printf("%%TEST_FINISHED%% time=0 testFactorial (newsimpletest)\n"); |
| |
| printf("%%TEST_STARTED%% testNew (newsimpletest)\n"); |
| testNew(); |
| printf("%%TEST_FINISHED%% time=0 testNew (newsimpletest)\n"); |
| |
| printf("%%SUITE_FINISHED%% time=0\n"); |
| |
| return (EXIT_SUCCESS); |
| } |
| |
| |
| ---- |
| |
| [start=4] |
| . В окне 'Проекты' запустите тест, щелкнув правой кнопкой мыши папку New C Simple Test и выбрав 'Тест'. |
| В окне 'Результаты теста' должны отобразиться следующие данные: |
| image::images/c-unit-simpletest-results.png[] |
| |
| Если вы не уверены, что тест testNew пройден, нажмите значок в виде зеленой галочки в левой части окна 'Результаты теста', чтобы просмотреть все пройденные тесты. |
| |
| Маркер %%TEST_FAILED%% инициирует отображение неуспешного результата теста в окне 'Результаты теста'. Оператор if должен проверять условие. Если это условие не имеет значения true, результат теста будет неуспешным. |
| |
| Маркер %%SUITE_STARTING%% и другие подобные маркеры не выводятся в окне результатов в среде IDE. Эти маркеры используются для консольного вывода. |
| |
| |
| == Выполнение тестов в интерфейсе командной строки |
| |
| Тесты можно создавать в командной строке за пределами IDE с помощью команды `make build-tests` и выполнять с помощью команды `make test`. Если проект находится в каталоге ~/NetBeansProjects/Cpp_Application__x_ в системе Linux, сборка и выполнение тестов будут выполняться, как показано ниже. |
| |
| 1. Откройте окно терминала в IDE (выберите Окно > Результаты и нажмите кнопку 'Терминал' в левой части окна 'Результаты'). В рабочем каталоге текущего проекта откроется окно терминала. |
| 2. В окне терминала введите команды, выделенные полужирным шрифтом: |
| |
| [source,java] |
| ---- |
| |
| *make test* |
| ---- |
| |
| Результаты сборки и выполнения теста должны выглядеть примерно так. Примечание. Некоторые результаты команды `make` удалены. |
| |
| |
| [source,java] |
| ---- |
| |
| "make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf |
| make[1]: Entering directory `/home/tester/NetBeansProjects/CppApplication_1' |
| "make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/cppapplication_1 |
| make[2]: Entering directory `/home/tester/NetBeansProjects/CppApplication_1' |
| make[2]: `dist/Debug/GNU-Linux-x86/cppapplication_1' is up to date. |
| ... |
| |
| CUnit - A Unit testing framework for C - Version 2.1-2 |
| http://cunit.sourceforge.net/ |
| |
| |
| Suite: mycunittest |
| Test: test1 ... passed |
| Test: test2 ... FAILED |
| 1. tests/mycunittest.c:33 - 2*2 == 5 |
| Test: test3 ... passed |
| |
| --Run Summary: Type Total Ran Passed Failed |
| suites 1 1 n/a 0 |
| tests 3 3 2 1 |
| asserts 3 3 2 1 |
| %SUITE_STARTING% newsimpletest |
| %SUITE_STARTED% |
| %TEST_STARTED% testFactorial (newsimpletest) |
| %TEST_FAILED% time=0 testname=testFactorial (newsimpletest) message=error message sample |
| %TEST_FINISHED% time=0 testFactorial (newsimpletest) |
| %SUITE_FINISHED% time=0 |
| |
| |
| CUnit - A Unit testing framework for C - Version 2.1-2 |
| http://cunit.sourceforge.net/ |
| |
| |
| Suite: newcunittest |
| Test: testFactorial ... passed |
| |
| --Run Summary: Type Total Ran Passed Failed |
| suites 1 1 n/a 0 |
| tests 1 1 1 0 |
| asserts 1 1 1 0 |
| make[1]: Leaving directory `/home/tester/NetBeansProjects/CppApplication_1' |
| |
| |
| ---- |
| |
| |
| == Добавление поддержки других инфраструктур тестирования |
| |
| Чтобы добавить поддержку предпочтительной инфраструктуры тестирования C/C++, необходимо создать модуль NetBeans. См. документ для разработчиков NetBeans, link:http://wiki.netbeans.org/CND69UnitTestsPluginTutotial[+Руководство по созданию подключаемого модуля тестирования C/C+++] в статье о NetBeans. |
| |
| link:mailto:users@cnd.netbeans.org?subject=Feedback:%20Adding%20Unit%20Tests%20to%20a%20C/C++%20Project%20-%20NetBeans%20IDE%207.4%20Tutorial[+Отправить отзыв по этому учебному курсу+] |
| |
| |