背景
fastmonkey 是一款ios上的稳定性测试工具,可以插入一些序列事件,比如自动登录的逻辑,由于我司产品自动登录需要依赖短信验证码,因此自动登录的逻辑就是在执行过程中,通过自动化Ui点击发送验证码,并使用网络请求接口去查询短信验证码回填后登录。本文适合对fastmonkey有一定使用经验的人阅读…
网络请求
过程中涉及到网络请求,考虑到对于swift语言不熟悉,自然想到依赖第三方库, 通过一番搜索,发现swift中的Alamofire是比较常用的,因此选择这个,先看下Alamofire的普通get请求,就知道它有多优雅了:
Alamofire.request( "https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json").responseJSON { (response) in
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
集成并使用
fastmonkey项目使用swift开发,使用carthage进行包管理,由于调用xctest的私有api,因此具有高效率的自动化操作动作,但仅限于xcode10使用,原因是xcode10以上已经移除了相关私有api,仅能使用公共api,操作效率大打折扣。因此,本文使用xcode10进行项目构建,所以 用的是 Alamofire4
安装
cartfile文件里新增一行:
github "Alamofire/Alamofire" == 4.9.0
随后使用一下命令安装完依赖:
carthage update --platform iOS
执行
执行过程可能会报错,我遇到的一个错误是:
dyld: lazy symbol binding failed: can't resolve symbol 或
未能载入软件包“XCTestWDUITests”,因为它已损坏或丢失必要的资源。 请尝试重新安装软件包。
考虑到是和使用Alamofire相关,具体就是这个模块找不到之类的,但是我确实安装了,由于跑的是UItests的target,就到该target下找,发现在Build Phases下的Copy Files并没有加入Alamofire的framework,加上就好了。Alamofire.framework路径在:
/path_to_project/fastmonkey/XCTestWD-master/Carthage/Build/iOS

ps:由于Alamofire是异步操作的,可能网络请求还没进行完,后续的代码也开始执行了,因此需要把Alamofire变为同步操作,方便获取到接口数据后再做下一步操作
修改Alamofire为异步操作
发现Alamofire不支持同步操作(也可能是我太菜了,还不会使用闭包解决),所以我改用了基础的NSURLSession发起同步的网络请求,封装成一个函数用的时候调用下,就能返回手机验证码,具体代码如下:
public func getLoginSmsCode(phone:String) -> String{
// 1 获取数据
// 2 同步请求
print("请求发送验证码...")
var smsCode = ""
//创建URL对象
let urlString:String="http://xxxxxxxxx.com/get"
//form-data
let postStr = "selEnv=测试环境&catgory=更换设备验证手机号&phone=\(phone)"
let url = URL(string:urlString)
//创建请求对象
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Types")
request.httpBody = postStr.data(using: .utf8)
let session = URLSession.shared
let semaphore = DispatchSemaphore(value: 0)
let dataTask = session.dataTask(with: request,
completionHandler: {(data, response, error) -> Void in
if error != nil{
}else{
let str = String(data: (data)!, encoding: String.Encoding.utf8)
let resultJson = JSON.init(parseJSON:str!)
smsCode = resultJson[1][0].rawString()!
}
semaphore.signal()
}) as URLSessionTask
//使用resume方法启动任务
dataTask.resume()
_ = semaphore.wait(timeout: DispatchTime.distantFuture)
print("获取验证码完成..!")
return smsCode
}
这样调用即可
let smsCode = getLoginSmsCode(phone: "180xxxxxxxx")
模拟器调试是可以的,但是真机显示 HTTP load failed (error code: -1009,-1009是NSURLErrorNotConnectedToInternet的错误码,也就是没有网络,折腾了我好几天,最后就是在手机上重复打开那个UITEST的工程,授权下网络即可,如果还不行可以试试 设置->开发者->PASSKIT TESTING->勾选Allow HTTP Services
参考自:
https://www.cnblogs.com/dapped/p/8891128.html
https://www.jianshu.com/p/390890795730
https://www.jianshu.com/p/55ec0d466fd9
本文介绍了如何在iOS稳定性测试工具fastmonkey中利用Carthage集成网络库Alamofire,并解决在集成过程中遇到的问题。在使用过程中,由于Alamofire默认为异步操作,为了方便控制流程,文章还讲述了如何将Alamofire的网络请求改为同步操作的方法。同时,文中提到在真机调试时遇到的网络权限问题及其解决办法。

被折叠的 条评论
为什么被折叠?



