谷歌开源针对iOS的可访问性测试框架

作者 Sergio De Simone,译者 张卫滨

谷歌GTXiLib是针对iOS的可访问性自动化测试框架,现在它已经基于Apache许可证开源。GTXiLib是使用Objective-C编写的,并且能够与Xcode的单元测试基础设施进行集成。

GTXiLib与Xcode的集成是通过XCTest单元测试框架实现的。我们可以为任意的测试类安装GTXiLib,并注册一系列在执行单元测试时希望一起执行的可访问性检查。如果有可访问性失败的话,对应的单元测试也会失败。

GTXiLib目前所支持的可访问性检查致力于确保按钮上都存在文本、标签的文本没有标点、可点击区域至少有一个最小的空间并且文本有足够的高度。

GTXiLib还为开发人员提供了构建自定义检查的方式,这是通过checkWithName:block API来实现的。如下就是一个简单版本的可访问性检查,它会确保某个元素上存在一个标签:

            id check = [GTXCheckBlock GTXCheckWithName:"LabelMustBePresent"
                                                      block:^BOOL(id  element,
          GTXErrorRefType errorOrNil) {
              NSError *error;
              id accessibilityLabel = [element accessibilityLabel];
              if (! [accessibilityLabel isKindOfClass:[NSString class]]) {
                  *errorOrNil = // set error;
                }
                // Fail
                return NO;
              }
              return NO;
            }];

在实现上,低层级的可访问性检查是通过苹果自身的UIAccessibility框架来完成的,以上面的例子来说明,在这里使用了accessibilityLabel。但是,GTXiLib并不局限于只使用UIAccessibility方法,在它们的内部运行中,可以使用任意可用的框架。

要为测试类安装GTXiLib,只需要在它的+setup方法添加如下这样代码即可:

       +(void)setUp {
          [super setUp];
          // ...其他的setup代码(如果有的话)放到这里
          // 将GTX安装到*this*测试类的所有测试中
            [GTXiLib  installOnTestSuite:[GTXTestSuite
        suiteWithAllTestsInClass:self]
                              checks:[GTXChecksCollection allGTXChecks]
                    elementBlacklists:@[]];
        }

通过这种方式,在这个测试类中所定义的每个单元测试都会进行可访问性检查。如果你想要在可访问性检查中排除一些UI元素的话,那么可以将它们放到elementBlackLists数组中。如果你想要对已有的代码库重构可访问性测试的话,这会非常有用,因为这样可以将无法控制的或者稍后某个时间点才能修正的元素排除在外。

GTXiLib是基于XCTest的,这意味着它能够与任意基于XCTest的框架兼容,比如Google自己的UI自动化测试框架EarlGrey

借助cocoapods, GTXiLib能够非常容易地添加到项目之中。