この記事は2020年06月16日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIで単体テストを行う方法についてです。
2. C++/CLIで単体テストを行う/a>
C++/CLIで単体テストを行うには、以下のような手順になります。 なお今回はVisual Studio2015を対象とします。
- C++/CLIのプロジェクトを作成します。 今回はWindowsフォームプロジェクトとします。
- 1で作成したプロジェクトのソリューションに、Visual C++のテストの"マネージテストプロジェクト"を追加します。
- テストプロジェクトの参照に、Windowsフォームに必要なSystem.Drawing、System.Windows.Formsを追加します。 テスト対象に応じて参照を追加していきます。
- 以下のような実装にします。
実装例
テスト対象のクラス
MainForm.h
#pragma once // protected, privateの関数、変数にアクセスするための対応 #ifndef _UNIT_TEST_ #define PROTECTED protected: #define PRIVATE private: #else #define PROTECTED public: #define PRIVATE public: #endif namespace CLIUnitTest { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// MainForm の概要 /// </summary> public ref class MainForm : public System::Windows::Forms::Form { public: MainForm(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~MainForm() { if (components) { delete components; } } private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> void InitializeComponent(void) { this->components = gcnew System::ComponentModel::Container(); this->Size = System::Drawing::Size(300,300); this->Text = L"MainForm"; this->Padding = System::Windows::Forms::Padding(0); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; } #pragma endregion PRIVATE // テスト対象の関数 int Square(int x) { return x * x; } }; }
MainForm.cpp
#include "MainForm.h" using namespace CLIUnitTest; [STAThreadAttribute] int main() { MainForm^ form = gcnew MainForm(); form->ShowDialog(); return 0; }
単体テストクラス
UnitTest.cpp
#include "stdafx.h" // テスト対象クラスのprotected, private関数、変数にアクセスための対応 #define _UNIT_TEST_ // テスト対象クラスのヘッダ #include "../CLIUnitTest/MainForm.h" // 以下、ウィザードにより自動生成されます。 using namespace System; using namespace System::Text; using namespace System::Collections::Generic; using namespace Microsoft::VisualStudio::TestTools::UnitTesting; using namespace CLIUnitTest; namespace CLIUnitTestTest { [TestClass] public ref class CLIUnitTestTest { private: TestContext^ testContextInstance; public: /// <summary> ///現在のテストの実行についての情報および機能を ///提供するテスト コンテキストを取得または設定します。 ///</summary> property Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ TestContext { Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ get() { return testContextInstance; } System::Void set(Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ value) { testContextInstance = value; } }; #pragma region Additional test attributes // //テストを作成する際には、次の追加属性を使用できます: // //クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください //[ClassInitialize()] //static void MyClassInitialize(TestContext^ testContext) {}; // //クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください //[ClassCleanup()] //static void MyClassCleanup() {}; // //各テストを実行する前に、TestInitialize を使用してコードを実行してください //[TestInitialize()] //void MyTestInitialize() {}; // //各テストを実行した後に、TestCleanup を使用してコードを実行してください //[TestCleanup()] //void MyTestCleanup() {}; // #pragma endregion // ウィザードによる自動生成(ここまで) // テスト用関数 // テスト用関数には"[TestMethod]"を付加します。 [TestMethod] void TestSquare01() { MainForm^ mainForm = gcnew MainForm(); int result = mainForm->Square(2); // Asert::XXXで実行結果を検証します。 Assert::AreEqual(4, result); }; }; }
3. おわりに
前回
と同様、今回はC++/CLIの単体テストについて紹介しました。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688