我有以下问题.我想在执行所有测试类之前执行一段代码.例如:我不希望我的游戏在执行期间使用SoundEngine单例,而是使用SilentSoundEngine.我想在一次测试中没有激活SilentSoundEngine.我所有的测试都是这样的:
class TestBasketExcercise : XCTestCase {
override func setUp() {
SilentSoundEngine.activate () // SoundEngine is a singleton
}
// The tests
}
Run Code Online (Sandbox Code Playgroud)
-Edit-大多数答案都针对为TestCase提供自定义超类.我正在寻找一种更通用,更清晰的方式来提供所有测试都需要执行的环境.是不是有一个"主要"功能/ Appdelegate喜欢功能的地方进行测试?
我正在使用XCTest为我的应用程序编写UITest案例.应用程序在主屏幕中进行多次服务器调用.我无法导航到下一个屏幕.自动化通常会闲置1分钟甚至超过消息
等待app闲置
要么
无法监视事件循环
有没有办法让应用程序执行我的testCases打破这个???
我正在尝试使用(XCode 7)UI XCTestCase测试用例,我只是偶然发现了一个UIView的问题,其中我有一个带有许多单元格(4000+)的UITableView.
当应用程序正常运行时,仅呈现可见单元格,并且根本没有性能问题.但是,如果我在录制XCTestCase的上下文中运行应用程序并导航到此屏幕,则模拟器会冻结,显然是因为每个单个单元格都被渲染为好像是可见的.如果我尝试手动编写导航脚本并运行XCTestCase,则测试用例在导航到此屏幕后立即失败,退出时出现"UI测试失败 - 无法获得刷新快照",显然是因为所有单元格都在渲染,这样做没有及时完成.
我认为这与测试框架构建显示的屏幕的整个元模型这一事实有关,将4000多个单元格中的每一个添加到视图树层次结构中.
我尝试添加一个期望,希望这会给测试容器足够的时间来完成渲染所有单元格,但这不起作用.
这有解决方法吗?是否有可能跳过构建UI树层次结构的某些部分?我的目标是能够为这个屏幕编写UI测试.
我的UI测试失败,因为测试等待无休止,直到应用程序闲置.我无法看到背景中发生了任何事情,比如加载微调器.
它只出现在一个选项卡上.所有其他选项卡都是可点击的,但测试在屏幕3上失败.在屏幕3上测试后,单击另一个选项卡,测试恢复并成功完成.
有任何想法吗?
- (void)testExample
{
XCUIElementQuery* tabBarsQuery = self.app.tabBars;
[tabBarsQuery.buttons[@"Screen2"] tap];
[tabBarsQuery.buttons[@"Screen3"] tap];
[tabBarsQuery.buttons[@"Screen1"] tap];
[tabBarsQuery.buttons[@"Screen4"] tap];
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试一段代码,我检查一下帐户是否已经创建了一个密钥并将其存储在钥匙串中.如果不是,则调用启动oauth进程的方法.
我的第一个想法是覆盖我想要调用的方法,如果用户没有秘密密钥.但是我使用的是结构,因此无法继承和覆盖该方法.
如果我使用的是课程,我会这样:
func testInitiateOauthCalledIfSecretKeyNotFound() {
class MockKeychainAccess: KeychainAccess {
var initiateAuthorizationWasCalled: Bool = false
override initiateAuthorization() {
initiateAuthorizationWasCalled = true
}
let keychainAccess = MockKeychainAccess()
keychainAccess.authorizeWithGoogle()
XCTAssertTrue(initiateAuthorizationWasCalled)
}
Run Code Online (Sandbox Code Playgroud)
我没有测试过这段代码所以不确定它是否编译.但从逻辑上讲,它似乎可以处理我追求的情况.如果在authorizeWithGoogle
我们调用的方法中,initiateAuthorization()
我会知道已经发生了.但是,当他们使用结构时,我们无法从结构中继承,因此无法执行此操作.
请注意:我是TDD的新手,所以也许我正在以错误的方式思考这个问题.其他建议是受欢迎的.但是我不想只是为了编写测试而从结构转换为类.我正在使用结构,因为我试图更加迅速.
有没有人知道我可以测试是否在结构中调用函数的方法?
==========
编辑:
为了回答dassm回答,我添加了一个我想要实现的一般方法的例子:
override func viewDidLoad() {
setupView()
let api = DataApi()
getData(api)
}
func setupView() {
tableView.dataSource = tableViewDataSource
}
func getData(api: DataApi) {
api.getApplicationData( { (objects) in
if let applications = objects as? [Application] {
self.tableViewDataSource.setApplicationItems(applications)
self.tableView.reloadData()
}
else {
// …
Run Code Online (Sandbox Code Playgroud) 我注意到当使用默认的 setUpWithError() 和 tearDownWithError() 方法创建新的 XCTestCase 类时,不再添加对 super.setUpWithError() 或 super.tearDownWithError() 的调用......如果我没记错的话,之前,当我创建一个新的单元测试用例类(XCTestCase 的子类)时,在默认模板类中,调用了 super.setUp() 和 super.tearDown() 方法。你知道为什么这些对 super 的调用被删除了吗?
例如,当创建 UIViewController 的子类时,默认类模板确实会调用 super.viewDidLoad()。为什么 XCTestCase 的默认模板不再调用 super
我正在寻找我的问题的解决方案,我需要将我的应用程序发送到后台并在特定时间间隔后从最近重新启动它.deactivateAppForDuration()用于在仪器UIAutomation中实现这一点.有人知道如何在XCTest中实现这一目标吗?
我的单元测试目标需要加载用于某些测试的图像资源,但我无法加载它。
我已经检查了测试目标的“复制捆绑资源”构建阶段,它确实包含资产目录。
我检查了资产目录和图像集的目标成员资格,确实是测试目标。
运行测试时,我尝试使用如下代码加载图像:
guard let image = NSImage(named: NSImage.Name("TestSourceImage")) else {
fatalError("Test Resource is Missing.")
}
Run Code Online (Sandbox Code Playgroud)
...但守卫失败了。
我也试过:
let bundle = Bundle(for: MyClassTests.self)
guard let path = bundle.pathForImageResource(NSImage.Name("TestSourceImage")) else {
fatalError("Test Resource is Missing.")
}
guard let image = NSImage(contentsOfFile: path) else {
fatalError("Test Resource File is Corrupt.")
}
Run Code Online (Sandbox Code Playgroud)
...但第一个守卫失败(无法检索资源路径)。
两种格式我都试过了
NSImage.Name("TestSourceImage")
Run Code Online (Sandbox Code Playgroud)
和:
NSImage.Name(rawValue: "TestSourceImage")
Run Code Online (Sandbox Code Playgroud)
我也试过Bundle.urlForImageResource(_)
,但它也失败了。
我见过类似的问题和答案,但它们适用于iOS或应用程序(主)包中的资源。
我错过了什么?
更新:
在meantine,我身边工作过的问题,加入我的测试图像作为独立的图像资源(未使用的资产目录),并用下面的代码加载它:
let …
Run Code Online (Sandbox Code Playgroud) 因此,最近Apple引入了此提示:“ XXXX”要使用“ auth0.com”登录,其中“ XXXX”是ios应用程序名称。
当用户使用Auth0时,单击“使用Google登录”或“使用Facebook登录”时,将出现此警报/对话框。很好,但是在运行IOS UI测试时,使用通常的关闭系统对话框的方法时,该对话框不会消失:
func doUserLogin(_ app: XCUIApplication) {
app.staticTexts["notLoggedInActivelabel"].tap()
// this will bring up oauth0 login window in ios
// setup a handler to dismiss the system alert
let handler = self.addUIInterruptionMonitor (withDescription: "allow oauth") { (alert) -> Bool in
// code should come here where the dialog is presented,
// but it never does ....
alert.buttons["Continue"].tap() // click Continue Button
return true
}
// click the login with GOOGLE button. This brings up dialog “XXXX” Wants …
Run Code Online (Sandbox Code Playgroud) xctestcase ×10
ios ×8
xctest ×7
swift ×3
xcode ×3
auth0 ×1
auth0-lock ×1
macos ×1
nsimage ×1
struct ×1
uitableview ×1
unit-testing ×1
xcode11 ×1
xcode7 ×1