本文将演示UI Testing系统界面测试功能的使用。
如果项目中尚未引入界面测试功能,请点击项目属性面板->【General】面板左下角的【+】图标
->Test模板区域,选择【iOS UI Testing Bundle】->【Next】->保持默认设置【Finish】
查看【DemoAppUITests】文件夹下的内容。
打开界面测试代码文件【DemoAppUITests.swift】
在【override func tearDown() 】测试案例方法的内部点击,进入该方法。
接着点击左下角的记录按钮,将自动打开模拟器,并开始记录在界面中的各项操作。
点击第一个Add 按钮,添加一个新的视图,此时在模拟器背后的代码文件中,已经记录下刚刚点击的操作。
继续点击第二个Switch按钮,调整两个视图的层次关系,
点击第三个Remove按钮,删除紫色的视图,
接着依次点击三个按钮,重复之前的动作,现在已经记录下了六个交互操作。
再次点击左下角的结束记录按钮,返回界面测试的代码文件。
上文的六次点击操作,都依次被记录下来,当之后需要重复刚刚的测试步骤时,
只需点击方法名称左侧的菱形按钮,即可播放测试记录。
当模拟器打开后,自动重复执行刚刚的六个测试步骤。
1 import XCTest
2
3 class DemoAppUITests: XCTestCase {
4
5 override func setUp() {
6 // Put setup code here. This method is called before the invocation of each test method in the class.
7
8 // In UI tests it is usually best to stop immediately when a failure occurs.
9 continueAfterFailure = false
10
11 // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
12 XCUIApplication().launch()
13
14 // 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.
15 }
16
17 override func tearDown() {
18 // Put teardown code here. This method is called after the invocation of each test method in the class.
19 //在测试案例方法的内部点击,进入该方法。
20 }
21
22 func testExample() {
23 // Use recording to get started writing UI tests.
24 // Use XCTAssert and related functions to verify your tests produce the correct results.
25 //上文的六次点击操作,都依次被记录下来,
26 //当之后需要重复刚刚的测试步骤时,
27 //只需点击方法名称左侧的菱形按钮,
28 //即可播放测试记录。
29 let app = XCUIApplication()
30
31 //点击第一个Add 按钮,添加一个新的视图
32 let addButton = app.buttons["Add"]
33 addButton.tap()
34
35 //继续点击第二个Switch按钮,调整两个视图的层次关系,
36 let switchButton = app.buttons["Switch"]
37 switchButton.tap()
38
39 //点击第三个Remove按钮,删除紫色的视图
40 let removeButton = app.buttons["Remove"]
41 removeButton.tap()
42
43 //接着依次点击三个按钮,重复之前的动作
44 addButton.tap()
45 switchButton.tap()
46 removeButton.tap()
47 }
48 }
视图控制器的代码文件【ViewController.swift】
1 import UIKit
2
3 class ViewController: UIViewController {
4
5 override func viewDidLoad() {
6 super.viewDidLoad()
7 // Do any additional setup after loading the view, typically from a nib.
8 //创建一个原点在(30,50),尺寸为(200,200)的矩形常量,作为视图的显示区域
9 let rect = CGRect(x: 30, y: 50, width: 200, height: 200)
10 //创建一个相应的UIView视图
11 let view = UIView(frame: rect)
12 //设置视图的背景颜色为棕色
13 view.backgroundColor = UIColor.brown
14 //将视图添加到当前视图控制器的根视图
15 self.view.addSubview(view)
16
17 //创建一个按钮,当点击此按钮时,将动态添加另一个视图
18 let btAdd = UIButton(frame: CGRect(x: 30, y: 350, width: 80, height: 30))
19 //设置按钮的背景色为灰色
20 btAdd.backgroundColor = UIColor.gray
21 //设置按钮在正常状态下的标题,其他状态还包括按钮被按下等状态
22 btAdd.setTitle("Add", for: UIControl.State())
23 //给按钮绑定点击事件,这样点击按钮时,将执行添加视图方法
24 btAdd.addTarget(self, action: #selector(ViewController.addView(_:)), for: UIControl.Event.touchUpInside)
25 //将按钮添加到当前视图控制器的根视图
26 self.view.addSubview(btAdd)
27
28 //同样创建第二个按钮,当点击这个按钮时,将切换根视图中,两个视图的层次顺序
29 let btBack = UIButton(frame: CGRect(x: 120, y: 350, width: 80, height: 30))
30 //设置按钮背景色为灰色
31 btBack.backgroundColor = UIColor.gray
32 //设置按钮在正常状态下的标题文字
33 btBack.setTitle("Switch", for: UIControl.State())
34 //给按钮绑定点击事件,当点击按钮时,交换两个视图的层次顺序
35 btBack.addTarget(self, action: #selector(ViewController.bringViewBack(_:)), for: UIControl.Event.touchUpInside)
36 //将按钮添加到当前视图控制器的根视图
37 self.view.addSubview(btBack)
38
39 //创建第三个按钮,当点击这个按钮时,将从当前视图控制器的根视图中,删除新添加的视图
40 let btRemove = UIButton(frame: CGRect(x: 210, y: 350, width: 80, height: 30))
41 //设置按钮背景色为灰色
42 btRemove.backgroundColor = UIColor.gray
43 //设置按钮在正常状态下的标题文字
44 btRemove.setTitle("Remove", for: UIControl.State())
45 //然后给按钮绑定点击事件,当点击按钮时,执行删除视图的操作
46 btRemove.addTarget(self, action: #selector(ViewController.removeView(_:)), for: UIControl.Event.touchUpInside)
47 //将按钮添加到当前视图控制器的根视图
48 self.view.addSubview(btRemove)
49 }
50
51 //创建第一个按钮的点击事件
52 @objc func addView(_ sender:UIButton!)
53 {
54 //创建一个原点在(60,90),尺寸为(200,200)的矩形常量,作为视图的显示区域
55 let rect = CGRect(x: 60, y: 90, width: 200, height: 200)
56 //创建一个相应的UIView视图
57 let view = UIView(frame: rect)
58 //设置视图的背景颜色为紫色
59 view.backgroundColor = UIColor.purple
60 //给这个视图指定一个标志,这样就可以在以后需要的时候,通过标志找到这个视图
61 view.tag = 1
62 //添加到当前视图控制器的根视图
63 self.view.addSubview(view)
64 }
65
66 //创建第二个按钮的点击事件
67 @objc func bringViewBack(_ sender:UIButton!)
68 {
69 //首先通过给视图对象设置的标志值,找到新添加的视图
70 let view = self.view.viewWithTag(1)
71 //将新添加的视图,移到所有兄弟视图的后方
72 self.view.sendSubviewToBack(view!)
73 }
74
75 //创建第三个按钮的点击事件
76 @objc func removeView(_ sender:UIButton!)
77 {
78 //通过给视图对象设置的标志值,找到新添加的视图
79 let view = self.view.viewWithTag(1)
80 //将新添加的视图删除,也就是从当前视图控制器的根视图中删除
81 view?.removeFromSuperview()
82 }
83 }