Як налаштувати Google C ++ Testing Framework (gtest) за допомогою Visual Studio 2005


82

Це не задокументовано на веб-сайті, і люди, здається, мають проблеми з налаштуванням фреймворку. Чи може хтось показати покрокове введення для зразка налаштування проекту?


Радий, що хтось запитав ...
Боянг

Відповіді:


44

Те, що сказав Арлахарен, в основному було правильним, за винятком того, що він пропустив ту частину, яка пояснює ваші помилки компонувальника. Перш за все, вам потрібно створити програму без ЕПТ як бібліотеку виконання. Ви завжди повинні робити це в будь-якому випадку, оскільки це справді спрощує розподіл вашої програми. Якщо ви цього не зробите, тоді всім вашим користувачам потрібна встановлена ​​бібліотека середовища виконання Visual C ++, а ті, хто цього не зробить, будуть скаржитися на таємничу відсутність бібліотеки DLL у їхній системі ... на додаткові кілька сотень кілобайт, на які потрібно посилати ЕПТ статично, ви позбавляєте себе від головного болю пізніше в підтримку (повірте мені, це - я навчився цього важким шляхом!).

У будь-якому випадку, для цього ви переходите до властивостей цілі -> C / C ++ -> Генерація коду -> Бібліотека виконання, і її потрібно встановити як "Multi-Threading" для вашої збірки Release та "Multi-Threading Debug" для вашої збірки налагодження.

Оскільки GTEST бібліотека побудована таким же чином, ви повинні переконатися , що ви пов'язуєте з правильною версією нього , або ж компоновщик буде тягнути в інший копії бібліотеки часу виконання, що помилка ви бачили (до речі, це не має значення, якщо ви використовуєте MFC чи ні). Вам потрібно створити gtest як у режимі налагодження, так і в режимі випуску та зберегти обидві копії. Потім ви посилаєтесь на gtest.lib / gtest_main.lib у вашій версії збірки та gtestd.lib / gtest_maind.lib у вашій збірці налагодження.

Крім того, вам потрібно переконатися, що ваша програма вказує на каталог, де зберігаються файли заголовків gtest (у властивостях -> C / C ++ -> Загальні -> Додаткові каталоги включення), але якщо ви потрапили до помилки компонувальника, я припускаю що вам уже вдалося правильно виправити цю частину, інакше у вас буде набагато більше помилок компілятора, з якими потрібно мати справу в першу чергу.


Я навчився цього "важким шляхом", витрачаючи весь свій день. Нарешті я змусив це працювати, будуючи їх обох однаково. Дякую за відповідь, але вже пізно. : / І до речі, ваша пропозиція щодо ЕПТ помилкова, але мені не вистачає місця для обговорення цього. Див tinyurl.com/dj5k7k
knaser

ну, якщо ви навчилися цього "важким способом", ви можете забути, що DLT середовища виконання ЕЛТ називаються "розподілюваними" ... так що вам зрозуміло, що ви повинні перерозподілити їх самостійно ... або включивши програму встановлення редактора до власного інсталятора , або просто
витягнувши

1
Статичне зв’язування ЕПТ означає, що ваша програма не отримає виправлення експлуатації / безпеки
paulm

106

(Ці інструкції забезпечують тестування, що працює для конфігурації налагодження. Застосувати той самий процес до конфігурації випуску має бути досить тривіально.)

Отримайте Google C ++ Testing Framework

  1. Завантажте останню фреймворк gtest
  2. Розпакуйте C:\gtest

Створення фреймворкових бібліотек

  1. Відкрити C:\gtest\msvc\gtest.slnу Visual Studio
  2. Встановіть для конфігурації значення "Налагодження"
  3. Побудувати рішення

Створіть і налаштуйте свій тестовий проект

  1. Створіть нове рішення і виберіть шаблон Visual C ++> Win32> Win32 Console Application
  2. Клацніть правою кнопкою миші по новоствореному проекту та оберіть Властивості
  3. Змініть конфігурацію на Налагодження.
  4. Властивості конфігурації> C / C ++> Загальне> Додаткові каталоги включення: Додати C:\gtest\include
  5. Властивості конфігурації> C / C ++> Генерація коду> Бібліотека виконання: якщо ваш код посилається на DLL середовища виконання, виберіть Багатопотокова DLL для налагодження (/ MDd). Якщо ні, виберіть багатопотокове налагодження (/ MTd).
  6. Властивості конфігурації> Посилання> Загальне> Додаткові каталоги бібліотеки: додайте C:\gtest\msvc\gtest\Debugабо C:\gtest\msvc\gtest-md\Debug, залежно від розташування gtestd.lib
  7. Властивості конфігурації> Посилання> Введення> Додаткові залежності: Додати gtestd.lib

