Как настроить модульное тестирование для Visual Studio C ++ - PullRequest
91 голосов
/ 06 августа 2008

У меня возникают проблемы с выяснением того, как настроить среду тестирования и использовать ее в Visual Studio 2008 для C ++, предположительно со встроенным модульным тестированием.

Будем благодарны за любые ссылки или учебные пособия.

Ответы [ 12 ]

56 голосов
/ 30 августа 2008

Эта страница может помочь, она рассматривает несколько платформ модульного тестирования C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unit ++
  • CxxTest

Выезд CPPUnitLite или CPPUnitLite2 .

CPPUnitLite был создан Майклом Фезерсом, который первоначально портировал JUnit Java на C ++ как CPPUnit (CPPUnit пытается имитировать модель разработки JUnit - но в C ++ отсутствуют функции Java [например, отражение], чтобы упростить его использование ).

CPPUnitLite пытается создать настоящую среду тестирования в стиле C ++, а не Java, портированную на C ++. (Я перефразирую книгу Пера , эффективно работающую с Legacy Code ). CPPUnitLite2 , похоже, является еще одним переписыванием с большим количеством функций и исправлений ошибок.

Я также наткнулся на UnitTest ++ , который включает в себя материал из CPPUnitLite2 и некоторые другие фреймворки.

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

Также оформить заказ Catch или Doctest

24 голосов
/ 05 мая 2009

Существует способ тестирования неуправляемого C ++ с использованием встроенной среды тестирования в Visual Studio 2008 . Если вы создаете тестовый проект C ++, используя C ++ / CLI, вы можете затем вызывать неуправляемую DLL. Вам придется переключить поддержку Common Language Runtime на / clr из / clr: safe, если вы хотите протестировать код, написанный на неуправляемом C ++.

У меня есть пошаговые подробности в моем блоге здесь: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

9 голосов
/ 02 декабря 2009

Вот подход, который я использую для тестирования модуля перезаписи URL IIS в Microsoft (он основан на командной строке, но должен работать и для VS):

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

Вот пример:

// 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] void NewTest () {:: NewTest ();} и новую встроенную функцию 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)

НТН

6 голосов
/ 15 сентября 2008

Лично я предпочитаю WinUnit , поскольку мне не нужно писать что-либо, кроме моих тестов (я создаю .dll как тест, а не exe). Я просто строю проект и указываю WinUnit.exe на мой тестовый каталог, и он запускает все, что находит. Вы можете скачать проект WinUnit здесь . (MSDN теперь требует, чтобы вы загрузили всю проблему, а не статью. WinUnit включен в комплект.)

4 голосов
/ 14 августа 2008

Фреймворк, включенный в VS9 , - это .NET, но вы можете писать тесты на C ++ / CLI, поэтому, пока вы знакомы с изучением некоторых .NET-измов, вы сможете тестировать большинство Код C ++.

Boost.Test и googletest выглядят довольно схожими, но адаптированными для немного другого использования. У обоих из них есть двоичный компонент, поэтому вам потребуется дополнительный проект в вашем решении для компиляции и запуска тестов.

Используемая нами структура: CxxTest , которая намного легче; это только заголовки, и он использует скрипт Perl (!) для очистки информации набора тестов от ваших заголовков (наборы наследуются от CxxTest :: Base, имена всех ваших методов тестирования начинаются с «test»). Очевидно, что для этого требуется, чтобы вы получали Perl из из одного источника или из другого , что добавляет накладные расходы к настройке среды сборки.

2 голосов
/ 24 июня 2009

Инструменты, которые были упомянуты здесь, являются инструментами командной строки. Если вы ищете более интегрированное решение, взгляните на cfix studio , который представляет собой модульное тестирование надстройки Visual Studio для C / C ++. Он очень похож на TestDriven.Net, но для (неуправляемого) C / C ++, а не .NET.

2 голосов
/ 06 августа 2008

Я использую UnitTest ++ .

За годы, прошедшие после того, как я сделал этот пост, источник перешел с SourceForge на github. Кроме того, пример учебника теперь более независимый - не входит ни в какую конфигурацию или проект, настроенный вообще.

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

1 голос
/ 07 декабря 2012

Я страдал от реализации модульного тестирования для неуправляемого приложения C ++ в среде Windows с Visual Studio. Поэтому мне удалось преодолеть это и написать пост в качестве пошагового руководства по неуправляемому модульному тестированию приложений C ++. Я надеюсь, что это может помочь вам.

Юнит-тест для неуправляемого C ++ в Visual Studio

1 голос
/ 27 августа 2008

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

1 голос
/ 19 августа 2008

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

Я использовал CppUnit в Visual Studio 2005 и нашел его довольно хорошим.

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

Тогда #include <cppunit/extensions/HelperMacros.h> в заголовке.

Затем вы можете выполнить действия, описанные в http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html, чтобы ваш тестовый класс заработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...