我需要XCode项目的UI测试,这是几个产品的平台。 这意味着某些元素是针对某些产品定制的。例如,它们可以在产品之间具有不同的颜色,文本样式等,或者对于一个项目可以看到相同的元素,但是隐藏另一个项目。
如何配置我的XCode UI测试以使其可以重复使用各种产品?我知道我需要不同的模式。但是,例如,可见性元素呢?我似乎需要在UI测试代码中检查它?但我认为使用任何配置文件会更好。我对吗?有没有人有任何想法?我很感激所有的建议。
答案 0 :(得分:0)
我建议您在每个产品中使用一套测试助手。这些是通用的参数化功能,例如记录用户或将项目添加到购物车。而不是在这些帮助器中对UI元素表示进行硬编码,而是对输入进行参数化。然后你可以一遍又一遍地使用它们。
func addItemToCart(named: String, saveButtonName: String)
func login(username: String, password: String, submitButtonText: String)
func tapTableCell(imageNamed: String)
创建基本的导航脚手架后,您可以转到断言助手。将复杂逻辑留在帮助程序中使您可以重复使用它们,并使您的产品特定测试保持精简和可读性。
func assertCurrentScreen(named: String)
func assertHighlightedCell(colorNamed: String)
func assertCartTotal(cents: String, containerIdentifier: String)
对于所有这些功能,我建议在最后添加两个默认参数来记录调用者文件和行号。如果您进行任何自定义断言,则可以pass these references in to show your failure at the callers line, not the helpers。
func assertScreen(titled: String, file: StaticString = #file, line: UInt = #line) {
if !XCUIApplication().navigationBars[titled].exists {
XCTFail("Item was not added to cart.", file: file, line: line)
}
}
答案 1 :(得分:0)
我在每次测试开始时都使用了一个函数。
class SomeTestsClass: XCTestCase {
func testSomeTest() {
var externalConfigVariable_1 = "value for defult test"
var externalConfigVariable_2 = "value for defult test"
// here You use the external config to override
// the default test logc
if let testConfig = getConfig(for: self.name) {
// read config parameters here
externalConfigVariable_1 = testConfig["test_var_1"]
externalConfigVariable_2 = testConfig["test_var_2"]
// ..........
}
// use the variables as You like
// ......
}
}
extension XCTestCase {
public func getConfig(for name: String?) -> [String: Any]? {
let nameComponents = name?.replacingOccurrences(of: "-", with: "").replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").components(separatedBy: " ")
if let fileName = nameComponents?.last {
let testBundle = Bundle(for: type(of: self))
guard let path = testBundle.url(forResource: fileName, withExtension: "JSON") else {
return nil
}
if let data = try? Data(contentsOf: path) {
if let testConfig = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String: Any] {
return testConfig
}
}
}
return nil
}
}
以下是JSON示例:
{
"test_var_1": "Some var",
"test_var_2": "Some other var"
}