SlideShare a Scribd company logo
  Модульное тестирование и Google Mock Владимир Лосев Google [email_address] Yet Another Conference 2011 Москва, 19 сентября 1
Agenda Почему Google Mock? Как им пользоваться Примеры 2
Хочешь жить без багов? Спроси меня как! Ошибки снижают производительность ...Если не чинить их быстро Нужны автоматизированные тесты Быстрые Надёжные Точные Тестируем по одному модулю за раз 3
Изоляция модулей В программах на C++ абстрагируем взаимодействия между объектами через интерфейсы Используем тестовые двойники (stub-, mock-объекты, и т.д.) для имитации поведения соседей Используем метод внедрения зависимостей для добавления двойников 4
Внедрение зависимостей class SocketInterface {  public:    virtual int Read(void* buffer, int size) = 0; }; class Server {   public:    Server(SocketInterface* socket) : socket_(socket) {}    bool ReadRequest (string* result) {      char buffer[BUFFER_SIZE];      int bytes_read;      while ((bytes_read =  socket->Read (buffer,                                        BUFFER_SIZE)) > 0)        result->append(buffer, buffer + bytes_read);      return result->size() > 0;    }   private:    SocketInterface* const socket_; }; 5
class MockSocket : public SocketInterface {   public:    MockSocket(const char* buffer_to_read, int buffer_size)        : buffer_to_read_(buffer_to_read_), size_(buffer_size),          bytes_read_(0) {    }    virtual int Read (void* buffer, int n) {      int actual_read = std::min(n, size_ - bytes_read_);      memcpy(buffer, buffer_to_read_ + bytes_read_, actual_read);      bytes_read_ += actual_read;      return actual_read;    }    int bytes_read() const { return bytes_read_; } private:    const char* buffer_to_read_;    int size_;    int bytes_read_; }; Mock-объект, написанный вручную 6
Тест с таким объектом TEST(Server_ReadRequest, ReadsCompleteRequest) {    string data("1234567890123456789012345");    MockSocket mock_socket(data.data(), data.size());    Server server(&mock_socket);    string buffer;    EXPECT_TRUE(server.ReadRequest(&buffer));    EXPECT_EQ(data, buffer); } Проверяет только результат, а не взаимодействие 7
Google Mock Google C++ Mocking Framework/Google Mock/gMock Написан в 2007 г. Жаньонгом Ваном (Zhanyong Wan) Код открыт в 2008 г. Лежит на  code.google.com/p/googlemock Используется во многих проектах с открытым кодом (Chromium, LLVM) 8
Нужна библиотека для написания тестов Хорошо интегрирован с Google Test Лежит на  http://code.google.com/p/googletest Позволяет легко и быстро писать тесты:    #include <gtest/gtest.h>    TEST(MathTest, ArithmeticsStillWorks) {      EXPECT_EQ(4, 2 * 2);    } 9
Mock-объект на Google Mock  class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); }; 10
Определение ожиданий  class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); };    EXPECT_CALL(mock_socket, Read(…)) 11
Описние параметров class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); };    EXPECT_CALL(mock_socket, Read(_, Ge(25))) 12
Описание количества вызовов  class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); };    EXPECT_CALL(mock_socket, Read(_, Ge(25)))        .Times(2) 13
Описание поведения class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); };    string data(&quot;1234567890123456789012345&quot;);    EXPECT_CALL(mock_socket, Read(_, Ge(25)))        .Times(2)        .WillOnce(DoAll(CopyData(data),                        Return(data.size())))        .WillOnce(Return(0)); 14
Полный тест class MockSocket : public SocketInterface {   public:    MOCK_METHOD2(Read, int(void* buffer, int n)); }; TEST(Server_ReadRequest, ReadsCompleteRequest) {    MockSocket mock_socket;    string data(&quot;1234567890123456789012345&quot;);    EXPECT_CALL(mock_socket, Read(_, Ge(25)))        .Times(2)        .WillOnce(DoAll(CopyData(data),                        Return(data.size())))        .WillOnce(Return(0));    Server server(&mock_socket);    string result;    EXPECT_TRUE(server.ReadRequest(&result));    EXPECT_EQ(data, result); } 15
Предикаты ...на стероидах Проверяют условия Описывают эти условия Предоставляют объяснения Примеры: Простые:  42, _, Gt(32), NotNull() Составные:  AllOf(m1, ...), AnyOf(m1, ...), Not(matcher) Для контейнеров:  Contains(matcher), Each(matcher) ElementsAre(e1, ..., en), ElementsAreArray(arr) Можно определять собственные 16
Количество вызовов Указывается в методе Times():    EXPECT_CALL(mock, Foo()). Times(cardinality) ; Можно указывать: 2 Exactly(2) AtLeast(3) AtMost(5) Between(3, 4) 17
Порядок По умолчанию порядок вызовов не задаётся Можно указывать полный или частичный порядок Отсутствие циклов гаранировано {    InSequence s;    EXPECT_CALL(mock, A());    EXPECT_CALL(mock, B()); } Sequence s1, s2; EXPECT_CALL(mock, A()).InSequence(s1, s2); EXPECT_CALL(mock, B()).InSequence(s1); EXPECT_CALL(mock, C()).InSequence(s2); 18
Действия Определяются в методах WillOnce() и WillRepeatedly()  Определяют поведение mock-объекта Статически типизированы (type-safe) SetArrayArgument<>(), SetArg<>(), SaveArg<>(), Return(value), ReturnRef(object), Invoke(function), Invoke(object, method) Составные:  DoAll(action1, action2, ...) Можно определять самому ON_CALL() определяет действие по умолчанию чтобы можно было не указывать WillOnce или WillRepeatedly 19
Расширяем Google Mock – предикаты MATCHER(IsEven, &quot;&quot;) { return arg % 2 == 0; } MATCHER_P(IsDivisibleBy, n, &quot;&quot;) {    return arg % n == 0; } MATCHER_P2(IsSumOf, a, b, &quot;&quot;) {    return arg == a + b; } EXPECT_CALL(mock, Foo(IsSumOf(x, 7))); Не должны вызывать сторонних эффектов Не должны содержать изменяемого состояния Есть более продвинутое API для создания предикатов 20
Расширяем Google Mock – действия ACTION(ChooseCallee) {    if (arg0)      arg1->f();    else      arg2->g(); } ACTION_P(CopyData, data) {    std::copy(data.data(),              data.data() + data.size(),              arg0); } Доступ к аргументам метода: arg0, arg1, ... Есть более продвинутое API для создания действий 21
Пример: внедрение ошибок TEST(FileReaderTest, HandlesConnectionClosed) {    MockSocket mock_socket;    MockServerManager mock_server_manager;    EXPECT_CALL(mock_socket, Read(_, Ge(25))        .WillOnce( SetErrnoAndReturn (EPIPE, -1));    EXPECT_CALL(mock_server_manager, OnConnectionLost());    Server server(&mock_socket, &mock_server_manager);    EXPECT_FALSE(reader.ReadRequest(&result)); } 22
Пример: быстрый сон class WallClockInterface {   public:    virtual time_t GetWallTime() const = 0;    virtual void SleepMilliseconds(time_t ms) = 0; }; class MockWallClock : public WallClockInterface {   public:    MOCK_CONST_METHOD0(GetWallTime, time_t());    MOCK_METHOD1(SleepMilliseconds, void()); }; 23
Пример: быстрый сон TEST(NetworkClientTest, WaitsAndRetries) {    MockWallClock mock_clock;    MockSocket mock_socket;    InSequence s;    EXPECT_CALL(mock_socket, Connect(_))        .WillOnce(Return(false));    EXPECT_CALL(mock_clock,  GetWallTime ())        .WillOnce( Return(1000) );    EXPECT_CALL(mock_clock,  SleepMilliseconds(2000) );    EXPECT_CALL(mock_clock,  GetWallTime ())        .WillOnce( Return(3000) );    EXPECT_CALL(mock_socket,  Connect(_) )        .WillOnce(Return(true));    NetworkClient client(&mock_clock, &mock_socket);    EXPECT_TRUE(client.AttemptConnectWithRetry()); } 24
Преимущества Проверяет взаимодействие между объектом и соседями Позволяет писать быстрые тесты Позволяет писать надёжные тесты Упрощает тестирование кода обработки ошибок Позволяет писать код, не имея соседей 25
Недостатки Mock-объекты компилируются медленно Малопонятная диагностика Написан Google Mock Doctor, скрипт для интерпретации диагностики (GCC и LLVM) Mock-нужно писать вручную Есть скрипт для генерации mock-классов из определений интерфейсов или классов 26
Google Mock http://code.google.com/p/googlemock http://code.google.com/p/googlemock/wiki/Documentation googlemock@googlegroups.com (English) 27

More Related Content

What's hot (19)

PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
PDF
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Sergey Platonov
 
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
ODP
Как за час сделать недельную работу
corehard_by
 
PDF
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
PDF
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Tatyanazaxarova
 
PPTX
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
PDF
Модель памяти C++ - Андрей Янковский, Яндекс
Yandex
 
PDF
Антон Полухин, Немного о Boost
Sergey Platonov
 
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
PDF
Павел Довгалюк, Обратная отладка
Sergey Platonov
 
PPTX
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
PPTX
JRebel
Alex Tumanoff
 
PDF
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
PDF
Шишки, набитые за 15 лет использования акторов в C++
Yauheni Akhotnikau
 
PPTX
Статический анализ кода
Pavel Tsukanov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Sergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Sergey Platonov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
Как за час сделать недельную работу
corehard_by
 
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Tatyanazaxarova
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Модель памяти C++ - Андрей Янковский, Яндекс
Yandex
 
Антон Полухин, Немного о Boost
Sergey Platonov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Павел Довгалюк, Обратная отладка
Sergey Platonov
 
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Догнать и перегнать boost::lexical_cast
Roman Orlov
 
Шишки, набитые за 15 лет использования акторов в C++
Yauheni Akhotnikau
 
Статический анализ кода
Pavel Tsukanov
 

Viewers also liked (17)

PDF
В поисках математики. Михаил Денисенко, Нигма
yaevents
 
PDF
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
yaevents
 
PDF
Василий Сорокин, “Google C++ Mocking and Test Frameworks”
Platonov Sergey
 
PPTX
Практика использования Dependency Injection
Platonov Sergey
 
PDF
Unit-Testing Bad-Practices by Example
Benjamin Eberlei
 
PDF
Контроль зверей: инструменты для управления и мониторинга распределенных сист...
yaevents
 
PPT
Масштабируемость Hadoop в Facebook. Дмитрий Мольков, Facebook
yaevents
 
PDF
C++11 (formerly known as C++0x) is the new C++ language standard. Dave Abraha...
yaevents
 
PPTX
Сложнейшие техники, применяемые буткитами и полиморфными вирусами. Вячеслав З...
yaevents
 
PDF
Поисковая технология "Спектр". Андрей Плахов, Яндекс
yaevents
 
PDF
Павел Филонов, Разделяй и управляй вместе с Conan.io
Sergey Platonov
 
PPTX
Practical unit testing in c & c++
Matt Hargett
 
PPTX
Using classifiers to compute similarities between face images. Prof. Lior Wol...
yaevents
 
PPTX
Как писать красивый код или основы SOLID
Pavel Tsukanov
 
PDF
Clean Unit Test Patterns
Frank Appel
 
PDF
Сканирование уязвимостей со вкусом Яндекса. Тарас Иващенко, Яндекс
yaevents
 
PPTX
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
SQALab
 
В поисках математики. Михаил Денисенко, Нигма
yaevents
 
Зачем обычному программисту знать языки, на которых почти никто не пишет. Але...
yaevents
 
Василий Сорокин, “Google C++ Mocking and Test Frameworks”
Platonov Sergey
 
Практика использования Dependency Injection
Platonov Sergey
 
Unit-Testing Bad-Practices by Example
Benjamin Eberlei
 
Контроль зверей: инструменты для управления и мониторинга распределенных сист...
yaevents
 
Масштабируемость Hadoop в Facebook. Дмитрий Мольков, Facebook
yaevents
 
C++11 (formerly known as C++0x) is the new C++ language standard. Dave Abraha...
yaevents
 
Сложнейшие техники, применяемые буткитами и полиморфными вирусами. Вячеслав З...
yaevents
 
Поисковая технология "Спектр". Андрей Плахов, Яндекс
yaevents
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Sergey Platonov
 
Practical unit testing in c & c++
Matt Hargett
 
Using classifiers to compute similarities between face images. Prof. Lior Wol...
yaevents
 
Как писать красивый код или основы SOLID
Pavel Tsukanov
 
Clean Unit Test Patterns
Frank Appel
 
Сканирование уязвимостей со вкусом Яндекса. Тарас Иващенко, Яндекс
yaevents
 
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
SQALab
 
Ad

Similar to Юнит-тестирование и Google Mock. Влад Лосев, Google (7)

PPTX
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
Ciklum Ukraine
 
PPTX
Тестируем legacy c++
Maxim Shulga
 
PPTX
Unit тесты java
Vadim Lyakhovets
 
PDF
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
PPTX
AgileCamp'11 Новосибирск - Unit Tests
Anton Katkov
 
PDF
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDeve...
Ciklum Ukraine
 
Тестируем legacy c++
Maxim Shulga
 
Unit тесты java
Vadim Lyakhovets
 
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
AgileCamp'11 Новосибирск - Unit Tests
Anton Katkov
 
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
Ad

More from yaevents (20)

PDF
Как научить роботов тестировать веб-интерфейсы. Артем Ерошенко, Илья Кацев, Я...
yaevents
 
PDF
Тема для WordPress в БЭМ. Владимир Гриненко, Яндекс
yaevents
 
PDF
Построение сложносоставных блоков в шаблонизаторе bemhtml. Сергей Бережной, Я...
yaevents
 
PDF
i-bem.js: JavaScript в БЭМ-терминах. Елена Глухова, Варвара Степанова, Яндекс
yaevents
 
PDF
Дом из готовых кирпичей. Библиотека блоков, тюнинг, инструменты. Елена Глухов...
yaevents
 
PDF
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
yaevents
 
ODP
Администрирование небольших сервисов или один за всех и 100 на одного. Роман ...
yaevents
 
PDF
Мониторинг со всех сторон. Алексей Симаков, Яндекс
yaevents
 
PDF
Истории про разработку сайтов. Сергей Бережной, Яндекс
yaevents
 
PDF
Разработка приложений для Android на С++. Юрий Береза, Shturmann
yaevents
 
PPTX
Кросс-платформенная разработка под мобильные устройства. Дмитрий Жестилевский...
yaevents
 
PDF
Julia Stoyanovich - Making interval-based clustering rank-aware
yaevents
 
PDF
Mike Thelwall - Sentiment strength detection for the social web: From YouTube...
yaevents
 
PDF
Evangelos Kanoulas — Advances in Information Retrieval Evaluation
yaevents
 
PDF
Ben Carterett — Advances in Information Retrieval Evaluation
yaevents
 
PDF
Raffaele Perego "Efficient Query Suggestions in the Long Tail"
yaevents
 
PDF
"Efficient Diversification of Web Search Results"
yaevents
 
PDF
Salvatore_Orlando
yaevents
 
PDF
Fast dynamic analysis, Kostya Serebryany
yaevents
 
PDF
Adapting Rankers Online, Maarten de Rijke
yaevents
 
Как научить роботов тестировать веб-интерфейсы. Артем Ерошенко, Илья Кацев, Я...
yaevents
 
Тема для WordPress в БЭМ. Владимир Гриненко, Яндекс
yaevents
 
Построение сложносоставных блоков в шаблонизаторе bemhtml. Сергей Бережной, Я...
yaevents
 
i-bem.js: JavaScript в БЭМ-терминах. Елена Глухова, Варвара Степанова, Яндекс
yaevents
 
Дом из готовых кирпичей. Библиотека блоков, тюнинг, инструменты. Елена Глухов...
yaevents
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
yaevents
 
Администрирование небольших сервисов или один за всех и 100 на одного. Роман ...
yaevents
 
Мониторинг со всех сторон. Алексей Симаков, Яндекс
yaevents
 
Истории про разработку сайтов. Сергей Бережной, Яндекс
yaevents
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
yaevents
 
Кросс-платформенная разработка под мобильные устройства. Дмитрий Жестилевский...
yaevents
 
Julia Stoyanovich - Making interval-based clustering rank-aware
yaevents
 
Mike Thelwall - Sentiment strength detection for the social web: From YouTube...
yaevents
 
Evangelos Kanoulas — Advances in Information Retrieval Evaluation
yaevents
 
Ben Carterett — Advances in Information Retrieval Evaluation
yaevents
 
Raffaele Perego "Efficient Query Suggestions in the Long Tail"
yaevents
 
"Efficient Diversification of Web Search Results"
yaevents
 
Salvatore_Orlando
yaevents
 
Fast dynamic analysis, Kostya Serebryany
yaevents
 
Adapting Rankers Online, Maarten de Rijke
yaevents
 

Юнит-тестирование и Google Mock. Влад Лосев, Google

  • 1.   Модульное тестирование и Google Mock Владимир Лосев Google [email_address] Yet Another Conference 2011 Москва, 19 сентября 1
  • 2. Agenda Почему Google Mock? Как им пользоваться Примеры 2
  • 3. Хочешь жить без багов? Спроси меня как! Ошибки снижают производительность ...Если не чинить их быстро Нужны автоматизированные тесты Быстрые Надёжные Точные Тестируем по одному модулю за раз 3
  • 4. Изоляция модулей В программах на C++ абстрагируем взаимодействия между объектами через интерфейсы Используем тестовые двойники (stub-, mock-объекты, и т.д.) для имитации поведения соседей Используем метод внедрения зависимостей для добавления двойников 4
  • 5. Внедрение зависимостей class SocketInterface {  public:   virtual int Read(void* buffer, int size) = 0; }; class Server {   public:   Server(SocketInterface* socket) : socket_(socket) {}   bool ReadRequest (string* result) {     char buffer[BUFFER_SIZE];     int bytes_read;     while ((bytes_read = socket->Read (buffer,                                       BUFFER_SIZE)) > 0)       result->append(buffer, buffer + bytes_read);     return result->size() > 0;   }   private:   SocketInterface* const socket_; }; 5
  • 6. class MockSocket : public SocketInterface {   public:   MockSocket(const char* buffer_to_read, int buffer_size)       : buffer_to_read_(buffer_to_read_), size_(buffer_size),         bytes_read_(0) {   }   virtual int Read (void* buffer, int n) {     int actual_read = std::min(n, size_ - bytes_read_);     memcpy(buffer, buffer_to_read_ + bytes_read_, actual_read);     bytes_read_ += actual_read;     return actual_read;   }   int bytes_read() const { return bytes_read_; } private:   const char* buffer_to_read_;   int size_;   int bytes_read_; }; Mock-объект, написанный вручную 6
  • 7. Тест с таким объектом TEST(Server_ReadRequest, ReadsCompleteRequest) {   string data(&quot;1234567890123456789012345&quot;);   MockSocket mock_socket(data.data(), data.size());   Server server(&mock_socket);   string buffer;   EXPECT_TRUE(server.ReadRequest(&buffer));   EXPECT_EQ(data, buffer); } Проверяет только результат, а не взаимодействие 7
  • 8. Google Mock Google C++ Mocking Framework/Google Mock/gMock Написан в 2007 г. Жаньонгом Ваном (Zhanyong Wan) Код открыт в 2008 г. Лежит на  code.google.com/p/googlemock Используется во многих проектах с открытым кодом (Chromium, LLVM) 8
  • 9. Нужна библиотека для написания тестов Хорошо интегрирован с Google Test Лежит на  http://code.google.com/p/googletest Позволяет легко и быстро писать тесты:   #include <gtest/gtest.h>   TEST(MathTest, ArithmeticsStillWorks) {     EXPECT_EQ(4, 2 * 2);   } 9
  • 10. Mock-объект на Google Mock  class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); }; 10
  • 11. Определение ожиданий  class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); };   EXPECT_CALL(mock_socket, Read(…)) 11
  • 12. Описние параметров class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); };   EXPECT_CALL(mock_socket, Read(_, Ge(25))) 12
  • 13. Описание количества вызовов  class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); };   EXPECT_CALL(mock_socket, Read(_, Ge(25)))       .Times(2) 13
  • 14. Описание поведения class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); };   string data(&quot;1234567890123456789012345&quot;);   EXPECT_CALL(mock_socket, Read(_, Ge(25)))       .Times(2)       .WillOnce(DoAll(CopyData(data),                       Return(data.size())))       .WillOnce(Return(0)); 14
  • 15. Полный тест class MockSocket : public SocketInterface {   public:   MOCK_METHOD2(Read, int(void* buffer, int n)); }; TEST(Server_ReadRequest, ReadsCompleteRequest) {   MockSocket mock_socket;   string data(&quot;1234567890123456789012345&quot;);   EXPECT_CALL(mock_socket, Read(_, Ge(25)))       .Times(2)       .WillOnce(DoAll(CopyData(data),                       Return(data.size())))       .WillOnce(Return(0));   Server server(&mock_socket);   string result;   EXPECT_TRUE(server.ReadRequest(&result));   EXPECT_EQ(data, result); } 15
  • 16. Предикаты ...на стероидах Проверяют условия Описывают эти условия Предоставляют объяснения Примеры: Простые: 42, _, Gt(32), NotNull() Составные: AllOf(m1, ...), AnyOf(m1, ...), Not(matcher) Для контейнеров:  Contains(matcher), Each(matcher) ElementsAre(e1, ..., en), ElementsAreArray(arr) Можно определять собственные 16
  • 17. Количество вызовов Указывается в методе Times():   EXPECT_CALL(mock, Foo()). Times(cardinality) ; Можно указывать: 2 Exactly(2) AtLeast(3) AtMost(5) Between(3, 4) 17
  • 18. Порядок По умолчанию порядок вызовов не задаётся Можно указывать полный или частичный порядок Отсутствие циклов гаранировано {   InSequence s;   EXPECT_CALL(mock, A());   EXPECT_CALL(mock, B()); } Sequence s1, s2; EXPECT_CALL(mock, A()).InSequence(s1, s2); EXPECT_CALL(mock, B()).InSequence(s1); EXPECT_CALL(mock, C()).InSequence(s2); 18
  • 19. Действия Определяются в методах WillOnce() и WillRepeatedly()  Определяют поведение mock-объекта Статически типизированы (type-safe) SetArrayArgument<>(), SetArg<>(), SaveArg<>(), Return(value), ReturnRef(object), Invoke(function), Invoke(object, method) Составные: DoAll(action1, action2, ...) Можно определять самому ON_CALL() определяет действие по умолчанию чтобы можно было не указывать WillOnce или WillRepeatedly 19
  • 20. Расширяем Google Mock – предикаты MATCHER(IsEven, &quot;&quot;) { return arg % 2 == 0; } MATCHER_P(IsDivisibleBy, n, &quot;&quot;) {   return arg % n == 0; } MATCHER_P2(IsSumOf, a, b, &quot;&quot;) {   return arg == a + b; } EXPECT_CALL(mock, Foo(IsSumOf(x, 7))); Не должны вызывать сторонних эффектов Не должны содержать изменяемого состояния Есть более продвинутое API для создания предикатов 20
  • 21. Расширяем Google Mock – действия ACTION(ChooseCallee) {   if (arg0)     arg1->f();   else     arg2->g(); } ACTION_P(CopyData, data) {   std::copy(data.data(),             data.data() + data.size(),             arg0); } Доступ к аргументам метода: arg0, arg1, ... Есть более продвинутое API для создания действий 21
  • 22. Пример: внедрение ошибок TEST(FileReaderTest, HandlesConnectionClosed) {   MockSocket mock_socket;   MockServerManager mock_server_manager;   EXPECT_CALL(mock_socket, Read(_, Ge(25))       .WillOnce( SetErrnoAndReturn (EPIPE, -1));   EXPECT_CALL(mock_server_manager, OnConnectionLost());   Server server(&mock_socket, &mock_server_manager);   EXPECT_FALSE(reader.ReadRequest(&result)); } 22
  • 23. Пример: быстрый сон class WallClockInterface {   public:   virtual time_t GetWallTime() const = 0;   virtual void SleepMilliseconds(time_t ms) = 0; }; class MockWallClock : public WallClockInterface {   public:   MOCK_CONST_METHOD0(GetWallTime, time_t());   MOCK_METHOD1(SleepMilliseconds, void()); }; 23
  • 24. Пример: быстрый сон TEST(NetworkClientTest, WaitsAndRetries) {   MockWallClock mock_clock;   MockSocket mock_socket;   InSequence s;   EXPECT_CALL(mock_socket, Connect(_))       .WillOnce(Return(false));   EXPECT_CALL(mock_clock, GetWallTime ())       .WillOnce( Return(1000) );   EXPECT_CALL(mock_clock, SleepMilliseconds(2000) );   EXPECT_CALL(mock_clock, GetWallTime ())       .WillOnce( Return(3000) );   EXPECT_CALL(mock_socket,  Connect(_) )       .WillOnce(Return(true));   NetworkClient client(&mock_clock, &mock_socket);   EXPECT_TRUE(client.AttemptConnectWithRetry()); } 24
  • 25. Преимущества Проверяет взаимодействие между объектом и соседями Позволяет писать быстрые тесты Позволяет писать надёжные тесты Упрощает тестирование кода обработки ошибок Позволяет писать код, не имея соседей 25
  • 26. Недостатки Mock-объекты компилируются медленно Малопонятная диагностика Написан Google Mock Doctor, скрипт для интерпретации диагностики (GCC и LLVM) Mock-нужно писать вручную Есть скрипт для генерации mock-классов из определений интерфейсов или классов 26
  • 27. Google Mock http://code.google.com/p/googlemock http://code.google.com/p/googlemock/wiki/Documentation [email protected] (English) 27

Editor's Notes

  • #4: Finding and fixing bugs takes significant portion of programmer&apos;s time, killing productivity.
  • #7: 18 lines
  • #15: * Copy Data is magic, explained later, we have more general action
  • #16: * gmock takes care of the rest * checks for violation and outputs precise diagnostic messages * WILL MARK TEST AS FAILED * checks are done as soon as possible, so can drop into debugger at THAT MOMENT
  • #17: Mention the matcher library and custom matchers.
  • #18: * If called too many times, gmock will complain when amount is exceeded * if called too few times, gmock will complain when the mock is destroyed * Custom cardinalities possible but have never been requested
  • #19: Can define any acyclic dependency graph with it
  • #20: Type safe: performing incompatible operations on arguments or returning incompatible type will cause build error
  • #21: * More advanced API for developing matchers is available
  • #22: * First one will not compile if the method has less than 3 arguments * Can have even more advanced 
  • #24: * Imagine a client that tries an operation and has to repeat it after 2 seconds if it fails
  • #26: * Note: we never have defined actual socket class
  • #27: * Google Mock doctor