前言
明天就放假了,4天小长假,是不是很开心!也许很多人要回老家帮家里种地,干农活。其实能陪陪家里人,帮忙干点农活还是挺开心的,希望大家有个愉快的假期!废话不多说哈,今天再来说说pytest吧,经过几周的时间学习,有收获也有疑惑,总之最后还是搞个小项目出来证明自己的努力不没有白费
环境准备
序号
库/插件/工具
安装命令
1
确保您已经安装了python3.x
2
配置python3+pycharm+selenium2开发环境
3
安装pytest库
pip install pytest
4
安装pytest -html 报告插件
pip install pytest-html
5
安装pypiwin32库(用来模拟按键)
pip install pypiwin32
6
安装openpyxl解析excel文件库
pip install openpyxl
7
安装yagmail发送报告库
pip install yagmail
8
确保已配置火狐或谷歌浏览器及对应驱动
9
确保已经正确配置好发送邮件的邮箱
项目简介
测试地址
测试范围
1.126电子邮箱登录功能测试-验证正确帐号密码登录成功-验证错误用户名密码登录失败(有很多情况,用例里面做了充分的校验)
2.126电子邮箱添加联系人功能测试-验证正确填写必填项数据添加联系人成功-验证缺省必填项数据添加联系人失败-验证必填项字段数据格式错误添加联系人失败
3.126电子邮箱发送邮件功能测试-验证普通邮件发送成功-验证带附件邮件发送成功
项目设计
1.python编程语言设计测试脚本
2.webdriver驱动浏览器并操作页面元素
3.二次封装webdriver Api 操作方法
4.采用PageObject设计模式,设计测试业务流程
5.通过UI对象库存储页面操作元素
6.通过数据文件存储数据,读取数据,参数化测试用例并驱动测试执行
7.通过第三方插件pytest-html生成测试报告
8.通过yagmail第三方库,编写发送报告接口,测试工作完成后自动发送测试报告
代码分析
目录结构
1 PytestAutoTestFrameWork2 |—|config3 |——|__init__.py4 |——|conf.py5 |——|config.ini6 |—|data7 |——|__init__.py8 |——|tcData.xlsx9 |—Page10 |——|PageObject.py11 |———|__init__.py12 |———|ContactPage.py13 |———|HomePage.py14 |———|LoginPage.py15 |———|SendMailPage.py16 |——|__init__.py17 |——|BasePage.py18 |—|report19 |—|TestCases20 |——|__init__.py21 |——|conftest.py22 |——|test_confactCase.py23 |——|test_loginCase.py24 |——|test_sendMailCase.py25 |—|util26 |——|__init__.py27 |——|clipboard.py28 |——|keyboard.py29 |——|parseConFile.py30 |——|parseExcelFile.py31 |——|sendMailForReport.py32 |—|conftest.py33 |—|pytest.ini34 |—|RunTestCase.py
目录结构
代码实现
通过126邮箱测试范围分析,我们需要通过设计剪切板,模拟键盘完成附件上传操作,因此我们首先来编写这两个方法
1 """
2 ------------------------------------3 @Time : 2019/4/15 12:044 @Auth : linux超5 @File : clipboard.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """
10 importwin32con11 importwin32clipboard as WC12
13
14 classClipBoard(object):15 '''设置剪切板内容和获取剪切板内容'''
16
17 @staticmethod18 defgetText():19 '''获取剪切板的内容'''
20 WC.OpenClipboard()21 value =WC.GetClipboardData(win32con.CF_TEXT)22 WC.CloseClipboard()23 returnvalue24
25 @staticmethod26 defsetText(value):27 '''设置剪切板的内容'''
28 WC.OpenClipboard()29 WC.EmptyClipboard()30 WC.SetClipboardData(win32con.CF_UNICODETEXT, value)31 WC.CloseClipboard()32
33
34 if __name__ == '__main__':35 from selenium importwebdriver36
37 value = 'python'
38 driver =webdriver.Firefox()39 driver.get('http://www.baidu.com')40 query = driver.find_element_by_id('kw')41 ClipBoard.setText(value)42 clValue =ClipBoard.getText()43 query.send_keys(clValue.decode('utf-8'))
clipboard.py-操作剪切板
1 """
2 ------------------------------------3 @Time : 2019/4/15 12:054 @Auth : linux超5 @File : keyboard.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """
10
11 #模拟按键
12 importwin32api13 importwin32con14 importtime15
16
17 classKeyBoard(object):18 """模拟按键"""
19 #键盘码
20 vk_code ={21 'enter' : 0x0D,22 'tab' : 0x09,23 'ctrl' : 0x11,24 'v' : 0x56,25 'a' : 0x41,26 'x' : 0x58
27 }28
29 @staticmethod30 defkeyDown(key_name):31 """按下键"""
32 key_name =key_name.lower()33 try:34 win32api.keybd_event(KeyBoard.vk_code[key_name], 0, 0, 0)35 exceptException as e:36 print('未按下enter键')37 print(e)38
39 @staticmethod40 defkeyUp(key_name):41 """抬起键"""
42 key_name =key_name.lower()43 win32api.keybd_event(KeyBoard.vk_code[key_name], 0, win32con.KEYEVENTF_KEYUP, 0)44
45 @staticmethod46 defoneKey(key):47 """模拟单个按键"""
48 key =key.lower()49 KeyBoard.keyDown(key)50 time.sleep(2)51 KeyBoard.keyUp(key)52
53 @staticmethod54 deftwoKeys(key1, key2):55 """模拟组合按键"""
56 key1 =key1.lower()57 key2 =key2.lower()58 KeyBoard.keyDown(key1)59 KeyBoard.keyDown(key2)60 KeyBoard.keyUp(key1)61 KeyBoard.keyUp(key2)62
63
64 if __name__ == '__main__':65 from selenium importwebdriver66 driver =webdriver.Firefox()67 driver.get('http://www.baidu.com')68 driver.find_element_by_id('kw').send_keys('python')69 KeyBoard.twoKeys('ctrl', 'a')70 KeyBoard.twoKeys('ctrl', 'x')
keyboard.py-模拟键盘
通过测试项目设计,我们需要把测试数据存放在Excel文件中,把页面操作元素存在UI对象库中也就是一个配置文件,那么我们需要对Excel 和 ini文件解析,因此我们开始编写这两个方法,设计UI对象库和测试数据文件
1 """
2 ------------------------------------3 @Time : 2019/4/22 16:124 @Auth : linux超5 @File : parseExcelFile.py6 @IDE : PyCharm7 @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!8 ------------------------------------9 """
10 from openpyxl importload_workbook11 from config.conf importexcelPath12
13
14 classParseExcel(object):15
16 def __init__(self):17 self.wk =load_workbook(excelPath)18 self.excelFile =excelPath19
20 defgetSheetByName(self, sheetName):21 """获取sheet对象"""
22 sheet =self.wk[sheetName]23 returnsheet24
25 defgetRowNum(self, sheet):26 """获取有效数据的最大行号"""
27 returnsheet.max_row28
29 defgetColsNum(self, sheet):30 """获取有效数据的最大列号"""
31 returnsheet.max_column32
33 defgetRowValues(self, sheet, rowNum):34 """获取某一行的数据"""
35 maxColsNum =self.getColsNum(sheet)36 rowValues =[]37 for colsNum in range(1, maxColsNum + 1):38 value =sheet.cell(rowNum, colsNum).value39 if value isNone:40 value = ''
41 rowValues.append(value)42 returntuple(rowValues)43
44 defgetColumnValues(self, sheet, columnNum):45 """获取某一列的数据"""
46 maxRowNum =self.getRowNum(sheet)47 columnValues =[]48 for rowNum in range(2, maxRowNum + 1):49 value =sheet.cell(rowNum, columnNum).value50 if value isNone:51 value = ''
52 columnValues.append(value)53 returntuple(columnValues)54
55 defgetValueOfCell(self, sheet, rowNum, columnNum):56 """获取某一个单元格的数据"""
57 value =sheet.cell(rowNum, columnNum).value58 if value isNone:59 value = ''
60 returnvalue61
62 defgetAllValuesOfSheet(self, sheet):63 """获取某一个sheet页的所有测试数据,返回一个元祖组成的列表"""
64 maxRowNum =self.getRowNum(sheet)65 columnNum =self.getColsNum(sheet)66 allValues =[]67 for row in range(2, maxRowNum + 1):68 rowValues =[]69 for column in range(1, columnNum + 1):70 value =sheet.cell(row, column).value71 if value isNone:72 value = ''
73 rowValues.append(value)74 allValues.append(tuple(rowValues))75 returnallValues76
77
78 if __name__ == '__main__':79 #excel = ParseExcel()
80 #sheet = excel.getSheetByName('login')
81 #print('行号:', excel.getRowNum(sheet))
82 #print('列号:', excel.getColsNum(sheet))
83 #84 #rowvalues = excel.getRowValues(sheet, 1)
85 #columnvalues = excel.getColumnValues(sheet, 2)
86 #valueofcell = excel.getValueOfCell(sheet, 1, 2)
87 #allvalues = excel.getAllValuesOfSheet(sheet)
88 #89 #print('第{}行数据{}'.format(1, rowvalues))
90 #print('第{}列数据{}'.format(2, columnvalues))
91 #print('{}{}单元格的内容{}'.format(1, 2, valueofcell))
92 #print('login{}'.format(allvalues))
93
94 excel =ParseExcel()95 sheet = excel.getSheetByName('mail')96 print('行号:', excel.getRowNum(sheet))97 print('列号:', excel.getColsNum(sheet))98
99 allvalues =excel.getAllValuesOfSheet(sheet)100
101 print('sendmail{}'.format(allvalues))
parseExcelFile.py