XCTest テストと CMake のベストプラクティス:FindXCTest モジュールと代替方法の賢い選択


"FindXCTest" は、CMake の "Modules" ディレクトリにあるモジュールで、XCTest フレームワークXCTest 実行可能ファイルを検出して、CMake プロジェクトに統合するための機能を提供します。XCTest は、macOS アプリケーションのユニットテストと統合テストを作成するために使用される Apple のフレームワークです。

機能

"FindXCTest" モジュールは、以下の機能を提供します。

  • XCTest テストの実行
    モジュールは、ctest(1) コマンドを使用して XCTest テストを実行します。
  • XCTest テストバンドルの作成
    モジュールは、xctest_add_bundle マクロを使用して XCTest テストバンドルを作成します。テストバンドルは、XCTest テストを含む CFBundle です。
  • XCTest フレームワークヘッダーとライブラリの場所の設定
    モジュールは、XCTest フレームワークヘッダーとライブラリの場所を CMake 変数に設定します。
  • XCTest フレームワークと実行可能ファイルの検出
    モジュールは、システム上で XCTest フレームワークと実行可能ファイルがインストールされているかどうかを検出します。

使用方法

"FindXCTest" モジュールを使用するには、以下の手順を実行する必要があります。

  1. CMakeLists.txt ファイルに FindXCTest モジュールをロードします。
find_package(XCTest REQUIRED)
  1. xctest_add_bundle マクロを使用して XCTest テストバンドルを作成します。
xctest_add_bundle(MyTests MyTarget)
  1. ctest(1) コマンドを使用して XCTest テストを実行します。
ctest --gtest_output

以下の例は、MyTarget という名前のターゲットに対して XCTest テストバンドルを作成し、ctest(1) コマンドを使用してテストを実行する方法を示しています。

cmake_minimum_required(VERSION 3.3)

find_package(XCTest REQUIRED)

add_executable(MyTarget MyTarget.cpp)

xctest_add_bundle(MyTests MyTarget)

target_link_libraries(MyTarget MyOtherLibrary)

ctest --gtest_output
  • モジュールは、XCTest フレームワークと実行可能ファイルがシステム上にインストールされていることを前提としています。
  • "FindXCTest" モジュールは、macOS プラットフォームでのみサポートされています。


cmake_minimum_required(VERSION 3.3)

find_package(XCTest REQUIRED)

add_executable(MyTarget MyTarget.cpp)

xctest_add_bundle(MyTests MyTarget)

target_link_libraries(MyTarget MyOtherLibrary)

ctest --gtest_output

説明

  • ctest --gtest_output: ctest(1) コマンドを使用して XCTest テストを実行し、テスト結果を GTest 形式で出力します。
  • target_link_libraries(MyTarget MyOtherLibrary): MyTarget ターゲットに MyOtherLibrary ライブラリをリンクします。
  • xctest_add_bundle(MyTests MyTarget): MyTests という名前の XCTest テストバンドルを MyTarget ターゲットに作成します。
  • add_executable(MyTarget MyTarget.cpp): MyTarget という名前のターゲットを作成し、ソースファイル MyTarget.cpp を指定します。
  • find_package(XCTest REQUIRED): "FindXCTest" モジュールをロードし、必須であることを指定します。
  • cmake_minimum_required(VERSION 3.3): CMake バージョン 3.3 以降が必要であることを指定します。
  • MyTarget.cpp は、以下のコードを含むサンプルソースファイルです。
#include <iostream>

int main() {
  std::cout << "Hello, world!" << std::endl;
  return 0;
}
  • MyOtherLibrary は、テスト対象のライブラリです。
  • モジュールは、XCTest フレームワークと実行可能ファイルがシステム上にインストールされていることを前提としています。


手動設定

  • XCTest フレームワークヘッダーとライブラリの場所を設定
    • CMake 変数 XCTEST_FRAMEWORK_DIRXCTEST_FRAMEWORK_LIBRARY を使用して、XCTest フレームワークヘッダーとライブラリの場所を明示的に設定できます。
    • 例:
set(XCTEST_FRAMEWORK_DIR "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Frameworks/XCTest.framework")
set(XCTEST_FRAMEWORK_LIBRARY "XCTest")
  • XCTest テストバンドルの作成
    • add_test コマンドを使用して、手動で XCTest テストバンドルを作成できます。
    • 例:
add_test(MyTests MyTarget)
target_link_libraries(MyTests ${XCTEST_FRAMEWORK_LIBRARY})
  • XCTest テストの実行
    • ctest(1) コマンドを使用して、XCTest テストを実行できます。

第三者製モジュールの使用

  • CTest
    • CTest は、CMake と共に提供されるテストフレームワークです。XCTest テストを実行するための機能も提供しています。

カスタムスクリプトの使用

  • Python スクリプト
    • Python スクリプトを使用して、XCTest フレームワークヘッダーとライブラリの場所を検出し、XCTest テストバンドルを作成し、テストを実行できます。
  • シェルスクリプト
    • シェルスクリプトを使用して、XCTest フレームワークヘッダーとライブラリの場所を検出し、XCTest テストバンドルを作成し、テストを実行できます。

選択の指針

"FindXCTest" の代替方法を選択する際には、以下の点を考慮する必要があります。

  • メンテナンス性
    • 将来的にプロジェクトが変更される可能性が高い場合は、第三者製モジュールを使用する方がメンテナンス性が向上する可能性があります。
  • 開発者のスキルセット
    • 開発者が CMake に精通している場合は、手動設定が適切な選択肢となる可能性があります。
    • 開発者がスクリプト言語に精通している場合は、カスタムスクリプトを使用する方が適切な選択肢となる可能性があります。
  • プロジェクトの複雑性
    • プロジェクトが複雑な場合は、手動設定よりも第三者製モジュールやカスタムスクリプトを使用する方が効率的です。
  • モジュールは、XCTest フレームワークと実行可能ファイルがシステム上にインストールされていることを前提としています。
  • 上記の代替方法はすべて、macOS プラットフォームでのみ使用できます。