自动化测试开展的前提

(1)手工测试结束(大部分bug已被解决)

(2)需求变动不频繁(需求比较稳定)

(3)项目周期够长(至少一个月)

(4)冒烟测试可以考虑使用自动化

(5)项目组(客户)有自动化测试的需求

经过多轮的手工测试,且迭代基本稳定之后,可以开展自动化测试,本项目的模块基本都可以是实现自动化测试。

自动化测试的开始节点

自动化测试的时间节点是功能测试中冒烟测试全部通过且主功能遗留bug数量为0,测试用例中的一级功能不允许遗留测试等级为严重及以上的bug,二级用例中可以遗留几个(一般<=5个)严重程度为一般的bug,在这个标准的前提下,我们视系统基本达到稳定,可以进入到自动化测试环节。

项目架构分析

images-p1-20.png

环境部署

预备工作

(1)Windows 7 / 10

(2)python 35.0以上

(3)安装selenium包

(4)浏览器(Chrome、Firefox、浏览器对应的驱动)

(5)Pycharm

安装Python3.5及以上版本

下载地址:https://www.python.org/downloads/release/python-371/ 下的Windows x86-64 executable installer

images-p1-21.png

 

安装pycharm

下载地址:http://www.jetbrains.com/pycharm/download/#section=windows

推荐使用社区版(Community)

images-p1-22.png

安装Appium Desktop

(1)Appium Desktop主界面

① Host:设置Appium server的ip地址,本地调试可以将ip地址修改为127.0.0.1

② Port:设置端口号,默认是4723不用修改

③ Start server:启动 Appium server

(2)为了便于后续脚本执行,建议在Advanced中勾选Allow session override允许会话覆盖

images-p1-23.png

(3)服务允许界面

images-p1-24.png

安装Appium-Python-Client

(1)pip 是Python的包管理工具,可以通过pip安装、卸载、查看Python的包(模块),Python35以上版本自带pip

(2)在安装appium时,前提是Python安装完毕且能正常运行;

(3)安装appium会同时升级selenium为对应的版本

安装:在DOS命令窗口输入:

pip install Appium-Python-Client
如果由于网络等原因安装失败可以使用国内镜像源进行安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Appium-Python-Client

images-p1-25.png

卸载:

pip uninstall Appium-Python-Client

查看:

pip show Appium-Python-Client

images-p1-26.png

Appium-Python环境验证

(1)Pycham解释器环境查看

images-p1-27.png

(2)脚本执行成功,APP能够打开

(3)允许脚本前检查项:

设备是否处于连接状态;appium server是否已启动;capability配置信息是否正确

# 导包
from appium import webdriver
from time import sleep

# 配置capability信息
caps = {
    # 操作系统的信息
    "platformName": "Android",
    "platformVersion": "4.4.2",
    # 设备信息
    "deviceName": "127.0.0.1:62001",
    # app的信息
    "appPackage": "com.offcn.yidongzixishi",
    "appActivity": "com.offcn.yidongzixishi.SplashActivity",
    # 重置APP的状态
    "noReset": False,
    # 输入法守护
    'unicodeKeyboard': True,
    'resetKeyboard':  True
}

# 实例化设备,启动服务,建立会话 ,打开APP
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
# 定位、操作元素

# 退出会话
sleep(5)
driver.quit()

用例及脚本设计

自动化测试流程其实跟手工测试流程差不太多,要先编写测试用例,只是被叫作自动化测试用例而已。先设计好自动化测试用例,再严格根据设计完成的测试用例编写测试脚本,这是一种规律、一个过程。此过程产出物为自动化测试用例。 自动化测试用例设计和手工测试用例设计是有明显区别的,手工测试用例是从无到有的过程,而自动化测试用例不是的。自动化测试用例是有参考物的,它就是手工测试用例。它有时候可以直接拿来用、有时候需要稍加修改,在此把整个自动化测试用例设计过程分为 3 步: 筛选手工测试用例的过程。 转换手工测试用例的过程。一般转换要素无非两种,一种就是测试用例的格式和规则,另一种就是优化自动化测试业务流程。自动化测试业务流程和手工测。试业务流程还是有一定区别的,自动化测试业务流程更精简、严格。 新增&补充自动化测试用例的过程。

测试用例示例

用例编号功能模块测试要点预置条件测试步骤预期结果设计者优先级实际结果Bug编号Script名
YDZXS-学习_001学习/图书用户资料点击查看查看资料并成功退出网络正常, 已有注册账号1.打开APP进入登录页面; 2.输入正确的手机号和密码并点击【立即登录】按钮; 3.选择科目为【会计】进入APP; 4.关闭升级提示; 5.点击点击【初级会计职称】资料,进入页面后点击查看某一个资料; 6.截图保存并点击返回到主页面; 7.退出账号2.登录成功进入APP首页; 3.当前科目选择为【会计】; 5.成功查看资料内容; 6.截图保存并成功返回主页; 7.成功退出账号ujiuye  Case01_查看文章内容.py

通过可行性分析和用例设计后,接下来需要做一个demo ,等待 demo 完成后,可以再次通过分析自动化测试工作能否顺利地开展下去,因为 demo 已经是一个实体案例,所以,可以完全通过透析 demo 来发现是否存在技术上的致命问题。通常在 demo 完成之后,有经验的自动化测试工程师或组长就能对这个项目的自动化测试工作有一个大体的把握了。一旦通过了抽样 demo 分析,自动化测试就可以展开了。关于 demo 的选取,一般直接选择冒烟测试用例(大冒烟)写成测试脚本后执行,检查脚本是否能够成功运行通过,已设计的测试点是否全部执行到即可。

