Szybkie wdrożenie:
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)
Pakiet zapewnia sposoby odkrywania głównych i testowych ścieżek konfiguracji:
@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
W Xcode 6 | 7 | 8 | 9 ścieżka pakietu testów jednostkowych będzie Developer/Xcode/DerivedData
wyglądała jak ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... który jest niezależny od Developer/CoreSimulator/Devices
zwykłej ścieżki pakietu (nie w ramach testu jednostkowego) :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Należy również pamiętać, że plik wykonywalny testu jednostkowego jest domyślnie powiązany z kodem aplikacji. Jednak kod testu jednostkowego powinien mieć docelowe członkostwo tylko w pakiecie testowym. Kod aplikacji powinien mieć tylko docelowe członkostwo w pakiecie aplikacji. W czasie wykonywania pakiet docelowego testu jednostkowego jest wstrzykiwany do pakietu aplikacji w celu wykonania .
Swift Package Manager (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Uwaga: Domyślnie wiersz poleceń swift test
utworzy MyProjectPackageTests.xctest
pakiet testowy. I swift package generate-xcodeproj
stworzy MyProjectTests.xctest
pakiet testowy. Te różne pakiety testowe mają różne ścieżki . Różne pakiety testowe mogą mieć także wewnętrzną strukturę katalogów i różnice w zawartości .
W obu przypadkach, .bundlePath
i .bundleURL
zwróci ścieżkę pakietu testowego obecnie uruchomionego na macOS. Jednak Bundle
nie jest obecnie zaimplementowany dla Ubuntu Linux.
Ponadto wiersz polecenia swift build
i swift test
obecnie nie zapewniają mechanizmu kopiowania zasobów.
Jednak przy pewnym wysiłku możliwe jest skonfigurowanie procesów do używania Swift Package Manger z zasobami w środowisku macOS Xcode, wierszu poleceń macOS i środowisku wiersza poleceń Ubuntu. Jeden przykład można znaleźć tutaj: 004.4'2 SW Dev Swift Package Manager (SPM) z zasobami Qref
Zobacz także: Używaj zasobów w testach jednostkowych za pomocą Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 wprowadza obsługę lokalnych zależności .
Zależności lokalne to pakiety na dysku, do których można odwoływać się bezpośrednio przy użyciu ich ścieżek. Zależności lokalne są dozwolone tylko w pakiecie głównym i zastępują wszystkie zależności o tej samej nazwie na wykresie pakietu.
Uwaga: spodziewam się, ale jeszcze nie przetestowałem, że w SPM 4.2 powinno być możliwe coś takiego:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)