通过实例介绍Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试
作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免一些问题,在脚本编写过程中经常遇到的问题:1.代码混乱,难阅读;2.重复编码,效率低;3.需求变化,难维护。

如果一栋楼房的框架设计的不够合理,很可能会出现倒塌的情况,测试框架对我们编写自动化脚本的意义也同样重要,如果没有好的框架,脚本在执行过程中就会出现异常。自动化脚本的意义就是为了测试应用程序的,如果自动化脚本自身就有很多的问题,那么自动化测试的效率和意义就会大打折扣!所以为了保证自动化测试的效率和质量,使用一个成熟稳定的自动化框架就尤为必要了。
作为一个自动化测试工程师,编写脚本时,在引入自动化测试框架后,只需要关心和测试用例相关的脚本部分就可以了。
应用测试框架会给我们带来的收益:1.提高代码的易读性;2.提高编码效率;3.提高代码的易维护性。
2.不引入自动化测试框架的实战
2.1准备被测试app
app实现的功能:在登录页面进行登录,登录成功后自动退出

把app编译到模拟器genymotion中
2.2,工欲善其事必先利其器--自动化测试环境准备
1.Appium;2.Android SDK;3.Appium-python-client(需要注意的是安装Appium-python-client之前,要确保已经安装了Selenium);4.Selenium;5.UIAutomatorViewer;6.PyCharm
2.3,Android App自动化测试
1.使用UIAutomatorViewer来定位app中元素的位置->写脚本的时候借助Appium-python-client提供的一个字典来声明被测试程序的属性

通过命令.find_element_by_id()来定位元素;通过try...except来判断是否登录成功;通过driver.quit()来完成已经获得的权限(资源)的释放。脚本写好之后,执行脚本,步骤:
1.启动并配置appium

2.启动运行脚本


3.如果脚本中没有driver.quit(),脚本只能执行一次,再次执行会报错;解决报错的方法:重启appium

3.引入自动化测试框架UnitTest的实战
3.1UnitTest框架之TestFixture简介
TestFixture在官网上的定义如下图:意思就是说,TestFixture包含三部分:准备+执行+清理;对应的脚本结构如下图:

在工程里新建一个脚本文件,类型选择"python uninttest":


从图中可以看出,一次初始化(setUp),可以执行多条用例(test_something、test_anything),简化了代码的编写,也使得测试用例的维护更简单;
3.2UnitTest框架之TestFixture自动化测试
下面来使用setup、testcase、teardown来改写2.3中的自动化脚本
1.把初始化过程放到setup中,2.把用例执行部分放到testcase中,3.把driver.quit放到teardown中,4.粘贴头部分并引入 import unittest


try...except原理:通过比较真实结果(exist)和预期结果(False/Ture)来实现断言
另外可以看到上图的testcase中,两条用例testLogInTrue()和testLogInTrue()有很多代码是重复编写的,只是传入的参数不同:定位方法和操作,这对于我们维护测试用例、写新的用例是很浪费时间的,那么如何实现复用重复的内容呢?这个就要靠“数据驱动”的方式来实现。


3.3UnitTest框架之TestCase、TestSuite、TestRunner简介
1. TestCase:脚本中的每一条测试用例;2.TestSuite:一个集合,可以控制一组测试用例的执行(有的时候需要指定某一些测试用例一起完成);3.TestRunner:执行测试用例,最后给出测试结果的输出

3.4UnitTest框架之TestSuite、TestRunner自动化测试


使用TestSuite、TestRunner的好处在于:可以控制每次测试要执行哪些用例,在不需要执行的用例前加“#”注释就ok了
有的时候,我们会以一个类的维度去执行测试用例,此时我们需要改一下TestSuite的初始化方式;甚至有的时候我们需要某一个类里的用例全部执行,又需要另一个类里的
某一个用例执行。程序如下图,一共会有3条用例被执行(一次“testLogInFailed”、两次“testLogInOK”)

3.5数据驱动框架DDT简介
python官网上对于DDT的描述:

之前,所有的测试数据是在一条用例里完成的,使用DDT时,每一个测试数据对应一条用例;使用DDT的好处:1.提高代码的整洁度,所有的数据是在自动化脚本里面实现的,
不需要单独的去写读取数据文件的过程;2.提高编写代码效率;
3.6数据驱动框架DDT的使用方法
1.首先要安装DDT库,其次在脚本中引入DDT
1.1,安装方法,进入官网:
,下载图中的文件包

