вторник, 15 апреля 2014 г.

Использование Google test framework для тестирования кода Visual C++ (Visual Studio 2012)

После прочтения книг по TDD и внедрения этой методики в мои проекты на C#, я решил разобраться как с этим дела обстоят в Visual С++. Тем более, что для тестирования математических расчетов я пользовался ручкой и бумагой, что было очень утомительно и трудозатратно. Посмотрев материалы по тестированию кода на MSDN, мой выбор пал на Google test framework из-за нескольких причин:  
  • простота установки;
  • интуитивно понятный язык написания тестов.
Так как для проекта мне нужно было тестировать только математические вычисления (не нужно было делать mock объекты и т.д.) функционал Google test меня полностью устраивал. Итак, установка:
компилируем google test в статическую библиотеку, для этого добавляем в наше решение с тестируемым проектом новый проект:


  • затем в свойствах проекта добавляем include path:

  • после этого добавляем строчку _VARIADIC_MAX=10 в определения препроцессора, это необходимо сделать из-за особенностей Visual Studio 12 и выше:
  • компилируем проект, если все без ошибок, тогда переходим к следующему шагу;
  • добавляем непосредственно проект теста (обычное консольное приложение);
  • затем в свойствах проекта добавляем include path(только в отличие от аналогичного шага в проекте googleTest тут мы еще добавляем папку с тестируемым проектом):
  • после этого добавляем строчку _VARIADIC_MAX=10 в определения препроцессора (полностью все аналогично проекту googleTest );
  • добавляем ссылки на два наших проекта:
  • все, теперь можно писать тесты:

#include "gtest/gtest.h"
#include "Date_Time.h"
#include "Date_Time.cpp"
#include "Atmosphera.h"
#include "Atmosphera.cpp"
#include "OrbitElements.h"
#include "OrbitElements.cpp"
#include "Vector.h"
#include "Vector.cpp"
#include "Spacecraft.h"
#include "Spacecraft.cpp"
#include "Soyuz.h"
#include "Soyuz.cpp"

class TestVector : public ::testing::Test
{
protected:
 void SetUp()
 {
  Vector::f = 110;
  Vector::ap = 16;
  Date_Time DataTime(2011,10,05);
  vect = new Vector(1816, 70500, -4887.4796260, -1988.8661830, 4242.4879740,
                    -0.536599240, -6.3971388400, -3.612259210, 0.04158185, DataTime);
  soyuz = new Soyuz(*vect, 6746.0, 1158.0, 2886.0, 300.0, 302.0, 
                  115.20, 0, 0.385080, -0.036830, 0.0, 0.008234, 49.40, 273.00, 200, 6, 1, 2);
 }
 void TearDown()
 {
  delete vect;
  delete soyuz;  
 }
 Vector* vect;
 Soyuz* soyuz;

};

TEST_F(TestVector, z_eq_zero)
{

 vect->Prognoz((unsigned int)1817);
 double z = vect->operator[](3);
 ASSERT_NEAR(0, z, 0.001)<< "=========================================";
}

TEST_F(TestVector, soyuz_prognoz_success)
{
 soyuz->Prognoz((unsigned int) 1817);
 SUCCEED();
}

int maint (int argc, char *argv[])
{
 ::testing::InitGoogleTest(&argc, argv);
 return RUN_ALL_TESTS();
}
Результат:
Более подробно про синтаксис Google test framework написано в этой статье: http://habrahabr.ru/post/119090/

Комментариев нет:

Отправить комментарий