一个有观点的桩模拟机。
Stubborn Network 通过模拟网络请求的响应,使您的 SwiftUI 开发更高效 且 UI 测试更可靠。它使您 轻松记录新的桩模拟 并提高效率!
桩模拟 UI 测试
UI 测试通过 The Stubborn Network 轻易记录实际网络请求并回放的方式受益。这使得您的测试更稳定,后端不会干扰您测试应用程序的流程。
为了记录和播放桩模拟,您需要
- 配置您的
URLSession
在运行测试时在您的网络层中使用 The Stubborn Network 的URLProtocol
- 另一方面,测试需要通知 The Stubborn Network 哪些 桩模拟源,换句话说,为哪个测试用例使用哪些桩模拟
应用程序配置
自定义的 URLProtocol
将使您的网络客户端的标准 URLSession
在 UI 测试执行期间成为桩模拟变体。这发生在应用程序内部
设置自定义 URL 协议的示例
let configuration = URLSessionConfiguration.default
if ProcessInfo().isUITesting {
StubbornNetwork.standard.insertStubbedSessionURLProtocol(into: configuration)
StubbornNetwork.standard.bodyDataProcessor = SensitiveDataProcessor()
StubbornNetwork.standard.requestMatcherOptions = RequestMatcherOptions([.requestBody, .url, .httpMethod])
}
let urlSession = URLSession(configuration: configuration)
测试配置
将环境变量作为参数传递给受测试的应用程序,以指定我们想要模拟网络响应,要模拟什么,在哪里找到/放置它们。其中一些将在未来得到更优雅的处理
- 每个测试都将其函数名称分配给
STUB_NAME
,以创建一个用于单独测试用例网络请求的专用桩模拟源 "STUB_PATH"
指向包含桩模拟的桩模拟源存储的目录THE_STUBBORN_NETWORK_UI_TESTING
参数简单地告诉应用(参看上方的应用配置)我们正处于测试环境中。这有助于区分测试和调试/发布模式。
示例 UI 测试
override func setUp() {
super.setUp()
app = XCUIApplication()
setupSnapshot(app)
let processInfo = ProcessInfo()
app.launchEnvironment["STUB_NAME"] = self.name
app.launchEnvironment["STUB_PATH"] = "\(processInfo.environment["PROJECT_DIR"] ?? "")/BTLBUITests/Stubs"
app.launchEnvironment["THE_STUBBORN_NETWORK_UI_TESTING"] = "YES"
app.launch()
}
func testBytesText() {
/// In the test itself nothing needs to be changed
app.buttons["Download"].tap()
let bytesText = app.staticTexts["417 bytes"]
wait(forElement:bytesText, timeout:1)
}
重录占位符
如果需要重新记录占位符,只需将其删除即可!
您可以在测试用例中定义的路径中找到占位符,它们通常看起来像这样:
XZYUITests_testABC.json
XZYUITests
是您测试用例()的名称,而
testABC
是测试的名称(测试函数)。
贡献
运行测试
您可以从 Xcode 内(使用 cmd+U
)或从命令行运行测试:export STUB_DIR='./stubs' && swift test
。
占位符在测试执行期间进行存储和读取。它们通常可以在临时目录中找到,例如:"file:///private/tmp/StubbornNetworkTests/67BED946-88E0-4F8C-98C7-7A23812D647A-3620-000001390930169C"