基于python3的UI自动化框架搭建系列(一)

基于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('测试报告发送完成...')

后记

差不多现在还是实现到现在的程度,后面至少可以优化,测试数据从xlsxmlexcelmysql中读取。
(感觉自己现在实现的还是好弱。。。)

附上github上已经实现的框架,供参考,建议还是自己去一点一点的搭建,直接用个人觉得是有点功利的做法了,写代码,还是慢慢来的好。

ATX
Auto_Analysis
APPIUM

文章目录
  1. 框架实现目标
  2. 基于ddt和nose的简单尝试
    1. 配置模块
    2. 执行模块
  3. 后记
|