1.2,安装DDT:解压文件包后找到setup.py文件,执行下图中的安装命令来完成安装

1.3,脚本中引入DDT的方法:
,然后在测试类前面加上@ddt的修饰:

说明测试类使用DDT数据驱动框架。
1.4,数据驱动的应用:

当有一个参数时的简单程序见下图(一共传入3次参数,2次失败,1次成功):

当有一个参数时的简单程序见下图(一共传入2次参数,2次成功):

3.7数据驱动框架DDT实战
下面以前文提到的“登录”脚本为例来做DDT实战,因为每次登录的方式是相同的,只是传入的参数不同,所以可以通过数据驱动DDT的方式来设计脚本,
红框中是相比之前,用了DDT之后修改的地方


从上图中的脚本中可以看到,当需要新加一条测试用例的时候,只通过加一条数据就可以实现,方便脚本的维护。
另外,使用数据驱动DDT时,控制器runner.py文件也需要修改;因为使用数据驱动时,脚本中用例名称已经不是声明时的名称了,而是尤其本身自定义的规则(脚本中是testLogIn,执行脚本后变为testLogIn-3)

下图红框中的说使用的方法在使用数据驱动后已经不再“支持”,不能再使用了,需要加#注释掉;所以如果有使用数据驱动的测试类时,在使用Testsuit时,建议都使用“TestLoader().loadTestsFromTestCase()”的方式来驱动

以上简单介绍了Android App自动化测试框架的运用,希望对看到本篇的人有所帮助。
通过实例介绍Android App自动化测试框架--Unittest的更多相关文章
- 初识Android App自动化测试框架--Unittest
1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- 老李分享:android app自动化测试工具合集
老李分享:android app自动化测试工具合集 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...
- 主流App自动化测试框架对比
1.主流App自动化测试框架对比 2.Appium自动化测试框架 官方网址:http://appium.io/ 跨架构:支持原生.混合以及web移动应用 跨平台:Android & I ...
- App自动化测试框架学习探索--从零开始设计
App自动化测试框架学习探索--从零开始设计---持续更新中,敬请关注 1 批量执行app自动化测试使用多线程设计思路: 1)并发级别选择用methods 2)采用@Test多线程,数据提供类dp单线 ...
- 介绍 Android 的 Camera 框架
总体介绍 Android Camera 框架从整体上看是一个 client/service 的架构,有两个进程:一个是 client 进 程,可以看成是 AP 端,主要包括 JAVA 代码与一些 na ...
- 基于appium的app自动化测试框架
基于appium框架的app自动化测试 App自动化测试主要难点在于环境的搭建,appium完全是基于selenium进行的扩展,所以app测试框架也是基于web测试框架开发的 一.设备连接 (即构建 ...
- android常用自动化测试框架
目录: Monkey MonkeyRunner Instrumentation UiAutomator Espresso Selendroid Robotium Athrun Appium Monke ...
- Android App自动化测试实战(基于Python)(三)
1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...
随机推荐
- intern
java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处.但实际 ...
- Android查缺补漏(View篇)--事件分发机制源码分析
在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...
- django下命令行工具
django-admin.py是Django的一个用户管理任务的命令行工具,manage.py是对django-admin.py的简单包装,每个Django Project里面都包含一个manage. ...
- 数据结构 哈希表(Hash Table)_哈希概述
哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...
- jQuery hover() 方法
$("p").hover(function(){ $("p").css("background-color","yellow&qu ...
- Spring AOP中 args和arg-names的区别
这两天在看aop aspectj的各种语法,发现里面有两个概念 args和arg-names很容易混淆,网上也基本没说清楚,所以就动手试了一下,发现还是自己试试比较好理解 先说结论: args是和ex ...
- python 序列
序列 序列是python中的一种数据结构,这种数据结构根据索引来获取序列中的对象 有6种内建序列类:list,tuple,string,unicode,buffer,xrange. 其中xrange比 ...
- python_16_序列化
如何实现不同编程语言进行交互? json数据,相当于语言中间的沟通桥梁 什么是json数据? imoprt json json.dumps(内容) --把内容转换 ...
- Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
在SQL SERVER 2008 R2下用Windows 身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误: 消 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...