Một triển khai Swift:
Swift 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)
Gói cung cấp các cách để khám phá các đường dẫn chính và thử nghiệm cho cấu hình của bạn:
@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
Trong Xcode 6 | 7 | 8 | 9, đường dẫn gói kiểm tra đơn vị sẽ ở Developer/Xcode/DerivedData
dạng ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... tách biệt với Developer/CoreSimulator/Devices
đường dẫn gói thông thường (không kiểm tra đơn vị) :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Cũng lưu ý rằng thực thi kiểm tra đơn vị, theo mặc định, được liên kết với mã ứng dụng. Tuy nhiên, mã kiểm tra đơn vị chỉ nên có Tư cách thành viên mục tiêu chỉ trong gói thử nghiệm. Mã ứng dụng chỉ nên có Tư cách thành viên trong gói ứng dụng. Khi chạy, gói mục tiêu thử nghiệm đơn vị được đưa vào gói ứng dụng để thực thi .
Trình quản lý gói Swift (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Lưu ý: Theo mặc định, dòng lệnh swift test
sẽ tạo một MyProjectPackageTests.xctest
gói thử nghiệm. Và, swift package generate-xcodeproj
sẽ tạo ra một MyProjectTests.xctest
gói thử nghiệm. Những gói thử nghiệm khác nhau có đường dẫn khác nhau . Ngoài ra, các gói thử nghiệm khác nhau có thể có một số khác biệt về cấu trúc thư mục và nội dung .
Trong cả hai trường hợp, .bundlePath
và .bundleURL
sẽ trả về đường dẫn của gói thử nghiệm hiện đang được chạy trên macOS. Tuy nhiên, Bundle
hiện không được triển khai cho Ubuntu Linux.
Ngoài ra, dòng lệnh swift build
và swift test
hiện không cung cấp cơ chế sao chép tài nguyên.
Tuy nhiên, với một số nỗ lực, có thể thiết lập các quy trình sử dụng Swift Gói Manger với các tài nguyên trong macOS Xcode, dòng lệnh macOS và môi trường dòng lệnh Ubuntu. Một ví dụ có thể được tìm thấy ở đây: 004.4'2 SW Dev Swift Gói Manager (SPM) với Tài nguyên Qref
Xem thêm: Sử dụng tài nguyên trong các bài kiểm tra đơn vị với Trình quản lý gói Swift
Trình quản lý gói Swift (SPM) 4.2
Trình quản lý gói Swift Gói mô tả 4.2 giới thiệu hỗ trợ các phụ thuộc cục bộ .
Phụ thuộc cục bộ là các gói trên đĩa có thể được gọi trực tiếp bằng đường dẫn của chúng. Các phụ thuộc cục bộ chỉ được phép trong gói gốc và chúng ghi đè tất cả các phụ thuộc có cùng tên trong biểu đồ gói.
Lưu ý: Tôi hy vọng, nhưng chưa được thử nghiệm, rằng điều gì đó như sau có thể xảy ra với 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"]
),
]
)