我正在尝试在 xCode 8 中对 View Controller 进行单元测试。我能够使用 XCUI 成功地记录、断言和运行它。但我想独立测试特定的 View Controller 。
就像有 4 个 Controller A、B、C 和 D 依次(A->B->C->D)。我想直接启动C Controller 并独立测试它。
我能够以这种方式进行测试,即默认 XCUIApplication 将打开 A Controller ,然后单击您将转到 B Controller 的内容,然后单击 B 中的按钮将带您到 C Controller 。然后你可以测试一下。但我不想按顺序。我想直接测试 C Controller 。
如果有人做过同样的工作,你能帮忙吗? 提前致谢。
最佳答案
使用 Xcode 在 XCUITest 中
如果你现在使用UITestCase,是不能直接打开D Controller 的
每次都应该执行顺序 (A->B->C->D),因为所有测试用例规范都会导致应用程序启动,特别是 SignIn,UITest 每次都需要 SignOut
testCase使用XCUI Test的补充方式
提供A、B、C的序列函数作为最小化重复代码的协议(protocol)
例如)定义登录协议(protocol)
protocol Loginable {
var app: XCUIApplication! { get }
func login()
}
extension Loginable {
func login() {
//do login ... typting textfield , tap login button
}
}
使用 Loginable 扩展您的 A、B、C、D UITestCase 以删除重复的代码(因为在示例中每个 D uitest 案例都应该登录)
对序列函数进行扩展以重用每个案例
替代方案是
使用KIF Functional Test framework
KIF可以基于XCTest而不是XCUITest来测试UITest
KIF 可以像单元测试一样访问你的类
您可以将您的 D ViewController 显示到窗口(直接设置 rootViewController)并测试 KIF UItest 功能
例如)KIF
import XCTest
@testable import YourApp
class DViewControllerTests: XCTestCase {
var sut: DViewController!
var window: UIWindow!
override func setUp() {
super.setUp()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
window = appDelegate.window
sut = //Initialize your D ViewController
window.rootViewController = sut
RunLoop.current.run(until: Date()) // cause viewDidLoad
}
func testSomeCase() {
tester().tapView(withAccessibilityIdentifier: "someIdentifier")
...
}
}
KIF可以直接启动D Controller 设置rootViewController到窗口
关于ios - 使用 XCUI 进行 UI 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130343/