我刚刚练习TDD并为测试应用编写了一个非常简单的功能。用户界面很简单:它最初有一个标题为“0”的按钮。在我的视图控制器中,我有一个局部变量“得分”。每次点击按钮都会增加“得分”。按钮标题将使用新的“分数”值进行更新。按钮ui更新逻辑位于“得分”的“didSet”属性观察器中。
除了UI测试之外,一切都很酷。我有两个ui测试功能,一个是点击按钮一次,另一个是按两次按钮。现在发生了奇怪的事情。以下是我的两个ui测试功能的截图。
每次我运行测试时,有时两个函数都会通过,而有时一个或两个函数都会失败。错误始终如“aNumber不等于aNumber + 1”所示。看起来有一些响应时间问题。看起来UI更新比按钮标签结果检索慢得多。我不确定在真正更新之前我是否过早得到了button.label的值。我是否应该更新属性观察者的UI?有没有通过ui测试的解决方案?感谢您的帮助!
答案 0 :(得分:1)
关于
两个函数都通过了,有时一个或两个函数失败
UITest在单独的进程中执行。因此,如果按钮标题更新比XCTAssert慢,它将失败,因为将oldValue与期望值进行比较
点击按钮后,等待正确测试
使用此功能waitForExpectationsWithTimeout(3,nil)
func testTapNumberButtonIncrementScore() {
let app = XCUIApplication()
app.buttons["numberButton"].tap()
waitForExpectationsWithTimeout(3, handler: nil)
XCTAssertEqual(app.buttons["numberButton"].title, "1")
}
func testTapNumberButtonTwiceIncrementTo2() {
let app = XCUIApplication()
app.buttons["numberButton"].tapWithNumberOfTaps(2, numberOfTouches: 1)
waitForExpectationsWithTimeout(3, handler: nil)
XCTAssertEqual(app.buttons["numberButton"].title, "2")
}
我希望它适用于你:)
答案 1 :(得分:1)
我在iPhone模拟器中遇到了同样的问题,测试通过了。
我最终为模拟器添加了这样的延迟:
struct Platform {
static let isSimulator: Bool = {
var isSim = false
#if arch(i386) || arch(x86_64)
isSim = true
#endif
return isSim
}()
}
class YourUITests: XCTestCase {
override func setUp() {
super.setUp()
if Platform.isSimulator {
sleep(1)
}
}
}
希望有所帮助。