TL;DR
- LocalPackageのテストがmainのschemeのテストと一緒に実行できなくてハマった。
- メインのschemeにTestTargetを追加したらできるようになった。
はじめに
SwiftPackageManagerが市民権を得てきたことや有名企業のマルチモジュール化に関する発表したことを機に、iOSアプリ開発でもマルチモジュール化の流れが来ている気がしています。
iOSアプリのプロジェクトをマルチモジュール化していくにあたり、機能ごとやレイヤーごとにPackageを分割していく方法を採用してみたのですが、LocalPackageのTestを実行するのにハマってしまいました。
単純な解決方法だったんですが、あんまりネットに情報がなくて個人的に困ったので投稿します。
※SwiftPackageManagerについては以下を参照下さい。
LocalPakageのTestTargetとはどこのことか
ProjectにLocalPackageを追加すると以下のようなディレクトリが追加されます。
↓MyLibraryという名前にした場合
MyLibrary
├── Package.swift
├── README.md
├── Sources
│ └── MyLibrary
│ └── MyLibrary.swift
└── Tests
└── MyLibraryTests
└── MyLibraryTests.swift
※LocalPackageの追加方法はこちらを参照下さい。
この時Test用のTargetもMyLibraryTests
として追加されます。
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "MyLibrary",
dependencies: []),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
]
今回実行したいTestはこのMyLibraryTests
に記載しているテスト達です。
LocalPackageのテストを個別に実施する。
上記のMyLibraryTests
のみを動かす場合はschemeをMyLibrary
に変更すれば実行可能になります。
実行したいテストに対して▶️
を押して実行しても良いですし、command+UでMyLibraryTests
のテストを全て実行することもできます。
一方で、schemeをMyLibrary
にしている場合はそれ以外のテストは実行できません。
逆にschemeをメインのものに戻すと、今度はMyLibrary
のテストが実行できなくなります。
この状態だと、例えばfastlane scanでテストを実行している時に、MyLibraryTests
のテストが実行されずにCIを通過してしまいます。
ということがあり困ったのでした。
LocalPackageのTestTargetをメインのschemeに追加して全TestTargetのテストを一度に実行できるようにする。
上記の問題を解決するには、タイトルの通りメインのschemeにTestTargetを追加する必要があります。
どういうことかと言うと、以下のようにEditSchemeからMyLibrary
のTestTargetを追加すると一緒にテストが実行可能になります。
この作業をしないと追加したLocalPackageのテストをメインのTargetのテストと一緒に実行できないのでした。
単純なことでしたが結構ハマってしまったので同じようにハマっている人がいたこちらで解決できると嬉しいです。
[おまけ]testTarget達はxctestplanにまとめておくと便利
僕はxctestplanを使ってschemeに追加するtestTargetをまとめています。
xctestplanにまとめておくことで、localizationを切り替えてregionごとにテストが実行できたりするみたいです。
まとめ
- LocalPackageのUnitTestがcommand+Uで実行できなくてハマった。
- メインのschemeにLocalPackageのTestTargetを追加したらできるようになった。