Перевірка роботи всього

  1. Відкрийте cpp у своєму тестовому проекті, що містить main()функцію.
  2. Вставте такий код:

    #include "stdafx.h"  
    #include <iostream>
    
    #include "gtest/gtest.h"
    
    TEST(sample_test_case, sample_test)
    {
        EXPECT_EQ(1, 1);
    }
    
    int main(int argc, char** argv) 
    { 
        testing::InitGoogleTest(&argc, argv); 
        RUN_ALL_TESTS(); 
        std::getchar(); // keep console window open until Return keystroke
    }
    
  3. Налагодження> Почати налагодження

Якщо все спрацювало, ви побачите вікно консолі, яке покаже результати модульного тесту.


9
це був чудовий путівник! Мені вдалося прокрутити м'яч, але я б додав ще одну примітку: тестовий проект і бібліотека gtest повинні бути побудовані з однаковим варіантом генерації коду, або обидва є / MDd, або обидва є / MTd, інакше буде бути купою помилок прив'язки.
Кирило

1
Примітка. Хто намагається виконати подібну реалізацію з Microsoft Visual Studio .Net 2003, бібліотеки Google Test Framework автоматично встановлюють за замовчуванням для бібліотеки середовища виконання " Однопотокове налагодження " для режиму налагодження та " Однопотокове " для режиму випуску та наскільки я вже випробував, можливість змінити його з генерації коду недоступна. Отже, переконайтесь, що ви вибрали однопотоковий варіант як бібліотеку виконання у своєму проекті. Крім цього, цей простий і короткий підручник чудово працює!
Неофіл

Це перший з п’яти навчальних посібників, який працював і не сприяв поганій практиці. Мені було б дуже приємно, якби це охоплювало важливий аспект прив’язки тестового проекту до оригінального проекту ... 30+ сайтів пізніше, я не знайшов робочої відповіді. Я витратив на це 3 дні.
person27

Я видалив значення в "Властивості проекту> Властивості конфігурації> C / C ++> Бібліотека виконання", потім воно спрацювало
Manohar Reddy Poreddy


5

Побудувавши gtest, ось що я зробив:

  1. Додайте \ mypath \ gtest-1.0.1 \ Налагодження (або випуск) до загальних властивостей-> Посилання-> Загальні-> Додаткові каталоги бібліотеки
  2. Додайте gtest.lib та gtest_main.lib до загальних властивостей-> Linker-> Input-> Додаткові залежності

Після цього я просто пишу свої тести, використовуючи TEST або TEST_F, як потрібно, і складаю їх разом зі своєю основною функцією:

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

5
Я отримую багато помилок компонувальника: вже визначено в gtest.lib ... наприклад: 1> LIBCMT.lib (tidtable.obj): помилка LNK2005: __encode_pointer вже визначено в msvcrt.lib (MSVCR80.dll) О, до речі, я Я намагаюся написати тести на код MFC.
knaser

Вибачте. Думаю, я не можу вам там допомогти. З якихось причин я не отримую цих помилок посилання. Ви намагалися побудувати лише привітний світовий тест з gtest?
Арлахарен

gtest_main.libмістить функцію за замовчуванням main, тому ви, мабуть, не хочете її включати, якщо mainявно написали власну .
Гру

5

Якщо ви не хочете писати власний main () для тестів, ви можете використовувати функцію main (), визначену в gtest_main.lib, але тоді ви отримуєте помилки компонувальника "Точку входу потрібно визначити" у VS2012. У вашому тестовому проекті встановіть ProjectProperties-> Linker-> System-> SubSystem на «Console», оскільки це змусить VS2012 шукати точку входу під назвою «main ()» і знайде її в gtest_main.lib (за умови, що ви вже зв’язали) це правильно).


2

У Microsoft Visual Studio неправильно налаштований тип бібліотеки виконання спричиняє помилки посилання.

VS 2005 (і 2008) за замовчуванням використовує багатопотокову DLL або багатопотокову DLL для налагодження. Але бібліотека Google Test використовує Mulithreading або Mulithreaded час налагодження за замовчуванням.

Отже, виберіть відповідний тип бібліотеки часу виконання для тестової бібліотеки Google. (у Властивості конфігурації -> Генерація коду -> Бібліотека виконання).


який відповідний час виконання? (MD або інше)
Ramadheer Singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.