基于python3搭建appium ui自动化测试框架尝试系列(一)
框架实现目标
1 2 3 4 5 6 7 8 9 10
| 自动找设备,连接设备 自动启动appium server 使用yml编写用例 配置信息储存在ini文件或conf文件中 自定义log,断言失败截图 用例框架使用unittest或者nose 用例报告html,用例执行完成邮件发送,附件测试报告 多线程执行用例,失败重跑机制 android自动监控权限弹窗 执行过程红性能捕获(adb或者其他形式)
|
基于ddt和nose的简单尝试
当前我能实现的appium自动化测试还是需要手动去起appium server
,这点后面需要改善,github上有很多已经实现了的框架,但是不是很想直接拿来用,还是希望能够自己去一点一点的搭建。
即使是简单的尝试,还是想尽量实现多模块。
配置模块
邮箱配置:包含邮件收发件人,密码,服务器等信息配置;
日志配置:包含日志级别,时间格式,流处理器等;
文件夹创建:包含获取当前日期,时间,创建文件夹等;
其实在之前的博客中已经实现,就不再贴代码了:
邮箱配置
日志配置
文件夹创建是为了在测试过程中,出现断言失败的场景进行截图保存,文件夹使用两层,上一层为当前日期,下一层为当前时间,截图保存名字为断言失败的名字:
MakeDirs.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @author: kyle @time: 2018/2/7 10:17 """ import time,os import traceback from datetime import datetime as dt
def getCurrentDate(): """获取当前日期""" date = time.localtime() today = str(date.tm_year) + "-" + str(date.tm_mon) + "-" + str(date.tm_mday) return today
def getCurrentTime(): """获取当前时间""" time_str = dt.now() now = time_str.strftime('%H-%M-%S') return now
def createDir(): """获取当前文件所在路径绝对路径""" current_path = os.path.abspath('.') # 获取当前日期 today = getCurrentDate() # 构造以今天日期命名的目录的绝对路径 date_dir = os.path.join(current_path, today) print(date_dir)
if not os.path.exists(date_dir): # 如果以今天日期命名的目录不存在则创建 os.mkdir(date_dir) # 获取当前时间字符串 now = getCurrentTime() # 构造以当前时间命名的目录的绝对路径 time_dir = os.path.join(date_dir, now) print(time_dir) if not os.path.exists(time_dir): # 如果以当前时间命名的目录不存在则创建 os.mkdir(time_dir) return time_dir
def takeScreenShot(driver, save_path, pic_name): """截屏""" pic_path = os.path.join(save_path, str(pic_name) + ".png") try: driver.get_screenshot_as_file(pic_path) except Exception as e: print(traceback.print_exc(), e)
|
执行模块
实现思路是ddt
获取数据对象,进行测试数据和代码分离,数据对象包含输入数据以及预期结果,对预期结果进行断言,实现测试实现。
以百度搜索测试为例:
DataDriverByObj.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #!/usr/bin/env python3 # -*- coding: utf-8 -*- import ddt,time import traceback,logging from DdtTools.Log import * from selenium import webdriver from nose.tools import assert_true from selenium.common.exceptions import NoSuchElementException from datetime import datetime as dt from DdtTools.MailSend import MailSend
@ddt.ddt class TestDDTByObj(): """数据驱动测试"""
def __init__(self): """初始化""" self.browser = webdriver.Chrome()
@ddt.data( [u"龙猫", "宫崎骏"], [u"大话西游之月光宝盒", "周星驰"], [u"卧虎藏龙", "李安"] ) @ddt.unpack def test_dataDrivenByObj(self, testdata, expectdata): url = "https://www.baidu.com" self.browser.get(url) # 隐式等待10s self.browser.implicitly_wait(10) try: # 定位搜索输入框,并输入测试数据 self.browser.find_element_by_id('kw').send_keys(testdata) # 定位搜索按键,单击 self.browser.find_element_by_id('su').click() time.sleep(3) # 断言期望结果是否出现在页面源码中 assert_true(expectdata in self.browser.page_source) except NoSuchElementException as e: logging.error(u"查找的页面元素不存在,异常堆栈信息:" + str(traceback.print_exc()))
except AssertionError as e: info(u"搜索:{0},期望:{1},失败".format(testdata, expectdata)) except Exception as e: logging.error(u"未知错误,错误信息:" + str(traceback.print_exc())) else: info(u"搜索:{0},期望:{1},通过".format(testdata, expectdata))
time.sleep(2) self.browser.quit()
if __name__ == '__main__': # mail_subject, report_file mail_subject = 'NoseTests_测试报告_{0}'.format(dt.now().strftime('%Y%m%d')) report_file = 'D:/bug_things/selenium/report/DDTByObj.html' mailsend = MailSend(mail_subject, report_file)
print('开始执行自动化测试...') os.system('nosetests -v {0} --with-html --html-file={1}'.format(__file__, report_file)) # 发送测试报告邮件 print('开始发送测试报告...') mailsend.sendMail() print('测试报告发送完成...')
|
后记
差不多现在还是实现到现在的程度,后面至少可以优化,测试数据从xls
,xml
,excel
,mysql
中读取。
(感觉自己现在实现的还是好弱。。。)
附上github上已经实现的框架,供参考,建议还是自己去一点一点的搭建,直接用个人觉得是有点功利的做法了,写代码,还是慢慢来的好。
ATX
Auto_Analysis
APPIUM