Як налаштувати тестування блоку для Visual Studio C ++


93

У мене виникли проблеми , з'ясувати , як отримати основи тестування налаштувати і використовувати в Visual Studio 2008 для C++імовірно з вбудованим блоком тестування пакету.

Будь-які посилання чи підручники будуть вдячні.


Google випускає C ++ Test Framework, що дуже схоже на рамки xUnit. http://code.google.com/p/googletest/
popopome

Яку основу ви в кінцевому підсумку використали?
Йоаким Карлссон

насправді я досі жодного з них не використовував. Я вирішив, що я працював над одиничними тестами - це не найефективніше використання часу.
DShook

Відповіді:


56

Ця сторінка може допомогти, вона оглядає досить багато тестових рамок одиниць C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Блок ++
  • CxxTest

Ознайомтеся з CPPUnitLite або CPPUnitLite2 .

CPPUnitLite був створений Майклом Feathers, який спочатку переніс JUnit Java на C ++ як CPPUnit (CPPUnit намагається імітувати модель розробки JUnit - однак у C ++ бракує можливостей Java [напр., Рефлексія], щоб зробити їх легким у використанні).

CPPUnitLite намагається створити справжню структуру тестування у стилі C ++, а не Java, яку переносить на C ++. (Я перефразую з книги « Ефективно працює з книгою Legacy Code» Feather ). CPPUnitLite2, здається, є черговим перезаписом, з більшою кількістю функцій та виправленнями помилок.

Я також просто натрапив на UnitTest ++, який включає речі з CPPUnitLite2 та деякі інші рамки.

Microsoft випустила WinUnit .

Оформити також замовлення Catch or Doctest


2
Googletest дуже схожий на boost :: test, але трохи простіше інтегруватись у VS
Martin Beckett

3
Я здивований, що лов тут не згадується. Також перевіряйте doctest - моє повторне здійснення Catch з величезною увагою на швидкості компіляції
замовіть

1
@onqtam не надто дивуйся, це питання / відповідь було з 2008 року! Додано запропоновані вами посилання.
Aardvark

24

Існує спосіб протестувати керований C ++, використовуючи вбудований тестовий фреймворк у Visual Studio 2008 . Якщо ви створюєте тестовий проект C ++, використовуючи C ++ / CLI, ви зможете здійснювати дзвінки в керовану DLL. Вам потрібно буде переключити підтримку загальної мови виконання на / clr з / clr: safe, якщо ви хочете перевірити код, який був записаний у керованому C ++.

Я маю покрокові деталі свого блогу тут: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
Це накладає певні обмеження на ваш код C ++, у мене є хоча б одна база коду, де спроба включити його заголовки до коду C ++ / CLI була більше клопоту, ніж варто. Велика користь для використання C ++ / CLI полягає в тому, що ви можете використовувати функціональне тестування, яке параметризується з такими атрибутами, як RowTest в mbUnit / NUnit / xUnit.Net
Енді Дент,

9

Ось підхід, який я використовую для тестування модуля перезапису URL-адреси IIS в Microsoft (він заснований на командному рядку, але він повинен працювати і для VS):

  1. Переконайтеся, що файли заголовків є витратними, переміщуючи вихідний код у файли cpp та використовуючи переадресацію, якщо потрібно.
  2. Складіть свій код, щоб перевірити його як бібліотеку (.lib)
  3. Створіть проект UnitTest як C ++ з підтримкою CLR.
  4. Додайте файли заголовків.
  5. Додайте файли .lib.
  6. Додати посилання на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Використовуйте по-справжньому невеликий клас, щоб оголосити свій тест одиниці та перейти з керованого до C ++ / Native коду, як це (може бути помилки):

Ось приклад:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

При такому підході людям не доведеться вивчати занадто багато C ++ / CLI речей, весь реальний тест буде зроблено на рідній мові C ++, і клас TestShim буде використаний для "опублікування" тесту на MSTest.exe (або зробити його видимим ).

Для додавання нових тестів ви просто оголосите нову методику [TestMethod] недійсним NewTest () {:: NewTest ();} та нову основну функцію new void NewTest (). Ніяких макросів, ніяких хитрощів, прямо.

Тепер, головний файл необов’язково, але його можна використовувати для викриття методів класу Assert з нативними підписами C ++ (наприклад, wchar_t * замість Stirng ^), так що ви можете тримати його поблизу C ++ і далеко від C ++ / CLI :

