swift 自动化测试

刚刚给公司项目加上自动化测试,分享一下

1、在原来项目的基础上,创建自动化测试 TARGETS




2、修改名称为:项目名-dev(分两步)

第一步:直接双击target,直接修改




第二步:下拉模拟器列表,选中manager schemes,在弹出的窗体直接双击修改




3、修改环境变量,添加 DEV 标签

选中DEV target, Build Settings --> Other Swift Flags --> 添加 -D DEV 两行




4、配置对应的info.plist文件,选中targets,右边选择info文件





5、到这里为止,测试target已经创建完毕,剩下的要写代码了

找到工程文件夹 (工程名UITests)

创建一个swift 文件 (工程名_MonkeyUITest )

上代码:(代码里面的“Sign in” 是登录按钮的title,“UserName” 是登录用户名的输入框的水印文字,“Password” 是密码输入框的水印文字,对应改成你们自己工程的就行)

//

//  sst_MonkeyUITest.swift

//  sst-ios

//

//  Copyright 2016 SST. All rights reserved.

//

import XCTest

class sst_MonkeyUITest:XCTestCase {

var testCnt =0

overridefunc setUp() {

super.setUp()

// Put setup code here. This method is called before the invocation of each test method in the class.

// In UI tests it is usually best to stop immediately when a failure occurs.

continueAfterFailure =true

// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.

XCUIApplication().launch()

// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.

}

overridefunc tearDown() {

// Put teardown code here. This method is called after the invocation of each test method in the class.

super.tearDown()

}

overridefunc recordFailure(withDescription description:String, inFile filePath: String, atLine lineNumber:UInt, expected: Bool) {

print("\(description)\(self.testCnt)")

}

func testExample() {

// Use recording to get started writing UI tests.

// Use XCTAssert and related functions to verify your tests produce the correct results.

}

func fRandom(_ upperBound:UInt32) -> UInt32 {

returnarc4random_uniform(upperBound)

}

func testMonkey() {

let app =XCUIApplication()

for_ in0 ..< 1000000 {

// Login or Paypal

if app.secureTextFields.count ==1 {

var isLoginV = false

for ind in0 ..< app.buttons.count {

if app.buttons.element(boundBy: ind).label== "Sign in" { // Login

isLoginV = true

break

}

}

if isLoginV {

let emailTextField = app.textFields["UserName"]

emailTextField.tap()

if let email = emailTextField.valueas? String {

if email != "UPIS1" {

let deleteKey = app.keys["delete"]

for _in 0 ..< email.characters.count {

deleteKey.tap()

}

emailTextField.typeText("UPIS1")

}

}

app.buttons["Next"].tap()

let passwordSecureTextField = app.secureTextFields["Password"]

passwordSecureTextField.tap()

passwordSecureTextField.typeText("888888")

app.buttons["Done"].tap()

} else {

// Paypal

}

}

var isValidAction =false

for_ in0 ..< 999 {

switch fRandom(9) {

case 1,2,3:

if app.cells.count >0 {

let ind = UInt(fRandom(UInt32(app.buttons.count)))

let cell = app.cells.element(boundBy: ind)

if cell.exists&& ind < app.cells.count {

cell.coordinate(withNormalizedOffset:CGVector(dx: 0.5, dy:0.5)).tap()

isValidAction = true

}

}

case 4:

if app.scrollViews.count >0 {

let scrollView = app.scrollViews.element(boundBy:UInt(fRandom(UInt32(app.scrollViews.count))))

if scrollView.exists&& scrollView.isHittable {

switch fRandom(4) {

case 0:

scrollView.swipeDown()

case 1:

scrollView.swipeUp()

case 2:

scrollView.swipeLeft()

default:

scrollView.swipeRight()

}

isValidAction = true

}

}

default:

if app.buttons.count >0 {

let ind = UInt(fRandom(UInt32(app.buttons.count)))

let button = app.buttons.element(boundBy: ind)

if button.isHittable&& ind < app.buttons.count {

button.coordinate(withNormalizedOffset:CGVector(dx: 0.5, dy:0.5)).tap()

isValidAction = true

}

}

}

if isValidAction {

break

}

}

testCnt +=1

}

print("Complete Monkey Test.\(testCnt)")

}

func randomCGFloat(_ upperBound:CGFloat) -> CGFloat {

returnCGFloat(arc4random_uniform(UInt32(upperBound)))

}

func testMonkeyWithCoordinate() {

let app =XCUIApplication()

for_ in0 ..< 1000000 {

app.coordinate(withNormalizedOffset:CGVector(dx: Double(fRandom(10))/10, dy: Double(fRandom(10))/10)).tap()

testCnt +=1

}

}

}

6、运行

点击testMonkey左边的绿色箭头运行测试用例,然后你的项目就会自己跑起来了,并且自己点击,自己操作,自动化测试完毕,不懂的可以问我 qq:751776425

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容