Implementasi Swift:
Cepat 2
let testBundle = NSBundle(forClass: self.dynamicType)
let fileURL = testBundle.URLForResource("imageName", withExtension: "png")
XCTAssertNotNil(fileURL)
Swift 3, Swift 4
let testBundle = Bundle(for: type(of: self))
let filePath = testBundle.path(forResource: "imageName", ofType: "png")
XCTAssertNotNil(filePath)
Bundle menyediakan cara untuk menemukan jalur utama dan uji untuk konfigurasi Anda:
@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
Dalam Xcode 6 | 7 | 8 | 9, jalur bundel unit-test akan berada dalam Developer/Xcode/DerivedDatasesuatu seperti ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... yang terpisah dari Developer/CoreSimulator/Devices jalur bundel (non-unit-test) biasa :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Perhatikan juga bahwa unit test executable, secara default, terhubung dengan kode aplikasi. Namun, kode tes unit hanya boleh memiliki Keanggotaan Target hanya di bundel tes. Kode aplikasi seharusnya hanya memiliki Keanggotaan Target dalam bundel aplikasi. Saat runtime, bundel target uji unit disuntikkan ke bundel aplikasi untuk dieksekusi .
Manajer Paket Swift (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Catatan: Secara default, baris perintah swift testakan membuat MyProjectPackageTests.xctestbundel uji. Dan, swift package generate-xcodeprojakan membuat MyProjectTests.xctestbundel uji. Kumpulan uji yang berbeda ini memiliki jalur yang berbeda . Juga, kumpulan uji yang berbeda mungkin memiliki beberapa struktur direktori internal dan perbedaan konten .
Dalam kedua kasus tersebut, .bundlePathdan .bundleURLakan mengembalikan jalur bundel pengujian yang saat ini sedang dijalankan di macOS. Namun, Bundlesaat ini tidak diterapkan untuk Ubuntu Linux.
Juga, baris perintah swift builddan swift testsaat ini tidak menyediakan mekanisme untuk menyalin sumber daya.
Namun, dengan beberapa upaya, dimungkinkan untuk mengatur proses untuk menggunakan Swift Package Manger dengan sumber daya di macOS Xcode, baris perintah macOS, dan lingkungan baris perintah Ubuntu. Salah satu contoh dapat ditemukan di sini: 004.4'2 SW Dev Swift Package Manager (SPM) Dengan Resources Qref
Lihat juga: Gunakan sumber daya dalam pengujian unit dengan Swift Package Manager
Manajer Paket Swift (SPM) 4.2
Package Manager Swift PackageDescription 4.2 memperkenalkan dukungan dependensi lokal .
Ketergantungan lokal adalah paket pada disk yang dapat dirujuk langsung menggunakan jalurnya. Ketergantungan lokal hanya diperbolehkan dalam paket root dan menimpa semua dependensi dengan nama yang sama dalam grafik paket.
Catatan: Saya perkirakan, tetapi belum diuji, bahwa sesuatu seperti yang berikut ini dimungkinkan dengan SPM 4.2:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)