Как настроить модульное тестирование для Visual Studio C ++

93

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

Любые ссылки или учебные пособия будут оценены.

DShook
источник
Google выпускает C ++ Test Framework, который очень похож на фреймворки xUnit. http://code.google.com/p/googletest/
popopome
Какой фреймворк вы в конечном итоге использовали?
Joakim Karlsson
на самом деле я до сих пор не использовал ни один из них. Я решил, что то, над чем я работал, юнит-тесты - не самое эффективное использование времени.
DShook 05

Ответы:

56

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

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Единица ++
  • CxxTest

Проверьте CPPUnitLite или CPPUnitLite2 .

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

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

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

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

Также проверьте Catch или Doctest

Трубкозуб
источник
2
Googletest очень похож на boost :: test, но его немного проще интегрировать в VS
Мартин Беккет
3
Я удивлен, что Catch здесь не упоминается. Также проверьте doctest - моя повторная реализация Catch с огромным упором на скорость компиляции - ознакомьтесь с FAQ, чтобы увидеть, чем они отличаются
onqtam
1
@onqtam, не удивляйтесь, это вопрос / ответ из 2008 года! Добавлены предложенные вами ссылки.
Aardvark
24

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

Вот подход, который я использую для тестирования модуля IIS URL Rewrite в 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] 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)

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.
Andy Dent
2

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

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

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

graham.reeds
источник
2

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

Питер Мортенсен
источник
1

Я использовал CppUnit с VS2005 и Eclipse. Вики написана очень тщательно (особенно если вы знакомы с JUnit).

Colgur
источник
1

Я не уверен на 100% в VS2008, но я знаю, что фреймворк модульного тестирования, который Microsoft поставлял в VS2005 как часть своего Team Suite, был только для .NET, а не C ++

Я также использовал CppUnit, и все было хорошо. Во многом то же самое, что и NUnit / JUnit / и так далее.

Если вы использовали boost, у них также есть библиотека модульного тестирования

У ребят, стоящих за boost, есть серьезные проблемы с кодированием, поэтому я бы сказал, что их структура должна быть довольно хорошей, но она может быть не самой удобной для пользователя :-)

Орион Эдвардс
источник
1

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

ZebZiggle
источник
1

Насколько мне известно, модульный тестер для 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, чтобы ваш тестовый класс заработал.

Lehane
источник
1

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

Модульный тест для неуправляемого C ++ в Visual Studio

Наяна Адассурия
источник