スイフト5.3
注: Swift 5.3 には、アプリケーション バンドルおよびテスト バンドル リソースで使用できるPackage Manager Resources SE-0271機能が含まれています。
リソースは、パッケージのクライアントによる使用を常に意図しているわけではありません。リソースの 1 つの用途には、単体テストでのみ必要なテスト フィクスチャが含まれる場合があります。このようなリソースは、ライブラリ コードと共にパッケージのクライアントに組み込まれることはなく、パッケージのテストの実行中にのみ使用されます。
スウィフト 4、5:
let testBundle = Bundle(for: type(of: self))
guard var fileUrl = testBundle.url(forResource: "imageName", withExtension: "png")
else { fatalError() }
// path approach
guard let filePath = testBundle.path(forResource: "dataName", ofType: "csv")
else { fatalError() }
let fileUrl = URL(fileURLWithPath: filePath)
バンドルは、構成のメイン パスとテスト パスを検出する方法を提供します。
@testable
import Example
class ExampleTests: XCTestCase {
func testExample() {
let bundleMain = Bundle.main
let bundleDoingTest = Bundle(for: type(of: self ))
let bundleBeingTested = Bundle(identifier: "com.example.Example")!
print("bundleMain.bundlePath : \(bundleMain.bundlePath)")
// …/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Agents
print("bundleDoingTest.bundlePath : \(bundleDoingTest.bundlePath)")
// …/PATH/TO/Debug/ExampleTests.xctest
print("bundleBeingTested.bundlePath : \(bundleBeingTested.bundlePath)")
// …/PATH/TO/Debug/Example.app
print("bundleMain = " + bundleMain.description) // Xcode Test Agent
print("bundleDoingTest = " + bundleDoingTest.description) // Test Case Bundle
print("bundleUnderTest = " + bundleBeingTested.description) // App Bundle
Xcode URL は次のDeveloper/Xcode/DerivedData
ようになります...
file:///Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
imageName.png
Developer/CoreSimulator/Devices
... URLとは別のもの
file:///Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
また、単体テストの実行可能ファイルは、デフォルトでアプリケーション コードにリンクされていることにも注意してください。ただし、単体テスト コードには、テスト バンドルのみにターゲット メンバーシップのみを含める必要があります。アプリケーション コードには、アプリケーション バンドル内のターゲット メンバーシップのみを含める必要があります。実行時に、単体テストのターゲット バンドルが実行のためにアプリケーション バンドルに挿入されます。
スウィフト パッケージ マネージャー (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
注: デフォルトでは、コマンド ラインはテスト バンドルswift test
を作成します。MyProjectPackageTests.xctest
そして、 はテスト バンドルswift package generate-xcodeproj
を作成します。MyProjectTests.xctest
これらの異なるテスト バンドルには異なるパスがあります。また、異なるテスト バンドルには、内部ディレクトリ構造とコンテンツの違いがある場合があります。
いずれの場合も、.bundlePath
and.bundleURL
は、現在 macOS で実行されているテスト バンドルのパスを返します。ただし、Bundle
Ubuntu for Swift 4 には現在実装されていません。
また、Swift 4 コマンド ラインは、リソースをコピーするメカニズムを提供swift build
しswift test
ません。
ただし、少し努力すれば、macOS Xcode、macOS コマンド ライン、および Ubuntu コマンド ライン環境のリソースで Swift Package Manger を使用するためのプロセスをセットアップすることができます。一例はここにあります: 004.4'2 SW Dev Swift Package Manager (SPM) With Resources Qref