J'ai essayé d'utiliser google test et CMake en C

Voici un exemple à construire avec cmake à l'aide de googletest pour C.

Un exemple est le livre Test-Driven Development for Embedded C / [Embedded programmation with test-driven development](https: / Il peut être utilisé comme squelette pour le pilote de LED à /www.oreilly.co.jp/books/9784873116143/).

Structure du répertoire

build/Répertoire pour la construction
ext/
ext/code source googletest googletest
inc/entête
src/La source
test/tester

Préparation au test Google

Initialisez git et obtenez google test.

% git init
% mkdir build ext inc src test
% cd ext
% git submodule add https://github.com/google/googletest.git

Créez un fichier cmake pour googletest.

CMakeLists.txt


project("led driver")
cmake_minimum_required(VERSION 2.8)
add_subdirectory(ext)

ext/CMakeLists.txt


option(BUILD_GTEST "Builds the googletest subproject" ON)
option(BUILD_GMOCK "Builds the googlemock subproject" OFF)
add_subdirectory(googletest)

Construisez dans le répertoire de construction.

$ cd build
$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.6")
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sekine/github/leddriver2/build
$ make
Scanning dependencies of target gtest
[ 50%] Building CXX object ext/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
Linking CXX static library libgtest.a
[ 50%] Built target gtest
Scanning dependencies of target gtest_main
[100%] Building CXX object ext/googletest/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
Linking CXX static library libgtest_main.a
[100%] Built target gtest_main

Git engage le travail jusqu'à présent.

$ cd ..
$ git add CMakeLists.txt ext/CMakeLists.txt
$ git commit -m "setup googletest."

Exemple de code source

inc/LedDriver.h


#ifndef LEDDRIVER_H
#define LEDDRIVER_H

void LedDriver_Create(uint16_t *address);
void LedDriver_Destroy(void);
void LedDriver_TurnOn(int ledNumber);
void LedDriver_TurnOff(int ledNumber);

#endif

src/LedDriver.c


#include <stdint.h>
#include "LedDriver.h"

static uint16_t *ledsAddress;

void LedDriver_Create(uint16_t *address)
{
    ledsAddress = address;
    *ledsAddress = 0;
}

void LedDriver_Destroy(void)
{
}

void LedDriver_TurnOn(int ledNumber)
{
    *ledsAddress = 1;
}

void LedDriver_TurnOff(int ledNumber)
{
    *ledsAddress = 0;
}

test/LedDriverTest.cpp


#include <stdint.h>
#include "gtest/gtest.h"
extern "C"
{
#include "LedDriver.h"
}

uint16_t virtualleds;

class LedDriver : public ::testing::Test
{
protected:
    virtual void SetUp()
    {
        LedDriver_Create(&virtualleds);
    }
    virtual void TearDown()
    {
        LedDriver_Destroy();
    }
};

TEST_F(LedDriver, LedsOffAfterCreate)
{
    uint16_t virtualleds1 = 0xffff;
    LedDriver_Create(&virtualleds1);
    ASSERT_EQ(0, virtualleds1);
}

TEST_F(LedDriver, TurnOnLedOne)
{
    LedDriver_TurnOn(1);
    ASSERT_EQ(1, virtualleds);
}

TEST_F(LedDriver, TurnOffLedOne)
{
    LedDriver_TurnOn(1);
    LedDriver_TurnOff(1);
    ASSERT_EQ(0, virtualleds);
}

Paramètres CMake.

CMakeLists.txt


project("led driver")

cmake_minimum_required(VERSION 2.8)

add_subdirectory(ext)
add_subdirectory(src)
add_subdirectory(test)

ADD_CUSTOM_TARGET(check test/led_driver_test_app)

src/CMakeLists.txt


add_library(LedDriver LedDriver.c)
target_include_directories(LedDriver PUBLIC ../inc)

test/CMakeLists.txt


add_executable(led_driver_test_app
    LedDriverTest.cpp)
target_link_libraries(led_driver_test_app
    gtest
    gtest_main
    LedDriver)

Ceci est un exemple d'exécution.

$ cd build
$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sekine/github/leddriver2/build
$ make
[ 25%] Built target gtest
[ 50%] Built target gtest_main
[ 75%] Built target LedDriver
[100%] Built target led_driver_test_app
$ make check
Running main() from gtest_main.cc
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from LedDriver
[ RUN      ] LedDriver.LedsOffAfterCreate
[       OK ] LedDriver.LedsOffAfterCreate (0 ms)
[ RUN      ] LedDriver.TurnOnLedOne
[       OK ] LedDriver.TurnOnLedOne (0 ms)
[ RUN      ] LedDriver.TurnOffLedOne
[       OK ] LedDriver.TurnOffLedOne (0 ms)
[----------] 3 tests from LedDriver (0 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (1 ms total)
[  PASSED  ] 3 tests.
Built target check
$

Recommended Posts

J'ai essayé d'utiliser google test et CMake en C
J'ai essayé d'utiliser l'API de reconnaissance vocale docomo et l'API Google Speech en Java
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de programmer le test du chi carré en Python et Java.
Comment utiliser Google Test en langage C
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 2: J'ai essayé d'utiliser PyEZ
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé de mettre à jour le calendrier Google avec des rendez-vous CSV à l'aide de Python et de l'API Google
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 1: Aperçu
J'ai essayé le web scraping en utilisant python et sélénium
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé d'ajouter un module Python 3 en C
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé d'utiliser Google Translate à partir de Python et c'était trop facile
J'ai essayé d'utiliser TradeWave (commerce du système BitCoin en Python)
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé l'extension C de Python
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
J'ai essayé de [gratter] des images de mode et des phrases de texte avec Python.
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
[Python scraping] J'ai essayé la recherche Google Top10 en utilisant Beautifulsoup et sélénium
J'ai créé une classe en Python et essayé de taper du canard
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'utiliser Rotrics Dex Arm # 2
Test de module multi-instance en langage C