Visual Studio C ++の単体テストを設定する方法


93

おそらく組み込みの単体テストスイートを使用して、Visual Studio 2008でテストフレームワークをセットアップして使用できるようにする方法を理解するのに苦労C++しています。

リンクやチュートリアルをいただければ幸いです。


Googleは、xUnitフレームワークと非常によく似たC ++テストフレームワークをリリースしました。http://code.google.com/p/googletest/
popopome 2008

最終的にどのフレームワークを使用しましたか?
Joakim Karlsson、

実際にはまだ使用していません。ユニットテストに取り組んでいることは、時間の最も効果的な使用ではないと判断しました。
DShook 2009年

回答:


56

このページは役に立つかもしれません、それはかなりの数のC ++ユニットテストフレームワークをレビューします:

  • CppUnit
  • ブーストテスト
  • CppUnitLite
  • NanoCppUnit
  • ユニット++
  • CxxTest

CPPUnitLiteまたはCPPUnitLite2を確認してください。

CPPUnitLiteは、JavaのJUnitをC ++にCPPUnitとして移植したMichael Feathersによって作成されました(CPPUnitはJUnitの開発モデルを模倣しようとしますが、C ++にはJavaの機能(反射など)がないため使いやすくなっています)。

CPPUnitLiteは、C ++に移植されたJavaではなく、真のC ++スタイルのテストフレームワークを作成しようとします。(私はフェザーのレガシーコードを使った効果的な作業から言い換えています)。CPPUnitLite2は、より多くの機能とバグ修正を備えた、別の書き直しのようです。

また、CPPUnitLite2や他のいくつかのフレームワークからのものを含むUnitTest ++を偶然見つけました。

マイクロソフトはWinUnitをリリースしました

CatchまたはDoctestもチェックアウトします


2
Googletestはboost :: testとよく似ていますが、VSに統合するのが少し簡単です
Martin Beckett

3
Catchがここに記載されていないことに驚いています。また、チェックアウトのdoctest -チェックアウト-コンパイル速度に大きな焦点とキャッチの私の再実装よくある質問 2の間で異なるいただきました!参照するには
onqtam

1
@onqtamは驚いてはいけない、この質問/回答は2008年からだった!あなたが提案したリンクを追加しました。
アードバーク2016年

24

Visual Studio 2008内の組み込みのテストフレームワークを使用して、アンマネージC ++をテストする方法があります。C ++ / CLIを使用してC ++テストプロジェクトを作成すると、アンマネージDLLを呼び出すことができます。アンマネージC ++で記述されたコードをテストする場合は、共通言語ランタイムのサポートを/ clr:safeから/ clrに切り替える必要があります。

ここに私のブログのステップバイステップの詳細があります:http : //msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
これはあなたのC ++コードに特定の制限を課します、私はそのヘッダーをC ++ / CLIコードにインクルードすることを試みることはそれが価値があるよりも問題であった少なくとも1つのコードベースを持っています。C ++ / CLIを使用することの私にとっての大きな利点は、mbUnit / NUnit / xUnit.NetのRowTestなどの属性を持つファンキーなパラメーター化テストを使用できることです
Andy Dent

9

MicrosoftでIIS URL書き換えモジュールをテストするために使用する方法は次のとおりです(コマンドラインベースですが、VSでも機能するはずです)。

  1. ソースコードをcppファイルに移動し、必要に応じて前方宣言を使用して、ヘッダーファイルが消費可能であることを確認します。
  2. ライブラリー(.lib)としてテストするコードをコンパイルします。
  3. UnitTestプロジェクトをCLRサポート付きのC ++として作成します。
  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()ネイティブ関数を宣言するだけです。マクロも、トリックも、率直なものもありません。

現在、headeファイルはオプションですが、C ++ネイティブシグネチャ(Stirng ^ではなくwchar_t *など)でAssertクラスのメソッドを公開するために使用できるため、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ではなく.dllを作成します)。プロジェクトをビルドして、WinUnit.exeにテスト出力ディレクトリを指定すると、見つかったすべてのものが実行されます。WinUnitプロジェクトはこちらからダウンロードできます。(MSDNでは、記事ではなく、問題全体をダウンロードする必要があります。WinUnitが含まれています。)


4

VS9に含まれているフレームワーク .NETですが、C ++ / CLIでテストを作成できます。.NETのISMを習得できる限り、ほとんどすべてのC ++コードをテストできます。

boost.testgoogletestは かなり似ているように見えますが、少し異なる用途に適応しています。これらの両方にバイナリコンポーネントがあるため、テストをコンパイルして実行するには、ソリューションに追加のプロジェクトが必要です。

私たちが使用するフレームワークはCxxTestで、はるかに軽量です。これはヘッダーのみであり、Perl(!)スクリプトを使用してヘッダーからテストスイート情報を取得します(スイートはCxxTest :: Baseを継承し、すべてのテストメソッド名は「test」で始まります)。明らかに、これはあなたからPerlを入手する必要があり一つのソースまたは別のビルド環境のセットアップにオーバーヘッドが追加されます。


CxxTestはperlの代わりにpythonを使用できます
Martin Beckett、

また、コードで必要なDLLについても注意する必要があります。C++ / CLIコードをテストするNUnitおよびmbUnitで、DLLをロードしようとして問題が発生しました。
Andy Dent

2

UnitTest ++を使用しています

私がこの記事を書いてから数年で、ソースはSourceForgeからgithubに移動しました。また、サンプルチュートリアルはより不可知論的です。設定やプロジェクトの設定は一切行われません。

プロジェクトファイルがCMakeを介して作成されるようになったので、Visual Studio 6でも引き続き機能するとは思いません。それでも古いバージョンのサポートが必要な場合は、SourceForgeブランチで最新の利用可能なバージョンを取得できます。


2

ここで言及したツールはすべてコマンドラインツールです。より統合されたソリューションを探す場合は、C / C ++ユニットテスト用のVisual Studioアドインであるcfix studioご覧ください。これはTestDriven.Netとよく似ていますが、.NETではなく(アンマネージド)C / C ++用です。


1

私はVS2005とEclipseでCppUnitを使用しました。Wikiは非常に詳細です(特にJUnitに精通している場合)。


1

VS2008については100%確実ではありませんが、マイクロソフトがVS2005でチームスイートの一部として出荷した単体テストフレームワークは、C ++ではなく.NETのみでした。

CppUnitも使用しましたが、問題ありませんでした。NUnit / JUnit /などとほとんど同じです。

ブーストを使用したことがある場合は、ユニットテストライブラリもあります。

ブーストの背後にいる人たちはいくつかの深刻なコーディングチョップを持っているので、彼らのフレームワークはかなり良いはずですが、それは最もユーザーフレンドリーではないかもしれません:-)


1

同じ理由でCxxTestも好きです。これはヘッダーファイルのみであるため、リンクは必要ありません。Pythonランナーもあるので、Perlに悩まされることはありません。私はすぐにgoogleライブラリを確認します。Boostのものは、他の手荷物を多すぎます。


1

Visual Studio 2008の単体テスターは、私の知る限り.NETコード専用です。

Visual Studio 2005でCppUnitを使用しましたが、かなり良いことがわかりました。

私の記憶では、セットアップは比較的簡単でした。テストプロジェクトでリンカー(リンカー→入力→追加の依存関係)にcppunitd.libが含まれていることを確認してください。

次に、#include <cppunit/extensions/HelperMacros.h>ヘッダーで。

その後、http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.htmlの手順に従って、テストクラスを機能させることができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.