是否可以从 ui 测试中隐藏 类
Is it possible to hide classes from ui tests
我有几个帮手 类,比如 UnlockedTestCase
,可以为特殊场景测试配置我的应用程序。
论文 类 显示在没有测试的测试导航器中。
有没有办法将 then 标记为 "not test classes" 以便测试导航器忽略它们?
更新:示例代码:
class UnlockedTestCase: XCTestCase {
var app = XCUIApplication()
override func setUp() {
super.setUp()
continueAfterFailure = false
app.launchArguments = ["uiTesting", "unlock"]
app.launch()
}
}
测试将被写成:
class UnlockedUITests: UnlockedTestCase {
func testButton() {
XCTAssers(app.buttons["SomeButtonInTheUnlockedState"].exists)
}
}
假设结构如下:
MyTestHelperClassName: XCTestCase {
//... your helper methods
}
移除XCTestCase
的子类声明
即 : XCTestCase
部分
那么就不会出现在"Test Navigator"
不,没有一种方法可以在不失去定义 setUp()
的便利性的情况下从测试导航器中排除那种 class,因为它发现测试用例 [=31] =]es 很简单,从导航器的角度来看,您可以随时向 parent/helper class 添加测试用例,因为它是 XCTestCase
的后代。
'helper' 或 'abstract-only' classes 没有协议以您需要的方式支持继承,因为自动发现和使用需要从 XCTestCase 继承测试和测试挂钩,如 setUp()
.
如果您真的想要从测试导航器中删除您的助手实体,您可以将它们抽象为具有扩展名 where Self: XCTestCase
的协议(以允许您访问XCTestCase 在扩展中的接口),让你的测试 class 符合它们,并在你的测试所在的 class 中覆盖 setUp()
。
protocol UnlockableTest {}
extension UnlockableTest where Self: XCTestCase {
func unlockSetUp() {
continueAfterFailure = false
app.launchArguments = ["uiTesting", "unlock"]
app.launch()
}
}
class UnlockedUITests: XCTestCase, UnlockableTest {
var app = XCUIApplication()
override func setUp() {
super.setUp()
unlockSetUp()
}
func testButton() {
XCTAssert(app.buttons["SomeButtonInTheUnlockedState"].exists)
}
}
但是,我认为您当前方法的简单性和便利性是更好的折衷方案。不过,协议也不能包含存储的属性,因此为了获得存储的 属性 的好处,您需要将 app
属性 添加到每个 XCTestCase
后代也是。
您现在可以使用 Swift 包执行此操作,如果您的测试在 Swift 包中,那么您可以拥有一个包含基础 类 的辅助模块,而这些不会作为空测试用例添加到侧边栏。
您可以将 xcodeproj 与本地源文件夹 swift 包混合使用,以促进此操作,一般来说,我个人会推荐这样做,因为它可以缩短构建时间并允许您使代码库更加模块化精细的访问控制。
我有几个帮手 类,比如 UnlockedTestCase
,可以为特殊场景测试配置我的应用程序。
论文 类 显示在没有测试的测试导航器中。
有没有办法将 then 标记为 "not test classes" 以便测试导航器忽略它们?
更新:示例代码:
class UnlockedTestCase: XCTestCase {
var app = XCUIApplication()
override func setUp() {
super.setUp()
continueAfterFailure = false
app.launchArguments = ["uiTesting", "unlock"]
app.launch()
}
}
测试将被写成:
class UnlockedUITests: UnlockedTestCase {
func testButton() {
XCTAssers(app.buttons["SomeButtonInTheUnlockedState"].exists)
}
}
假设结构如下:
MyTestHelperClassName: XCTestCase {
//... your helper methods
}
移除XCTestCase
的子类声明
即 : XCTestCase
部分
那么就不会出现在"Test Navigator"
不,没有一种方法可以在不失去定义 setUp()
的便利性的情况下从测试导航器中排除那种 class,因为它发现测试用例 [=31] =]es 很简单,从导航器的角度来看,您可以随时向 parent/helper class 添加测试用例,因为它是 XCTestCase
的后代。
'helper' 或 'abstract-only' classes 没有协议以您需要的方式支持继承,因为自动发现和使用需要从 XCTestCase 继承测试和测试挂钩,如 setUp()
.
如果您真的想要从测试导航器中删除您的助手实体,您可以将它们抽象为具有扩展名 where Self: XCTestCase
的协议(以允许您访问XCTestCase 在扩展中的接口),让你的测试 class 符合它们,并在你的测试所在的 class 中覆盖 setUp()
。
protocol UnlockableTest {}
extension UnlockableTest where Self: XCTestCase {
func unlockSetUp() {
continueAfterFailure = false
app.launchArguments = ["uiTesting", "unlock"]
app.launch()
}
}
class UnlockedUITests: XCTestCase, UnlockableTest {
var app = XCUIApplication()
override func setUp() {
super.setUp()
unlockSetUp()
}
func testButton() {
XCTAssert(app.buttons["SomeButtonInTheUnlockedState"].exists)
}
}
但是,我认为您当前方法的简单性和便利性是更好的折衷方案。不过,协议也不能包含存储的属性,因此为了获得存储的 属性 的好处,您需要将 app
属性 添加到每个 XCTestCase
后代也是。
您现在可以使用 Swift 包执行此操作,如果您的测试在 Swift 包中,那么您可以拥有一个包含基础 类 的辅助模块,而这些不会作为空测试用例添加到侧边栏。
您可以将 xcodeproj 与本地源文件夹 swift 包混合使用,以促进此操作,一般来说,我个人会推荐这样做,因为它可以缩短构建时间并允许您使代码库更加模块化精细的访问控制。