Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Functional Testing in iOS

Functional Testing in iOS

作者头像
100000798482
发布于 2018-08-20 09:06:42
发布于 2018-08-20 09:06:42
1K00
代码可运行
举报
文章被收录于专栏:一个番茄说一个番茄说
运行总次数:0
代码可运行
什么是Function Testing(摘自wikipedia

Functional testing is a quality assurance (QA) process and a type of black-box testing that bases its test cases on the specifications of the software component under test. Functions are tested by feeding them input and examining the output, and internal program structure is rarely considered (not like in white-box testing). Functional testing usually describes what the system does.

为什么需要Functional Testing

在讨论这个问题前先来一些对比:

  1. Functional Tesing vs Unit Testing Unit Testing关注点在于单独的代码片段,可信度较高且易扩展,是从开发者的视角来编写的。相对Functional Testing来说更快,你可以很快地为某段代码编写测试,执行速度快,能够更快的定位bug。但是它并不关心产品的业务逻辑,所以当单元测试通过并不能保证你的产品能够满足业务需求。
  2. Functional Testing vs Integration Testing Integration Testing主要用于不同module、system等之间的集成测试。Unit Testing用于保证每个代码片段能够独立地正确工作,但是并不能保证他们集成在一起能够正确工作。你需要集成测试将不同的功能模块集成在一起来进行测试。但是相对Functional Testing来说它还是不能保证某个feature能够得到预期的结果。

下面的Test Pyramid摘自Martin Fowler的 文章,越高层次产生的用户价值会更高且更慢,越低层次的产生的价值更低且更快,你所写的任何一行单元测试代码对于你的用户来说都是不可见的,他能感知到的只能通过UI来体现。可以看出我们需要很多的单元测试来保证我们的代码质量,这对开发人员来说是有巨大价值的,它能够帮开发人员快速发现且定位问题。

Test Pyramid

Funtional testing 属于UI测试,UI测试包含行为和外观。Functional testing从用户行为这个维度来保证了代码的质量。比如我需要对用户登录进行测试,我需要测试的点就可能涵盖用户点击了登录,需要看到界面上有相应的提示,成功之后需要到达主界面等。

BDD 与 Functional Testing

在敏捷实践中我们通过BDD(Behavior-driven development)来帮助我们完成Functional testing。BDD鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作,让其能够在一个共同的基础上达成共识。

BDD的框架很多,下面简单的罗列了一下:

框架

语言

Cucumber

Ruby

JBehave

Java

RBehave

Ruby

Specflow

C#

它们基本上都是基于Gherkin作为DSL在不同语言上的实现,让我们可以用自然语言去书写我们的代码。

用BDD来为某个feature书写测试通常包含以下几个部分:

  • 一个简单的Title
  • 对测试场景进行简单描述
  • 验收步骤以及预期行为的描述

在对验收步骤进行描述的时候通常会用到这样的格式"Given ... When ... Then ",各自的含义如下

  1. Given: 测试的前置条件
  2. When: 指定用户的行为
  3. Then: 验证结果

因此,如果用这样的格式去描述用户登录的场景就大概应该是:

  1. Given 用户打开登录界面
  2. When 用户填写账号和密码后点击登录按钮
  3. Then 用户登录成功来到主界面。

当然除了这几个关键字,可能你还会接触到And、But、Or等,使用它们可以增加代码的可读性。 通过自然语言的描述,业务专家、QA或者其他没有技术背景的人也可以很明确地明白这个测试是在干什么。

针对于iOS开发,苹果本身的XCTest不能很好的支持我们写Functional testing。它基于assert来完成测试,而很多时候assert所表达的含义也很难理解,同时它相对来说也比较难mock。所以我们可能还需要一些工具来方便我们写Functional Testing。

下面简单的列了一些iOS开发中能够用来UI Testing的框架:

框架

语言

支持平台

Calabash

Gherkin \ Ruby

iOS \ Android

EarlGrey

OC \ Swift

iOS

Frank

Gherkin \ Ruby

iOS \ MAC

KIF

OC \ Swift

iOS

UI Test

OC \ Swift

iOS

Calabash和Frank都是基于Cucumber,但是Calabash有着更丰富的特性,比如更丰富的内建步骤、更多的手势支持等,支持的平台也更加丰富,使用范围更广。

EarlyGrey是google推出的,内建同步机制,测试会在与UI进行交互前自动等待动画、网络请求等事件,当然它还是允许你手动处理同步。它会确保执行动作前,UI处于稳定的状态。EarlGrey基于XCTest,因此在Xcode中你可以很容易的建立一个测试用例类。当然在我写下这篇文章的时候它还存在一些问题,比如不支持3D Touch,不能和Address Sanitizer一起工作等,完整的列表在这里

具体使用哪种工具大家可以根据自己项目的实际情况来考虑,我目前的项目中使用的是Calabash。

使用Calabash-iOS写Functional Testing

要想在你的iOS工程中使用Calabash你需要一定的步骤安装依赖包以及配置工程,可以移步到Calabash查看具体的步骤。

一切都设置好了之后,工程目录下会多一个叫features的目录,顾名思义里面会包含你需要测试的feature。 比如我需要对登录进行测试。我在目录下新建一个叫做login.feature的文件,然后开始描述测试的用户场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Feature: User login flow

  Scenario: User can login with correct account number and password
    Given I can open the login page
    When I type "myname" into the account number input field
    And I type "mypassword" into the password input field
    And I click then login button
    Then I can login successful and see home page

另外,Calabash内建了很多的steps,但是不一定额能够完全满足你的需求,你可能还需要一些自定义的步骤,自定义的步骤都放在step_definitions里面。 比如我需要定义输入账号这个步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
When(/^I type "(.*?)" i into the account number input field$/) do |value|
  @login_page.touch_account_field
  keyboard_enter_text value
end

当描述好feature,并且定义好了步骤之后,这样一个用例测试就完成了,接下来你可以通过cucumber命令来执行它。

为了方便调试,Calabash还提供一个的命令行工具,通过命令calabash-ios console来使用。 比如你要查找出当前成为焦点的输入框,然后让它停止输入状态,你可以像下面这个样子

query "textField isFirstResponder:1", :resignFirstResponder

在这里支持的命令和在step定义里支持的命令是一样的,所以在你不确定的时候,可以通过命令行工具快速的检验一下。

最后

在CI中加入UI的自动化测试,可以的降低时间成本提升生产力。但是这并不是银弹,还得结合自身项目,用多少,怎么用都得仔细去考虑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.08.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
史上最全的 iOS 各种测试工具集锦!
随着移动互联网的兴起,APP 测试的越来越被重视!Android 系统因为自己的开源性,测试工具和测试方法比较广为流传,但是 iOS 系统的私密性,导致很多测试的执行都有点麻烦。
测试开发技术
2024/03/22
7600
史上最全的 iOS 各种测试工具集锦!
使用Calabash进行Android和iOS UI测试
因为各种事,这篇本来属于上周的拖到了就今天,一篇关于移动端测试工具Calabash的文章,看着篇幅比较小,就接受了。本身精力不在Android和iOS开发,所以也就没按部就班的复原教程中的实例,仅当开阔视野了。
WindCoder
2018/09/19
2.1K0
使用Calabash进行Android和iOS UI测试
分层测试
自动化测试一直是测试领域桂冠上的明珠,几乎所有的测试团队都有建立团队的自动化。测试团队的自动化建设也被认为是团队提效的必经之路,但搭建和使用自动化路但路却并非一帆风顺。搭建自动化但时候有很多框架可以选用,合理但选择适合该团队的框架可以事半功倍,同时选择了框架之后就要受制于框架。使用自动化很多时候因为学习以及维护成本高,让初衷是提效为目的的自动化,成为了加重测试工作量之殇。
luxididi
2020/06/14
5.9K1
【腾讯 TMQ 】移动 APP 自动化测试框架对比
作者:赵丽娜 简介 移动 APP 的 UI 自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化用例的大量维护。 从分层测试的角度,自动化测试应该逐层进行。 最大量实现自动化测试的
腾讯移动品质中心TMQ
2017/03/06
6.7K0
客户端自动化测试研究
背景 测试作为质量保证极其重要的一环,在移动App开发流程中起到非常关键的作用。从开发工程师到测试工程师,人人都应具备良好的测试意识,将隐患和风险在上线之前找出并解决,可以有效的减少线上事故。 美团和大众点评App作为美团点评平台的主要入口,支持承载着美团点评各大业务。其中美团点评境外度假业务主要包括了出境游相关业务以及所有的境外城市站,也是美团点评非常看重和大力发展的业务线。为了保证质量,需要进行各项测试:冒烟测试[1]、功能测试、集成测试、专项性能测试,回归测试[2]。其中冒烟测试和回归测试大多由开发自
美团技术团队
2018/03/13
3.3K0
客户端自动化测试研究
Cucumber测试实践
来源:https://cucumber.io/docs/guides/overview/
ThoughtWorks
2022/02/16
9950
Cucumber测试实践
Android 平台实现 CI
在TW技术雷达上,有一个很重要的趋势,就是把在传统技术领域已经成熟的技术实践,比如持续集成,推广到新兴技术领域,比如移动开发和前端开发。 北京办公室的朱傲这次用自己的实践告诉我们如何在Android这
ThoughtWorks
2018/04/18
1.8K0
Android 平台实现 CI
两款iOS和Android都通用的开源自动化测试工具
自动化测试在产品测试上有着非常重要的作用。实现测试自动化有多种积极的方式,包括最大限度地减少测试执行时间;在关键的发布阶段,用更少的时间确保更大的覆盖范围;在产品开发阶段,可靠又重复性地运行以确保没有
非著名程序员
2018/02/02
2.9K0
两款iOS和Android都通用的开源自动化测试工具
使用Cucumber在Android中实现行为驱动开发
通过使用人类语言,行为驱动开发(BDD)弥合了软件开发中技术人员和非技术人员之间的差距。
云云众生s
2024/11/10
1580
使用Cucumber在Android中实现行为驱动开发
移动开发流水线建立以及自动化测试
工业时代流水线的发明将生产任务的效率大大提升。同样,在软件开发过程中流水线的建立也能帮助我们更好的产出、提升效率。
100000798482
2018/08/20
1.3K0
移动开发流水线建立以及自动化测试
软件测试|iOS 自动化测试——技术方案、环境配置
移动端的自动化测试,最常见的是 Android 自动化测试,我个人觉得 Android 的测试优先级会更高,也更开放,更容易测试;而 iOS 相较于 Android 要安全稳定的多,但也是一个必须测试的方向,这个系列文章记录了 iOS 自动化测试的一些实践。
霍格沃兹测试开发Muller老师
2022/12/29
1.5K0
浅谈BDD下的自动化测试框架
测试驱动开发(TDD)相信大家已经很熟悉了,而行为驱动开发(BDD)其实是TDD的一种演化。那什么是BDD,为什么要使用BDD, BDD下的自动化测试该如何做呢?本文将通过简单的例子,向大家展示如何使用Cucumber 描述需求,编写、执行测试用例,并输出测试报告。
yuanyi928
2018/08/15
7.3K0
浅谈BDD下的自动化测试框架
QA应该更新的测试工具
视觉感知测试,对于很多 QA,包括我在 2013 以前对于它的认知都是手动测试领域的一个成员。在这个 Web 系统爆炸的年代,Web UI 界面布局测试,多浏览器测试,CSS 的 refactor 等都成为了 Web UI 测试的痛中之痛,特别是大型 Web 应用的功能回归测试量太大,从而导致很多时候根本无法完成,所以很少会有团队去做全方位的 UI 界面布局回归测试,特别是对于使用 Agile 流程开发的团队就更加困难。
Criss@陈磊
2020/04/26
1.8K0
开源 | 携程机票BDD UI Testing框架 - Flybirds
携程机票从2018年年中正式引入BDD,至今已3年多,成为内部首选的敏捷开发技术。
携程技术
2022/01/18
9050
开源 | 携程机票BDD UI Testing框架 - Flybirds
你不知道的Cypress系列(1) --鸡肋的BDD
Behavioural Driven Development (BDD)是从TDD发展来的(什么,TDD你都不知道?!),它通过自然语言定义系统行为,以功能使用者的角度,编写需求场景,且这些行为描述可以直接形成需求文档,同时也是测试标准。
iTesting
2020/12/15
1.6K0
你不知道的Cypress系列(1) --鸡肋的BDD
干货 | 基于 BDD 理念的 UI 自动化测试在携程度假的应用
Leo Li,携程高级软件工程师,负责度假 BDD-Test UI 自动化测试框架的研发、维护和迭代等工作。
携程技术
2020/06/24
2.8K0
干货 | 基于 BDD 理念的 UI 自动化测试在携程度假的应用
测试兵器谱のCucumber-JVM框架篇
最近业务上使用的自动化测试项目在改进项目执行方案,优化框架,正好结合实践记录一下最近遇到的问题和解决方法,打算从以下几个部分跟大家探讨一下:
雷子
2021/03/15
1.6K0
测试兵器谱のCucumber-JVM框架篇
cucumber测试框架
1.1 什么是BDD(行为驱动开发)   首先了解一个概念,BDD(BehaviorDrivenDevelopment:行为驱动开发)为用户提供了从 开发人员和客户的需求创建测试脚本的机会。因此,开始时,开发人员,项目经理,质量保证,用户验收测试人员和产品所有者(股东)都齐聚一堂,集思广益,讨论应该传递哪些测试场景,以便成功调用此软件/应用程序。这样他们想出了一组测试场景。所有这些测试脚本都是简单的语言,所以它也可以服务于文档。
爱撸猫的杰
2019/08/24
4.1K0
如何高效使用Gherkin
时间回到2022年,我参与了一个使用了Flutter技术构建的Web前端项目。在这个项目上,我们小组的目标是实施Flutter前端自动化测试。
ThoughtWorks
2023/09/18
3550
如何高效使用Gherkin
什么是行为驱动的 Python?
您是否听说过 行为驱动开发(behavior-driven development)(BDD),并好奇这是个什么东西?也许你发现了团队成员在谈论“嫩瓜”(LCTT 译注:“ 嫩瓜(gherkin)” 是一种简单的英语文本语言,工具 cucumber 通过解释它来执行测试脚本,见下文),而你却不知所云。或许你是一个 Python 人(Pythonista),正在寻找更好的方法来测试你的代码。 无论在什么情况下,了解 BDD 都可以帮助您和您的团队实现更好的协作和测试自动化,而 Python 的 behave 框架是一个很好的起点。
用户8639654
2021/10/25
1.7K0
相关推荐
史上最全的 iOS 各种测试工具集锦!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验