Google Test + Gcover
Total Page:16
File Type:pdf, Size:1020Kb
Google Test + gcover Google Test + gcover Una lista de recetas J. Daniel Garcia Grupo ARCOS Universidad Carlos III de Madrid 19 de noviembre de 2016 cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/68 Google Test + gcover Aviso c Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivar 4.0 Internacional. b Debes dar crédito en la obra en la forma especificada por el autor o licenciante. e El licenciante permite copiar, distribuir y comunicar pú- blicamente la obra. A cambio, esta obra no puede ser utilizada con fines comerciales — a menos que se ob- tenga el permiso expreso del licenciante. d El licenciante permite copiar, distribuir, transmitir y co- municar públicamente solamente copias inalteradas de la obra – no obras derivadas basadas en ella. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 2/68 Google Test + gcover ARCOS@uc3m UC3M: Una universidad joven, internacional y orientada a la investigación. ARCOS: Un grupo de investigación aplicada. Líneas: Computación de altas prestaciones, Big data, Sistemas Ciberfísicos, y Modelos de programación para la mejora de las aplicaciones Mejorando las aplicaciones: REPARA: Reengineering and Enabling Performance and poweR of Applications. Financiado por Comisión Europea (FP7). RePhrase: REfactoring Parallel Heterogeneous Resource Aware Applications. Financiado por Comisión Europea (H2020). Normalización: ISO/IEC JTC/SC22/WG21. Comité ISO C++. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 3/68 Google Test + gcover ¿Te interesa C++? cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 4/68 Google Test + gcover Pruebas básicas 1 Pruebas básicas 2 Determinando la cobertura 3 Más pruebas unitarias cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 5/68 Google Test + gcover Pruebas básicas Introducción 1 Pruebas básicas Introducción Ejemplo 1: vectint Usando CMake Mis primeras pruebas cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 6/68 Google Test + gcover Pruebas básicas Introducción Ejemplos Puedes obtener todos los ejemplos en: https://github.com/jdgarciauc3m/gtesttalk cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 7/68 Google Test + gcover Pruebas básicas Introducción ¿Qué es Google Test? Es una biblioteca para realizar pruebas unitarias en C++. Características: Un framework tipo xUnit. Descubrimiento de tests. Variedad de aserciones. Aserciones definidas por el usuario. Death tests. Fallos fatales y no fatales. Tests parametrizados por valor. Tests parametrizados por tipo. Múltiples opciones de ejecución. Generación de informes en XML. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 8/68 Google Test + gcover Pruebas básicas Introducción Uso Plataformas: Linux Mac OS X Windows Cygwin MinGW Windows Mobile Symbian Algunos proyectos que lo usan: Proyecto Chromium. Familia de compiladores LLVM. Protocol Buffers. OpenCV. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 9/68 Google Test + gcover Pruebas básicas Introducción Principios 1 Las pruebas deberían ser independientes y repetibles. 2 Las pruebas deberían poder estar bien estructuradas. 3 Las pruebas deberían ser portables y reusables. 4 Ante un fallo en una prueba se debería poder obtener la máxima información. 5 No debería ser necesario escribir código innecesario para pruebas. 6 Las pruebas deberían ser rápidas. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/68 Google Test + gcover Pruebas básicas Introducción ¿Como obtener GTest? Repositorio en GitHub. https://github.com/google/googletest Se puede obtener como paquete (Ubuntu/Linux). Paquete: libgtest-dev. Importante: No instala binarios, solamente fuentes. $ apt-get install libgtest-dev $ cd /usr/src/gtest $ sudo mkdir build $ cd build $ sudo cmake.. $ sudo make $ sudo cp *.a/usr/lib cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 11/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint 1 Pruebas básicas Introducción Ejemplo 1: vectint Usando CMake Mis primeras pruebas cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 12/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Un vector de enteros Comencemos con una clase sencilla Un vector de enteros con comportamiento mínimo: Un vector de enteros con tamaño (size()) y capacidad (capacity()). Versión mínima que soporte copia y movimiento. Acceso operator[]. Modificación de capacidad (reserve()). Modificación de tamaño (resize()). cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 13/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Interfaz include/vectint.h #ifndef DCL_VECTINT_H #define DCL_VECTINT_H #include <memory> namespace dcl{ // Dummy Container Library class vectint{ public: vectint(): capacity_{0}, size_{0}, buffer_{ nullptr} {} vectint( int n); vectint( const vectint&v); vectint& operator=(const vectint&v); cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 14/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Interfaz include/vectint.h int & operator[](int i){ return buffer_[i];} int operator[](int i) const { return buffer_[i];} int capacity() const { return capacity_;} int size() const { return size_; } void reserve(int n); void resize( int n); friend std:: ostream& operator<<(std::ostream& os, const vectint&v); cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 15/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Interfaz include/vectint.h private: int capacity_; int size_; std:: unique_ptr< int[]> buffer_; }; } // end dcl namespace #endif cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Implementación src/vectint.cpp #include "vectint.h" #include <algorithm> #include <iterator> namespace dcl{ vectint :: vectint( int n) : capacity_{n}, size_{n}, buffer_{std:: make_unique< int[]>(n)} {} cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 17/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Implementación src/vectint.cpp vectint:: vectint( const vectint&v) : capacity_{v.capacity_}, size_{v.size_}, buffer_{std:: make_unique< int[]>(size_)} { std:: copy_n(v.buffer_.get(),v.size_, buffer_.get()); } vectint& vectint:: operator=(const vectint&v){ buffer_= std:: make_unique< int[]>(v.size_); capacity_=v.capacity_; size_=v.size_; std:: copy_n(v.buffer_.get(),v.size_, buffer_.get()); return ∗this; } cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Implementación src/vectint.cpp void vectint:: resize( int n) { if (n>capacity_) reserve(n); if (n>size_){ std:: fill_n(buffer_.get()+size_, buffer_.get()+n, 0); } size_=n; } void vectint:: reserve( int n) { if (n <= capacity_) return; auto buf= std:: make_unique< int[]>(n); std:: copy_n(buffer_.get(), size_, buf.get()); capacity_=n; } cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 19/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Implementación src/vectint.cpp std:: ostream& operator<<(std::ostream& os, const vectint&v) { std:: copy(v.buffer_.get(),v.buffer_.get()+v.size_, std:: ostream_iterator< int>{os,""}); return os; } } // Namespace cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/68 Google Test + gcover Pruebas básicas Ejemplo 1: vectint Programa de prueba samples/main1.cpp samples/main1.cpp #include "vectint.h" #include <iostream> cout <<"v:" <<v << endl; cout <<"w:" <<w << endl; int main() { using namespace std; swap(v,w); using namespace dcl; cout << endl <<"Swap" << endl; vectintv{5}; cout <<"v:" <<v << endl; v[2] = 5; cout <<"w:" <<w << endl; vectintw{v}; return 0; w[1] = 3; } w.resize(4); cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 21/68 Google Test + gcover Pruebas básicas Usando CMake 1 Pruebas básicas Introducción Ejemplo 1: vectint Usando CMake Mis primeras pruebas cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/68 Google Test + gcover Pruebas básicas Usando CMake ¿Qué es CMake Es un conjunto de herramientas que permite construir, probar y empaquetar software. A partir de un proyecto CMake se pueden generar scripts de construcción para cada plataforma. Generadores: Makefiles (Unix, Borland, MinGW, NMake). Ninja. Visual Studio. Xcode. Varios IDE: CodeBlocks, CodeLite, EclipseCDT, KDevelop. IDE con soporte nativo: CLion, Visual Studio 2017 RC1. cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 23/68 Google Test + gcover Pruebas básicas Usando CMake CMake raíz CMakeLists.txt cmake_minimum_required(VERSION 3.0) set(PROJECT_NAME_STR vectint) project(${PROJECT_NAME_STR}) # Local project include directory include_directories("${CMAKE_SOURCE_DIR}/include") # Build binary directory set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") set(WARNFLAGS "-Wall -Wextra -Wno-deprecated -Werror -pedantic -pedantic-errors") if("${CMAKE_CXX_COMPILER_ID}"