Как настроить модульное тестирование для Visual Studio C ++
-
08-06-2019 - |
Вопрос
У меня возникли проблемы с пониманием того, как настроить платформу тестирования и использовать ее в Visual Studio 2008 для C ++, предположительно, с помощью встроенного пакета модульного тестирования.
Будем признательны за любые ссылки или учебные пособия.
Решение
Эта страница может помочь, в нем рассматривается довольно много фреймворков модульного тестирования C ++:
- CPP- блок
- Повышение.Тест
- CPP - элементлит
- Наноблок
- Единица измерения++
- CxxТест
Проверьте CPP - элементлит или CPPUnitLite2.
CPP - элементлит был создан Майклом Фезерсом, который первоначально портировал Java JUnit на C ++ как CppUnit (CppUnit пытается имитировать модель разработки JUnit, но C ++ не хватает возможностей Java [напримеротражение], чтобы сделать его простым в использовании).
CPPUnitLite пытается создать настоящую платформу тестирования в стиле C ++, а не Java, портированную на C ++.(Я перефразирую цитату из книги Фезера Эффективная работа с устаревшим кодом книга). CPPUnitLite2 похоже, это еще одно переписывание, с большим количеством функций и исправлений ошибок.
Я также только что наткнулся на Единичный тест++ который включает в себя материалы из CPPUnitLite2 и некоторых других фреймворков.
Microsoft выпустила Модуль WinUnit.
Другие советы
Существует способ протестировать неуправляемый 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/
Вот подход, который я использую для тестирования модуля перезаписи URL IIS в Microsoft (он основан на командной строке, но должен работать и для VS):
- Убедитесь, что ваши заголовочные файлы пригодны для использования, переместив исходный код в cpp-файлы и при необходимости используя прямое объявление.
- Скомпилируйте ваш код для тестирования как библиотеку (.lib)
- Создайте свой самый простой проект на C ++ с поддержкой CLR.
- Включите ваши заголовочные файлы.
- Включите ваши .lib-файлы.
- Добавьте ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
- Используйте действительно маленький класс для объявления вашего модульного теста и переходите от управляемого к 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 ++ native, а класс TestShim будет использоваться для "публикации" теста в MSTest.exe (или сделайте это видимым).
Для добавления новых тестов вы просто объявляете новый метод [TestMethod] void NewTest(){::NewTest();} и новую встроенную функцию void NewTest().Никаких макросов, никаких трюков, прямолинейно.
Файл heade необязателен, но его можно использовать для предоставления методов класса 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
Лично я предпочитаю Модуль WinUnit поскольку это не требует от меня пишите что угодно, кроме моих тестов (Я создаю .dll в качестве теста, а не exe).Я просто создаю проект и указываю WinUnit.exe на свой тестовый выходной каталог, и он запускает все, что находит.Ты можешь скачать проект WinUnit можно здесь.(MSDN теперь требует, чтобы вы загрузили весь выпуск, а не статью.WinUnit включен в комплект поставки.)
Фреймворк, входящий в комплект поставки VS9 является .NET, но вы можете писать тесты на C ++ / CLI, так что пока вам удобно изучать некоторые из них .NET-измы, вы должны быть в состоянии протестировать практически любой код на C ++.
повышение.тест и гуглтест выглядят довольно похоже, но адаптированы для несколько иных целей.Оба они имеют двоичный компонент, поэтому вам понадобится дополнительный проект в вашем решении для компиляции и запуска тестов.
Фреймворк, который мы используем, является CxxТест, который намного легче;это только заголовки, и он использует Perl (!) скрипт для извлечения информации о наборе тестов из ваших заголовков (наборы наследуются от CxxTest::Base, имена всех ваших методов тестирования начинаются с "test").Очевидно, что для этого требуется, чтобы вы получили Perl из один источник или другой, что увеличивает накладные расходы на настройку среды сборки.
Я использую Единичный тест++.
За годы, прошедшие с тех пор, как я написал этот пост, исходный код переместился из SourceForge в github.Кроме того, примерный учебник теперь он более независим - вообще не входит в какие-либо конфигурации или настройки проекта.
Я сомневаюсь, что это все еще будет работать для Visual Studio 6, поскольку файлы проекта теперь создаются с помощью CMake.Если вам все еще нужна поддержка более старой версии, вы можете получить последнюю доступную версию в разделе Кузница- источник филиал.
Все инструменты, которые были упомянуты здесь, являются инструментами командной строки.Если вы ищете более интегрированное решение, взгляните на студия cfix, который является надстройкой Visual Studio для модульного тестирования C / C ++.Он очень похож на TestDriven.Net, но для (неуправляемого) C / C ++, а не .NET.
Я использовал CPP- блок с VS2005 и Eclipse.Вики очень тщательна (особенно если вы знакомы с JUnit).
Я не уверен на 100% насчет VS2008, но я знаю, что платформа модульного тестирования, поставляемая Microsoft в VS2005 как часть их Team Suite, была предназначена только для .NET, а не для C ++
Я также использовал CppUnit, и все было в порядке.Почти то же самое, что NUnit / JUnit / и так далее.
Если вы использовали boost, они также есть библиотека модульного тестирования
У ребят, стоящих за boost, есть кое-что серьезный отбивные для кодирования, поэтому я бы сказал, что их фреймворк должен быть довольно хорошим, но он может быть не самым удобным для пользователя :-)
Мне также нравится CxxTest по тем же причинам.Это только заголовочный файл, поэтому никаких ссылок не требуется.Вы не зациклены на Perl, так как есть еще и Python runner.Скоро я ознакомлюсь с библиотекой Google.Бустеры тянут за собой слишком много другого багажа.
Модульный тестер для Visual Studio 2008 предназначен только для .ЧИСТЫЙ код, насколько я знаю.
Я использовал CppUnit в Visual Studio 2005 и обнаружил, что он довольно хорош.
Насколько я помню, установка прошла относительно безболезненно.Просто убедитесь, что в ваших тестовых проектах компоновщик (Linker → Input → Дополнительные зависимости) включает cppunitd.lib.
Тогда, #include <cppunit/extensions/HelperMacros.h>
в вашем заголовке.
Затем вы можете выполнить действия, описанные в разделе http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html чтобы заставить ваш тестовый класс работать.
Я страдал от реализации модульного тестирования для неуправляемого приложения на C ++ в среде Windows с Visual Studio.Итак, мне удалось преодолеть это и я написал пост в качестве пошагового руководства по модульному тестированию неуправляемых приложений на C ++.Я надеюсь, что это поможет вам.