用基类编写干XCUITest测试

在我们以前的职位在设置XCUITest框架时,我们用Xcode 10建立并运行了一个示例XCUITest。Apple的XCUITest框架使我们能够记录基本的用户行程,从而开始使用XCUITest,但是所记录的测试不具有可伸缩性和可重用性。我们必须努力提高XCUITest的可读性、可伸缩性、可维护性和可重用性。

按照上一篇文章中提到的方法,我们可以添加更多的UI测试,但是会有大量的代码重复,这会使我们的UI测试很难维护和修复。编写自动化测试非常容易,但随着项目的规模和复杂性的增加,编写可靠的测试更加困难。有各种测试方法和测试模式可用于使测试具有可伸缩性。在这篇文章中,我们将介绍如何通过抽象基类中常见的SWIFT代码使XCUITest测试变得健壮。

为XCUITest测试创建一个基类
大多数测试框架使用基类抽象测试类的公共功能。简而言之,基类是为测试类提供公共功能的超类。在我们XCUITest101Xcode项目,我们有一个ui测试类。XCUITest101UITests.swift在一个类中使用所有的方法,比如安装、解压缩和测试方法。如果我们想要添加新的XCUITest测试,那么我们必须重复每个测试类的设置和拆卸方法。显然,这将在我们的IOS项目中创建大量重复的代码,这使得以后很难维护,并且可能会延长您在移动设备云上的测试执行时间。为了避免这种情况,让我们从Xcode->File->New->File->Swift File->Next并将文件命名为XCUITestBase,并确保为该文件选择了目标XCUITest101UITest。

这将创建一个新文件。XCUITestBase.swift在UI测试目标下,我们可以抽象出通用代码。

通用测试工作流
现在我们已经为XCUITest创建了基类,我们可以考虑我们可以在基类中包含的常见和重复的代码。查看我们现有的测试类XCUITest101UITEST,我们可以在基类中抽象如下内容:

设置和测试方法
的实例XCUIApplication()这在以后的测试中可能需要。
这两个是非常明显的东西,我们必须抽象化,以便以后再使用。然而,随着项目和测试套件的增长,将来可能需要抽象更多的通用工作流。在编写XCUITest测试时,必须在能够可靠运行测试的状态下配置我们的应用程序。苹果提供了启动参数和发射环境传递给每个测试类。配置从基类添加启动参数的能力是有意义的。一个很好的例子是,当我们希望使用启动参数从干净的状态启动每个测试时。

XCUIApplication().launchArguments = ["-StartFromCleanState", "YES"]

这是一个启动参数的例子,但是您可以传递由IOS开发人员创建的任何参数或环境。我们可以在基类中配置它,还可以将基类扩展到XCTestCase班级,等级最后,我们XCUITestBase类看起来像这,这个:

现在我们已经创建了基类,接下来的任务是修改我们的测试。XCUITest101UITest到基类的子类,并使用来自超类的常用方法。

重构UI测试以使用基类
为了重构我们的原著XCUITest101UITest,我们可以采取以下几项行动:

我们不需要记录测试,所以,首先,让我们去掉testRecorded()我们班的考试。
接下来,我们可以重命名我们的测试方法。testRefactored()用更明智的方法。在验证欢迎消息时,让我们将这个测试重命名为testWelcomeMessage()
我们必须将测试的超类替换为XCTestCase到XCUITestBase这样我们就可以使用基类中的所有公共工作流。
替换XCUIApplication()到app从基类。
完成上述步骤后,我们的测试类将如下所示这,这个:

现在我们的测试类看起来好多了,更整洁了。通过使用基类,我们将30+行的源代码减少到了8行。如果使用CMD+U关键,你会看到我们的测试仍然通过,没有任何问题。您可以从调试区,它通常是用CMD+Shift+C(??C)在Xcode 10中输入键。在我们的测试中,当测试在模拟器中运行时,日志如下所示:

最后,您可以看到测试将断言欢迎消息并通过。

你自己试试看
本教程的源代码可在baseclass支部这里。您可以自己下载源代码并在Xcode 10中运行测试。在命令行中,您可以获得如下源代码:

$ git clone https://github.com/Shashikant86/XCUITest101
$ cd XCUITest101
$ git checkout baseclass
$ open XCUITest101.xcodeproj/
项目在Xcode 10中打开后,请按CMD+U运行XCUITest。