Ось приклад:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH


6

Особисто я віддаю перевагу WinUnit, оскільки це не вимагає від мене нічого писати, крім моїх тестів (я будую .dll як тест, а не exe). Я просто будую проект і вказую WinUnit.exe на свій тестовий каталог, і він запускає все, що знайде. Ви можете завантажити проект WinUnit тут . (MSDN тепер вимагає завантажити весь випуск, а не статтю. У програмі WinUnit включено.)


4

Рамка, що входить до VS9, - це .NET, але ви можете писати тести на C ++ / CLI, тому, поки вам комфортно вивчати деякі .NET-ізми, ви повинні мати можливість протестувати більшість будь-яких кодів C ++.

boost.test та googletest виглядають досить схожими, але пристосовані для дещо іншого використання. Обидва вони мають бінарний компонент, тому для складання та запуску тестів вам знадобиться додатковий проект у вашому рішенні.

Рамка , яку ми використовуємо, - це CxxTest , яка набагато легша; це лише заголовки, і він використовує скрипт Perl (!) для того, щоб викреслити інформацію про тестовий набір із ваших заголовків (пакети, успадковані від CxxTest :: Base, всі назви ваших методів тестування починаються з "test"). Очевидно, що для цього потрібно отримати Perl від того чи іншого джерела , що додасть накладні витрати на налаштування середовища побудови.


CxxTest може використовувати python замість perl
Мартін Бекетт

Вам також слід бути обережними щодо будь-яких DLL-файлів, необхідних вашим кодом - у мене виникли проблеми з тестуванням NUnit та mbUnit C ++ / CLI-коду, намагаючись завантажити DLL-файли.
Енді Дент,

2

Я використовую UnitTest ++ .

У роки, коли я зайняв цю посаду, джерело перейшло з SourceForge в github. Також приклад навчального посібника тепер є більш агностичним - взагалі не входить у будь-яку конфігурацію чи проект.

Сумніваюсь, він все ще працюватиме для Visual Studio 6, оскільки файли проекту тепер створюються через CMake. Якщо вам все ще потрібна підтримка старішої версії, ви можете отримати останню доступну версію у відділенні SourceForge .


2

Згадані тут інструменти - це всі інструменти командного рядка. Якщо ви шукаєте більш інтегроване рішення, перегляньте студію cfix , яка є Visual Studio AddIn для тестування одиниць на C / C ++. Він досить схожий на TestDriven.Net, але для (некерованого) C / C ++, а не .NET.


1

Я використовував CppUnit з VS2005 та Eclipse. Вікі дуже ретельний (особливо якщо ви знайомі з JUnit).


1

Я не впевнений на 100% щодо VS2008, але знаю, що рамки тестування модулів, які мікрософт поставляв у VS2005 у складі їх пакету Team, були лише для .NET, а не для C ++

Я також використовував CppUnit, і все було добре. Настільки ж, як NUnit / JUnit / так далі.

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

Хлопці, що стоять за імпульсом, мають кілька серйозних відсіків кодування, тому я б сказав, що їх рамки повинні бути дуже гарними, але це може бути не найзручнішим користувачем :-)


1

Мені подобається і CxxTest з тих же причин. Це лише файл заголовка, тому посилання не потрібно. Ви не застрягли в Perl, оскільки є і бігун Python. Я незабаром перегляну бібліотеку Google. Речі Boost забирають занадто багато іншого багажу.


1

Наскільки мені відомо, тестер приладів для Visual Studio 2008 призначений тільки для коду .NET.

Я використовував CppUnit на Visual Studio 2005 і виявив, що це дуже добре.

Наскільки я пам’ятаю, налаштування була відносно безболісною. Просто переконайтеся, що у ваших тестових проектах лінкер (Linker → Input → Additional Dependunities) включає cppunitd.lib.

Тоді, #include <cppunit/extensions/HelperMacros.h> у своєму заголовку.

Потім ви можете виконати кроки в http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html, щоб ваш тестовий клас працював.


1

Мені страждало впроваджувати тестування модулів для керованого додатка C ++ у середовищі Windows із Visual Studio. Тож мені вдалося подолати і написав публікацію як покрокове керівництво до тестування некерованих програм C ++. Сподіваюся, це може вам допомогти.

Тест блоку на керований C ++ у Visual Studio

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