From 419ce38d649b55e96c219c2d247d0afa47ac973c Mon Sep 17 00:00:00 2001 From: "Ivan I. Ovchinnikov" Date: Mon, 16 Aug 2021 14:24:21 +0100 Subject: [PATCH] sample project --- CMakeLists.txt | 19 +++++++ conanfile.txt | 5 ++ includes/algos.c | 7 +++ includes/algos.h | 6 +++ readme.md | 135 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 21 ++++++++ tests/test.cpp | 21 ++++++++ 7 files changed, 214 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 conanfile.txt create mode 100644 includes/algos.c create mode 100644 includes/algos.h create mode 100644 readme.md create mode 100644 src/main.c create mode 100644 tests/test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e2d4b3a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.5) +project(BasicC) +enable_testing() + +# GoogleTest requires at least C++11 +set(CMAKE_CXX_STANDARD 11) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +add_executable(check tests/test.cpp includes/algos.h includes/algos.c) +target_link_libraries(check ${CONAN_LIBS} gtest_main) + +include(GoogleTest) +gtest_discover_tests(check) + +# add_test(NAME check WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin COMMAND check) + +add_executable(prog src/main.c includes/algos.h includes/algos.c) diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..b9d4a73 --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,5 @@ +[requires] +gtest/cci.20210126 + +[generators] +cmake diff --git a/includes/algos.c b/includes/algos.c new file mode 100644 index 0000000..d66505b --- /dev/null +++ b/includes/algos.c @@ -0,0 +1,7 @@ +#include "algos.h" + +void swap(char* a, char* b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; +} diff --git a/includes/algos.h b/includes/algos.h new file mode 100644 index 0000000..4984d94 --- /dev/null +++ b/includes/algos.h @@ -0,0 +1,6 @@ +#ifndef algos +#define algos + +void swap(char* a, char* b); + +#endif diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..5f68de8 --- /dev/null +++ b/readme.md @@ -0,0 +1,135 @@ +# Базовая настройка тестирования. +## Используемые технологии +- C++11 +- CMake +- GTest (Google test framework for C++) +- Conan +## Структура проекта +- Project/ +-- build/ +--- +--- bin/ +---- program +-- include/ +--- algo.h +--- algo.c +-- src/ +--- main.c +-- tests/ +--- test.cpp +- conanfile.txt +- CMakeLists.txt +## conanfile +Для подключения тестового фреймворка используется система менеджмента артефактов Conan, которая позволяет осуществлять подключение заранее скомпилированных библиотек без необходимости их установки на ОС разработчика. Подключение осуществляется описанием корректных настроек в файле conanfile.txt: +``` +[requires] +gtest/cci.20210126 + +[generators] +cmake +``` +Таким образом, будет подключена последняя на момент написания данного документа сборка фреймворка тестирования. +## sources +Исходные коды проекта разделены на две части: собственно исходники и включаемые файлы. Исходники - это код самой программы, использующей алгоритмы, описанные во включаемых заголовочных файлах. +### src/main.c +В файле с программой подключается файл с тестируемым алгоритмом, который используется в коде программы: +```C++ +#include +#include "../include/algo.h" + +void swap(char* a, char* b); + +int main(int argc, const char** argv) { + char a = -11; + char b = 15; + printf("a=%d; b=%d\n", a, b); + swap(&a, &b); + printf("a=%d; b=%d\n", a, b); + return 0; +} +``` +Выводом данного кода будет: +``` +user@debian: ./build/bin/prog +a=-11; b=15 +a=15; b=-11 +``` +### include/algo.h +Подключаемый в код программ и тестов заголовочный файл должен содержать только одно объявление функций: +```C++ +#ifndef algos +#define algos + +void swap(char* a, char* b); + +#endif +``` +### include/algo.c +файл с реализацией лаконичен: +```C++ +#include "algos.h" + +void swap(char* a, char* b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; +} +``` +## tests +Тесты описываются в отдельном файле, из которого будет собран бинарный файл. Важно, что фреймворк работает только с С++11 или новее, поэтому использовать более старый стандарт не получится, а исходные файлы на С нужно включать в секции `extern "C"`. Каждый тест описывается в специальной макрофункции `TEST` в параметрах которой указывается детальное название теста. В данном примере будет использоваться только один ассерт - `EXPECT_EQ`, который проверяет значение переданной первым аргументом переменной на равенство второму аргументу +### tests/test.cpp +```C++ +#include +#include +extern "C" { +#include "../includes/algos.h" +} + +TEST(HelloTest, WeTestHere) { + char a = -11; + char b = 15; + swap(&a, &b); + EXPECT_EQ(a, 15); + EXPECT_EQ(b, -11); +} + +TEST(AnotherTest, WeTestThere) { + char a = -11; + char b = -11; + swap(&a, &b); + EXPECT_EQ(a, -11); + EXPECT_EQ(b, -11); +} +``` +## CMake +Сборщик CMake описывает правила, по которым будет сформировал Makefile для дальнейшей сборки утилитой GNU Automake или Ninja. В файл настроек необходимо включить строки подключения артефактов Conan, поскольку мы используем готовую сборку фреймворка тестирования, а не устанавливаем его на компьютер. Также в скрипте указывается два исполняемых файла - для сборки программы и тестов, соответственно. +``` +cmake_minimum_required(VERSION 3.5) +project(BasicC) +enable_testing() + +# GoogleTest requires at least C++11 +set(CMAKE_CXX_STANDARD 11) + +# conan dependencies +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup() + +# test executable +add_executable(check tests/test.cpp include/algo.h include/algo.c) +target_link_libraries(check ${CONAN_LIBS} gtest_main) + +# let make know we use tests +include(GoogleTest) +gtest_discover_tests(check) + +# application executable +add_executable(prog src/main.c include/algo.h include/algo.c) +``` +## Запуск +Запуск осуществляется из папки `build`, соответственно: +- `conan install ..` (установить зависимости conan, описанные в файле папкой выше) +- `cmake ..` (подготовить Makefile по правилам из файла папкой выше) +- `make` (собрать проект) +- `ctest` (запустить тесты) +- `./bin/prog` (запустить программу) diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..8fba537 --- /dev/null +++ b/src/main.c @@ -0,0 +1,21 @@ +/* + * main.c + * + * Created by Ivan I. Ovchinnikov + * at day 223 of year 2021 (авг 11), 09:37 + */ +#include +#include +#include "../includes/algos.h" + +void swap(char* a, char* b); + +int main(int argc, const char** argv) { + printf("Hello, World\n"); + char a = -11; + char b = 15; + printf("a=%d; b=%d\n", a, b); + swap(&a, &b); + printf("a=%d; b=%d\n", a, b); + return 0; +} diff --git a/tests/test.cpp b/tests/test.cpp new file mode 100644 index 0000000..cbf3f15 --- /dev/null +++ b/tests/test.cpp @@ -0,0 +1,21 @@ +#include +#include +extern "C" { +#include "../includes/algos.h" +} + +TEST(HelloTest, WeTestHere) { + char a = -11; + char b = 15; + swap(&a, &b); + EXPECT_EQ(a, 15); + EXPECT_EQ(b, -11); +} + +TEST(AnotherTest, WeTestThere) { + char a = -11; + char b = -11; + swap(&a, &b); + EXPECT_EQ(a, -11); + EXPECT_EQ(b, -11); +}