VSMobileCenterExtensions 0.9.1

VSMobileCenterExtensions 0.9.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
Released最新发布2017年10月

Chris FuentesJoshua Moody维护。



  • 作者:
  • Chris Fuentes

这是一个扩展库,用于在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配置中遇到困难,请随时提交问题

为了运行单元测试,您还需要将项目的代码签名信息就地更改,以指向您自己的计算机上安装的证书。

screen shot 2017-02-13 at 2 24 51 am

如果您想要安装xcprettygem(参见下面的“从源码构建”),那么您还需要一个有效的ruby安装。建议使用Ruby 2.2.1或更高版本。

安装

可以通过使用依赖关系管理器(Cocoapods或Carthage)或将它手动包含在目标中,将此扩展添加到您的Xcode XCUITest目标。

从源码构建

可选:建议您安装xcprettygem,以便输出更美观。

$ gem install xcpretty

1) 运行

$ make

这将会在build/Release-iphoneos文件夹内构建VSMobileCenterExtensions.framework

2) 将VSMobileCenterExtensions.framework复制到您的应用项目文件夹。

filestructure

3) 在Xcode中,在UI Test目标的“构建阶段”选项卡中(而不是主应用程序目标),将VSMobileCenterExtensions.framework添加到“链接二进制与库”阶段。

4) 在同一选项卡中,将VSMobileCenterExtensions.framework添加到“复制文件”阶段。

如果您还没有创建一个,则需要创建一个。为此,请单击窗格左上角的 '+' 号

addcopyfilesphase

一旦创建了“复制文件”阶段,请点击该阶段的窗格左下角的 '+' 按钮,以添加新文件。copyfilesphase

单击'添加其他...'并导航到框架

clickaddother

确保“复制文件”阶段的目标设置为“框架”。

当您完成操作后,您的构建阶段窗格应类似于以下内容

buildsettings

用法

VSMobileCenterExtensions 框架公开了一个您可以使用来触发屏幕截图并在您的 UI 测试中以您选择的标签标记特定点的 label 功能。

Objective-C

在 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

在 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.xcworkspaceYOUR_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

如果您正在使用Xcode >= 8.3构建Swift XCUITests,可能会遇到与位码相关的构建错误。作为一个解决方案,您可以在XCUITest目标中禁用位码。要这样做,转到构建设置,搜索 ENABLE_BITCODE 并将测试目标的值设置为 NO。您不需要更改应用目标的设置。

screen shot 2017-04-06 at 12 43 24 pm