sample project
This commit is contained in:
parent
3bee310d94
commit
419ce38d64
|
@ -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)
|
|
@ -0,0 +1,5 @@
|
||||||
|
[requires]
|
||||||
|
gtest/cci.20210126
|
||||||
|
|
||||||
|
[generators]
|
||||||
|
cmake
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "algos.h"
|
||||||
|
|
||||||
|
void swap(char* a, char* b) {
|
||||||
|
*a ^= *b;
|
||||||
|
*b ^= *a;
|
||||||
|
*a ^= *b;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef algos
|
||||||
|
#define algos
|
||||||
|
|
||||||
|
void swap(char* a, char* b);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,135 @@
|
||||||
|
# Базовая настройка тестирования.
|
||||||
|
## Используемые технологии
|
||||||
|
- C++11
|
||||||
|
- CMake
|
||||||
|
- GTest (Google test framework for C++)
|
||||||
|
- Conan
|
||||||
|
## Структура проекта
|
||||||
|
- Project/
|
||||||
|
-- build/
|
||||||
|
--- <caches>
|
||||||
|
--- 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 <stdio.h>
|
||||||
|
#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 <gtest/gtest.h>
|
||||||
|
#include <iostream>
|
||||||
|
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` (запустить программу)
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* main.c
|
||||||
|
*
|
||||||
|
* Created by Ivan I. Ovchinnikov
|
||||||
|
* at day 223 of year 2021 (авг 11), 09:37
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <iostream>
|
||||||
|
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);
|
||||||
|
}
|
Loading…
Reference in New Issue