Google Test + Gcover

Google Test + Gcover

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}"

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    68 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us