我已经设置了启动参数来清除用户默认值并在测试之间注销,但有一半时间这似乎不起作用。我一直在寻找可能是根本原因的可能错误,但同时我希望进行更少的测试,以便开发人员对它们更有信心。所以我在登录步骤中添加了一个条件,只有在登录按钮存在时才应该执行。运行测试时,它会像if语句完全被忽略一样,测试会查找登录按钮,然后在找不到它时失败。
代码:
func login() {
app.buttons["Have an account? Log in"].tap()
let emailAddressTextField = app.textFields["Email Address"]
let passwordSecureTextField = app.secureTextFields["Password"]
emailAddressTextField.tap()
emailAddressTextField.typeText(EMAIL_ALPHA_USER)
passwordSecureTextField.tap()
passwordSecureTextField.typeText(PASSWORD)
if app.staticTexts["Success!"].waitForExistence(timeout: 5) {
app.buttons["OK"].tap()
}
}
func testTapControlMode() {
if app.buttons["Have and Account?"].exists {
login()
}
// ... proceed with test
}
我没有到这里来的?我尝试过使用.isHittable
,但这也无效。我在测试中放置断点并打印app.buttons["name"].exists
的结果并返回false,而.isHittable
返回一些错误。因此,.exists
似乎应该按照我的预期行事。
答案 0 :(得分:0)
在许多情况下,XCUITest Framework在视图可用于交互之前不会等待足够长的时间。要解决这个问题,你应该编写一些等待逻辑,最好编写def evaluate(classifier):
predicted = classifier.predict(testing_text)
if isinstance(classifier.steps[2][1], LinearSVC):
probabilities = np.array(classifier.decision_function(testing_text))
scores = probabilities
else:
probabilities = np.array(classifier.predict_proba(testing_text))
scores = probabilities[:, 1] # NEW
testing_category_array = np.array(testing_category) # NEW
pos_idx = np.where(testing_category_array == 'pos')
predicted_true_binary = np.zeros(testing_category_array.shape)
predicted_true_binary[pos_idx] = 1
fpr, tpr, thresholds = metrics.roc_curve(predicted_true_binary, scores)
auc = metrics.roc_auc_score(predicted_true_binary, scores)
mean_acc = np.mean(predicted == testing_category)
report = metrics.classification_report(testing_category, predicted)
confusion_matrix = metrics.confusion_matrix(testing_category, predicted)
return fpr, tpr, auc, mean_acc, report, confusion_matrix
类的扩展名,如下所示:
XCTestCase
然后,你可以在测试中得到类似的东西:
extension XCTestCase {
enum Condition: String {
case appear = "exists == true"
case disappear = "exists == false"
}
func waitFor(_ element: XCUIElement, to condition: Condition) -> Bool {
let predicate = NSPredicate(format: condition.rawValue)
let expectationConstant = expectation(for: predicate, evaluatedWith: element, handler: nil)
let result = XCTWaiter().wait(for: [expectationConstant], timeout: 5)
return result == .completed
}
}
并使用func testTapControlMode() {
let haveAnAccountButton = app.buttons["Have and Account?"]
if waitFor(haveAnAccountButton, to: .appear) {
login()
}
// ... proceed with test
}
方法:
login