结语
在这篇文章中,我们抽象了基类中XCUITest的通用代码,以避免重复。然而,要使我们的测试具有可伸缩性和真正的可重用性,仍然需要很多改进。我们将在即将发布的文章中将SWIFT最好的测试模式应用于我们的XCUITest。请继续关注。

原文地址:http://blog.51cto.com/14009535/2301421

时间: 2024-10-03 01:08:51

用基类编写干XCUITest测试的相关文章

第十二周项目一 教师兼干部类】 共建虚基类person

项目1 - 教师兼干部类] 分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部).要求: (1)在两个基类中都包含姓名.年龄.性别.地址.电话等数据成员. (2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资). (3)对两个基类中的姓名.年龄.性别.地址.电话等数据成员用相同的名字,在引用这些数据成

DikeJs基类BaseClass的编写

在编写组件的基类时,我从未想过要把这个类的方法和属性编写的这么密集,后来在D.js (DikeJS core component)DikeJs的核心组件的出现,使得方法得到了进一步的扩充,D.js目前只有一个方法,就是根据ID和NAME获取实例化后的组件对象,而基类BaseClass中存在的公共属性.方法和私有属性和方法使得每个组件在继承时有了选择性.   此刻DikeJS的成长真是有着许多的偶然和思维的跳跃,一个类的内容可能会让读者存在很大的疑问,为了处理这些疑问,我尽量的将注释写到最好. B

编写高质量代码改善C#程序的157个建议——建议23:避免将List<T>作为自定义集合类的基类

建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口.FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable<T>和ICollection<T>(或ICollection<T>的子接口,如IList<T>),前者规范了集合类的迭代功能,后者规范了一个集合通常会有的操作. 一般的情况下,下面两个实现的集合类都能完成默认的

Android App框架设计之编写基类BaseActivity

Android App框架设计之编写基类BaseActivity 编写基类BaseActivity - OOP里面子类里面能够共享父类的方法,提高代码的可复用性 - 基类的编写要根据实际项目的情况,有的可能很简单 比如只是显示 "关于" 信息, 业务功能非常少 你可以不用继承基类进行扩展 BaseActivity继承Activity 还是 FragmentActivity 还是其它? 也是根据你的技术要求,因为解决问题的方法有很多种,或者你根本不用写基类也能完成工作. 我们的目的是编写

saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)

一.编写插件基类 1.目录结构 1.我是如何获知我有多少种系统? 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了 每次对主机发送命令的动作时,我从库里把数据取出来,我去判断有几种就可以,每个模块执行之前都要这样的判断, 直接把用户分配给了不同的模块,这就变成我了我每个模块都要写一边(重复劳动) 写一个公共的类,就是提取这些,你一定要有一个公共的类,他的作用是为了规范其他的模块 2.运行结果截图 cmd和state只要一执行就会自动去提取主机 二.获取主机列表

[DikeJS]编写组件基类(八)

通过前几章的定义,发现所有的组件可以拥有共同的方法,例如,设置渲染,设置组件的id.name,以及曾经使用的event方法,在这里也可以得以使用,因此我删除了之前的Event类,在基类中添加了event的触发事件,完成了渲染完成组件后执行设定好的方法,代码如下: /**  * @Author Dike.Li  * @Date 2015/8/31  * @class BaseClass  * @public  * @Description Basic classes for all compone

(六)编写基类BaseDao

DAO基类中配备增删改查的操作. 1 public interface BaseDao<T> { 2 //新增 3 public void save(T entity); 4 //更新 5 public void update(T entity); 6 //根据id删除 7 public void delete(Serializable id); 8 //根据id查找 9 public T findObjectById(Serializable id); 10 //查找列表 11 public

Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试,那么建立单元测试就有很大的必要,本篇主要介绍如何利用VS创建内置的单元测试项目进行实体框架的基类接口测试. 在采用单元测试这个事情上,很多人可能想到了NUnit单元测试工具和NMock工具进行处理,其实微软VS里面也已经为我们提供了类似的单元测试工具了,可以不需要使用这个第三方的单元测试工具,经试

C++进阶学习——线程基类的设计(Linux)

此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下: ThreadBase.cpp, ThreadBase.h为线程基类 ThreadDerive.cpp, ThreadDerive.h为测试派生类 main.cpp为测试程序 ThreadBase.h内容如下: #ifndef __THREADBASE_H__ #define __THREADBASE_H__ #include <pthread.h> //线程基类 class ThreadBase { publ