测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
Released最新发布 | 2017年10月 |
由Chris Fuentes、Joshua Moody维护。
这是一个扩展库,用于在Visual Studio Mobile Center / Xamarin Test Cloud中运行XCUITests时触发截图/标记测试步骤。默认情况下,每个测试方法的结束时自动标记测试步骤(这将触发一个截图);该库允许您明确声明要在何处标记测试步骤/触发截图。
《VSMobileCenterExtensions.framework》适用于iOS 9.0或更高版本。
VSMobileCenterExtensions已在OSX El Capitan(10.11.5)和Xcode 8.2上进行了测试。然而,它应该适用于Xcode/OSX的新版本。如果您在新版本的OS / Xcode配置中遇到困难,请随时提交问题。
为了运行单元测试,您还需要将项目的代码签名信息就地更改,以指向您自己的计算机上安装的证书。
如果您想要安装xcpretty
gem(参见下面的“从源码构建”),那么您还需要一个有效的ruby安装。建议使用Ruby 2.2.1或更高版本。
可以通过使用依赖关系管理器(Cocoapods或Carthage)或将它手动包含在目标中,将此扩展添加到您的Xcode XCUITest目标。
可选:建议您安装xcpretty
gem,以便输出更美观。
$ gem install xcpretty
1) 运行
$ make
这将会在build/Release-iphoneos
文件夹内构建VSMobileCenterExtensions.framework
。
2) 将VSMobileCenterExtensions.framework
复制到您的应用项目文件夹。
3) 在Xcode中,在UI Test目标的“构建阶段”选项卡中(而不是主应用程序目标),将VSMobileCenterExtensions.framework
添加到“链接二进制与库”阶段。
4) 在同一选项卡中,将VSMobileCenterExtensions.framework
添加到“复制文件”阶段。
如果您还没有创建一个,则需要创建一个。为此,请单击窗格左上角的 '+' 号
一旦创建了“复制文件”阶段,请点击该阶段的窗格左下角的 '+' 按钮,以添加新文件。
单击'添加其他...'并导航到框架
确保“复制文件”阶段的目标设置为“框架”。
当您完成操作后,您的构建阶段窗格应类似于以下内容
VSMobileCenterExtensions
框架公开了一个您可以使用来触发屏幕截图并在您的 UI 测试中以您选择的标签标记特定点的 label
功能。
在 Objective-C 中,该方法是 +[MCLabel label:]
或简称为 label()
。它接受一个格式字符串和参数,就像 NSLog()
。
#import <VSMobileCenterExtensions/VSMobileCenterExtensions.h>
- (void)testExample {
//Some test logic...
[MCLabel label:fmt, ...];
// or
label(fmt, ...);
//More test logic...
}
在 Swift 中,该函数是 MCLabel.labelStep()
,它接受一个字符串,以及一个可选的 vaList
,如果您想使用 Objective-C 样式的格式字符串。
import VSMobileCenterExtensions
class MyTestCase: XCTestCase {
func textExample() {
//Some test logic...
MCLabel.labelStep(label)
//or
MCLabel.labelStep(fmt, args: getVaList([ arg, ... ]))
//More test logic...
}
}
为了在 Xamarin Test Cloud 或 Mobile Center 中运行测试,您需要构建您的应用程序和 XCUITest 运行程序包。为此,从应用程序项目目录的根目录中运行以下命令:
$ xcrun xcodebuild build-for-testing -configuration Debug -workspace YOUR_WORKSPACE -sdk iphoneos -scheme YOUR_APPLICATION_SCHEME -derivedDataPath .
此命令将构建应用程序和 XCUITest 运行程序到名为“Build”的本地目录中(具体而言,包在 Build/Products/Debug-iphoneos/
中)。
YOUR_WORKSPACE
应指向一个 .xcworkspace
文件,通常命名为 PROJECT_NAME.xcworkspace
。 YOUR_APPLICAITON_SCHEME
应是您构建应用程序的方案。默认情况下,通常是应用程序的名称。如果您不确定,可以运行以下命令以查看有效方案的列表:
$ xcrun xcodebuild -list
有关 Xcode 方案的更多信息,请参阅 Apple 开发者文档。
首先,通过遵循以下安装说明确保您有 xtc
上传工具。
如果您没有现成的设备密钥,您可以遵循 Test Cloud 中的新测试运行对话框生成一个。在最终屏幕上,只提取生成的命令中的设备密钥。
要上传您的测试,请运行以下命令
$ xtc xcuitest <api-key> --devices <selection> --user <email> --workspace Build/Products/Debug-iphoneos
注意:如果您在定位 xtc 命令时遇到麻烦,请尝试使用完全限定的路径来执行。
在 XTC/Mobile Center 测试中执行手势时,您可能会看到以下类似错误消息:
UI Testing Failure - Failed to scroll to visible (by AX action) Button
...
Error -25204 performing AXAction 2003
目前,问题尚未完全了解,并相信其源头在 XCTest.framework
中。然而,证据表明,可能的其中一个原因是,当手势被调用时,XCUITest 无法在层次结构中“看到”该元素。
虽然这不是万无一失的解决方案,但作为潜在的解决方案和对测试稳定性的 generale 改进,我们建议将以下支架代码适应到您的手势调用中(示例是用于 tap
手势):
Objective-C
- (void)waitAndTap:(XCUIElement *)button {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"exists == 1 && hittable == 1"];
[self expectationForPredicate:pred
evaluatedWithObject:button
handler:nil];
[self waitForExpectationsWithTimeout:180.0 handler:nil];
[button tap];
}
Swift
func waitAndTap(element: XCUIElement) {
let predicate = NSPredicate(format: "exists == 1 && hittable == 1")
expectation(for: predicate, evaluatedWith: element)
waitForExpectations(timeout: 5 /*Or a larger value if necessary*/)
element.tap()
}
然后,您将使用 waitAndTap
代替 tap
,以确保相关的元素处于可点击的状态。
请注意,在XTC/Mobile Center Test中,这个问题似乎仅存在于iPhone 7设备上。
如果您正在使用Xcode >= 8.3构建Swift XCUITests,可能会遇到与位码相关的构建错误。作为一个解决方案,您可以在XCUITest目标中禁用位码。要这样做,转到构建设置,搜索 ENABLE_BITCODE
并将测试目标的值设置为 NO
。您不需要更改应用目标的设置。