SwiftNIOMock
这是一个基于 SwiftNIO 的网络服务器,旨在用作 UI 自动化测试中的模拟服务器。
当对实际服务器进行 UI 测试时,可能会遇到几个问题:网络可能不稳定,远程服务器上的内容可能会改变,某些测试场景可能需要外部系统中的一些动作,而且在一般情况下,所有的网络调用都会减慢所有测试。
SwiftNIOMock 通过提供运行在本地的模拟网络服务器实现来解决这些问题,应用在 UI 测试运行时应访问此模拟服务器,而不是真实服务器。与其他解决方案不同,使用模拟服务器不需要使用类似自定义 URLProtocol
的方法,只需将应用切换到 localhost
,并且它提供了更大的灵活性和控制能力,因为服务器由测试控制,您可以在测试场景中更改其状态。
SwiftNIOMock 支持三个常见的场景
-
使用
redirect
中间件将请求重定向到真实服务。这可以用于日志记录目的,可以使调试更容易,因为所有网络日志都将出现在测试运行程序的控制台日志中 -
使用
router
中间件对端点进行模拟。这在您需要更多控制模拟服务器的状态时很有用,并且允许您完全模拟应用发出的所有网络请求(尽管它可以与redirect
中间件一起使用)。通常在测试场景需要外部系统中的动作时需要这样做。当您可以完全控制服务器状态时,可以轻松地伪造这样的操作 -
使用提供
URLSession
实现的redirect
中间件录制和回放网络调用。这可以用来确保测试在不同运行之间接收到相同的数据,并旨在保护以防远程服务器上的不可控更改
使用方式
在测试中,在 setUp
方法中创建一个服务实例并启动它,并提供一个中间件来处理请求。在 tearDown
方法中停止服务器。
override func setUp() {
server = Server(port: 8080, handler: <#Middleware#>)
try! server.start()
}
override func tearDown() {
try! server.stop()
server = nil
}
中间件是一个函数,基于传入的请求可以修改响应。
typealias Middleware = (
_ request: Server.HTTPHandler.Request,
_ response: Server.HTTPHandler.Response,
_ next: @escaping () -> Void
) -> Void
当中间件函数完成对响应的处理后,应调用传递给它的 next
闭合(可以异步调用它),以将控制权返回给服务器。您可以编写自己的中间件或使用 SwiftNIOMock 提供的中间件,如 redirect
、router
和 delay
。以下是一个简单中间件的示例,该中间件可以回显任何传入的请求
func echo(
request: Server.HTTPHandler.Request,
response: Server.HTTPHandler.Response,
next: @escaping () -> Void
) {
response.statusCode = .ok
response.body = request.body
next()
}
redirect
中间件允许您重定向传入请求并拦截响应。它还接受一个 URLSession
实例(默认为 URLSession.shared
会话)来执行请求,这允许它记录和回放所有请求。请查看 SwiftNIOMockExampleUITests.swift
以查看使用 SwiftNIOMock 进行记录和回放模式的示例,该模式由 Vinyl 支持构建。
func redirect(
session: URLSession = URLSession.shared,
request override: @escaping (Server.HTTPHandler.Request) -> Server.HTTPHandler.Request,
response intercept: @escaping (Server.HTTPHandler.Response) -> Void = { _ in }
) -> Middleware
router
中间件允许您根据请求返回任意中间件,即其方法和路径。如果请求无法处理,将使用作为 notFound
参数传递的回退中间件。
func router(
route: @escaping (Server.HTTPHandler.Request) -> Middleware?,
notFound: @escaping Middleware
) -> Middleware
要查看在 UI 测试中使用 SwiftNIOMock 的示例,请查看 SwiftNIOMockExample。
安装
您可以使用 CocoaPods (1.6.0.beta.2)或 Swift 包管理器安装 SwiftNIOMock。