脚本的设计思路

(1)导包(webdriver)

(2)配置capability信息(OS、device、APP……)

(3)实例化设备,启动服务

(4)定位、操作元素

(5)退出会话

脚本示例

# 导包
from appium import webdriver
from time import sleep
import time

# 配置capability信息
caps = {
    # 操作系统的信息
    "platformName": "Android",
    "platformVersion": "4.4.2",
    # 设备信息
    "deviceName": "127.0.0.1:62001",
    # app的信息
    "appPackage": "com.offcn.yidongzixishi",
    "appActivity": "com.offcn.yidongzixishi.SplashActivity",
    # 重置APP的状态
    "noReset": False,
    # 输入法守护
    'unicodeKeyboard': True,
    'resetKeyboard': True
}
# 实例化设备,连接服务,建立会话
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)

# 隐式等待
driver.implicitly_wait(10)
# 点击【跳过】
driver.find_element_by_id('com.offcn.yidongzixishi:id/skip').click()

# 登录
# 点击输入手机号
driver.find_element_by_id('com.offcn.yidongzixishi:id/et_phone').send_keys('18611112222')
# 点击输入密码
driver.find_element_by_id('com.offcn.yidongzixishi:id/et_pwd').send_keys('ujiuye123465')
# 点击【立即登录】
driver.find_element_by_id('com.offcn.yidongzixishi:id/btn_login').click()

# 选择科目---会计
driver.find_elements_by_id('com.offcn.yidongzixishi:id/llExam')[7].click()
# 点击关闭更新提示
driver.find_element_by_id('com.offcn.yidongzixishi:id/cancel').click()
# 点击【初级会计职称】资料
driver.find_elements_by_id('com.offcn.yidongzixishi:id/book_user_item_item_bg')[0].click()
sleep(3)
driver.find_element_by_xpath('//android.widget.TextView[@text="105. [文章] 【法律事实】知识点摘要"]').click()
sleep(2)
print("查看知识点摘要")
# 获取当前时间
now_time = time.strftime('%Y_%m_%d_%H_%M_%S')
print("now_time: ", now_time)
# 截图
driver.get_screenshot_as_file('../Images/img_题目105_%s.png' % now_time)

# 点击【返回】
driver.find_element_by_id('com.offcn.yidongzixishi:id/headBack').click()
sleep(1)
# 点击【返回】
driver.find_element_by_id('com.offcn.yidongzixishi:id/headBack').click()

# 退出账号
# 点击【我的】
driver.find_element_by_id('com.offcn.yidongzixishi:id/rl_mine').click()
# 点击 【头像】
driver.find_element_by_id('com.offcn.yidongzixishi:id/iv_user').click()
# 点击 【退出登录】
driver.find_element_by_id('com.offcn.yidongzixishi:id/loginOut').click()
sleep(3)
# 退出会话
driver.quit()

测试框架

unittest框架的作用

UnitTest框架是专门用来进行执行代码测试的框架,具有以下功能:

(1) 能够组织多个用例去执行

(2)提供丰富的断言方法

(3)提供丰富的日志与测试结果

UnitTest核心要素

(1)TestCase 测试用例,一个.py文件就是一条测试用例,一条测试用例应该是一个完整的业务流程

(2)TestSuite 测试套件(测试用例集),多条测试用例集合到一起就是一个测试套件

(3)TextTestRunner 测试执行,用来执行测试套件

(4)Fixture,是一个概述,负责测试环境的搭建与销毁,在继承unittest.TestCase前提下,Fixture = setUp() + tearDown()

执行测试

(1)为了脚本能够实现批量执行,必须符合unittest框架测试用例的要求

(2)多个脚本批量执行,执行顺序安装ASCII排序

(3)批量运行前应该先保证每个脚本单独能够执行成功

(4)单个用例脚本结构如下:

images-p1-28.png

Html测试报告

unittest自带生成测试报告

(1) 适用于单条测试用例执行

(2)生成方法:

images-p1-29.png

(3)报告示例:

images-p1-30.png

应用第三方模板生成测试报告

(1) 生成报告的代码

# 导包
import unittest
from YDZX_ujiuye.Tools.HTMLTestReportCN import HTMLTestRunner
import time

# 测试目录
test_dir = "./"
# 生成测试套件
suite = unittest.defaultTestLoader.discover(test_dir, 'Case*.py')

# 报告存放的目录
report_dir = "../Reports/"
# 动态时间
now_time = time.strftime("%Y%m%d_%H%M%S")
# 报告的名字
file_name = report_dir+"移动自习室APP_0817班自动化测试报告_%s_Report.html" % now_time

# 生成报告
with open(file_name, mode='wb') as file:
    # 实例化HTMLTestRunner对象
    runner = HTMLTestRunner(stream=file,
                            title="ujiuye_移动自习室APP_自动化测试报告",
                            description="操作系统:win7 sp1 x64; "
                                        "模拟器:夜神; "
                                        "Android: 4.4.2; "
                                        "Python:Python37; "
                                        "Appium server:1.7.2; "
                                        "APP版本: 4.6.1",
                            tester="优就业ujiuye")

    # 执行测试套件
    runner.run(suite)

(2)报告示例

images-p1-31.png