Peasy 1.2.0

Peasy 1.2.0

Kane Cheshire 维护。



Peasy 1.2.0

Peasy

Actions Status Version License Platform

Closed Issues Open Issues

一个纯粹的 Swift 编写的轻量级模拟服务器,可以直接在 UI 测试中运行,无需在测试过程中启动任何外部进程。🎉

快速开始

简单地在测试中创建并启动一个服务器,然后告诉它对于请求应该如何响应

import XCTest
import Peasy

class MyUITest: XCTestCase {

  let server = Server()

  override func setUp() {
    server.start() // Default port is 8880
    let ok = Response(status: .ok)
    server.respond(with: ok, when: .path(matches: "/"))
  }

  func test_someStuff() {
    // Run your tests that cause the app to call https://:8880/
  }

}

启动和停止服务器

要启动一个 Peasy 服务器,只需调用 start

let server = Server()
server.start()

默认情况下,Peasy 会选择系统上可用的任何端口来启动服务器,但您可以覆盖这一点以选择任何特定端口

server.start(port: 8080)

注意:不支

注意:iOS 模拟器与您的 Mac 共享相同的网络,因此您可以通过终端、Safari 或 Postman 在您的 Mac 上与 Peasy 服务器直接通信。

要停止服务器(例如,当测试结束),只需调用 stop

server.stop()

配置响应

默认情况下,Peasy不知道如何响应发送给它的任何请求。

您需要告诉Peasy如何响应,这通过构建一组规则来实现,这些规则必须针对传入的请求有效

let response = Response(status: .ok)
server.respond(with: response, when: .path(matches: "/"))

您可以为响应提供多个规则以进一步筛选,例如,仅匹配"/"路径的GET请求

server.respond(with: response, when: .path(matches: "/"), .method(matches: .get))

现在,每当Peasy接收到匹配根路径"/"GET请求时,它将使用空响应200 OK进行响应。

如果您觉得Peasy的内置规则都不适用,您可以始终提供自定义处理程序

let customRule: Rule = .custom { request in
  return request.path.contains("/common/path")
}
server.respond(with: response, when: customRule)

默认和覆盖响应

通常,您可能想为请求设置一个“默认”响应,但有时想覆盖它。

例如,在一个UI测试中,您可能希望将默认响应设置为成功路径,然后测试如果再次发出请求时得到不同的响应会发生什么。

Peasy通过允许您使用removeAfterResponding指示一组规则匹配后是否删除来支持这一点

server.respond(with: happyPathResponse, when: .path(matches: "/api")) // removeAfterResponding defaults to false, so this will persist

server.respond(with: unhappyPathResponse, when: .path(matches: "/api"), removeAfterResponding: true) // This will match before the happy path response and will be removed after responding

在多个配置匹配请求的情况下(如上所述),Peasy将使用最后一组配置(上面的不愉快路径)进行响应。由于我们还在告知不愉快路径响应在响应后删除,因此Peasy将接着使用第一组配置(快乐路径)进行匹配,直到设置新的覆盖响应。

延迟请求

您可能希望减速Peasy服务器的响应,例如编写UI测试来测试在请求超时的情况下会发生什么。

Peasy使这变得非常简单,只需在配置响应时提供一个时间间隔即可

server.respond(with: response, when: .path(matches: "/api"), delay: 60)

默认情况下,Peasy将立即对您告诉它响应的请求进行响应。如果您希望有延迟,则必须提供显式的延迟。

拦截请求

有时你可能想知道Peasy何时收到请求,以便你可以知道如何响应或采取某些其他操作,例如跟踪某些请求(例如,分析)。

Peasy通过允许你提供一个处理程序来返回响应,将请求作为参数提供给你来实现这一点

var analytics: [Request] = []
server.respond(with { request in
  analytics.append(request)
  return response
}, when: .path(matches: "/analytics-event"))

路径中的通配符和变量

在路径中使用通配符和变量是很常见的。Peasy通过允许你使用:variable语法指示路径的哪些部分可以动态变化来实现这一点

server.respond(with: response, when: .path(matches: "/constant/:variable"))

后的名称可以是你喜欢的任何名称,但该路径组件必须存在,否则规则将无法匹配(例如,"/constant/"不是有效的,但"/constant/value"是)。

如果你想获取变量的值,可以使用请求上的键值子脚本来实现

server.respond(with { request in
  print("The value is", request["variable"])
  return response
}, when: .path(matches: "/constant/:variable"))

常见问题

问题: Peasy是否在真实的设备上运行?

答案:是的!Peasy使用了iOS和macOS开源部分的底层Darwin API。


问题:这可能出错吗?

答案:从技术上讲,是的,但这些API已经存在很长时间,而且没有被弃用。


问题:我可以在我的App Store应用程序中使用这个吗?

答案:Peasy旨在设计用于UI测试,但也适用于常规应用程序。Peasy不使用任何私有API,因此不应被拒绝,但它也将取决于你使用Peasy的目的。

致谢

Peasy受到了Envoy的Embassy服务器的很大启发,但它做得太多,对于我想要实现的目标来说,它太复杂了。Peasy的界面设计得尽可能简单和易于访问。

没有Envoy的辛勤工作,Peasy就不会存在。