目录
1.读取 csv 文件
#通常文件csv
1.找到文件
url_path = os.path.join(os.path.dirname(__file__), "..", "..", "data", file_name)
2.打开这个文件
with open(url_path, "r", encoding="utf8") as file_data
3.读取这个文件中的内容:csv库
file_value = csv.reader(file_data)
4.把读取到的内容转换成python中的列表
list_file = list(file_value)[line]
5.把读取到的内容返回出去(按行返回,1行就表示1个用例)
return list_file
#当文件是配置文件时,第四步需要把数据转化成字典
4.把读取到的内容变成字典
dict_file = dict(file_value)
5.返回这个字典信息,所有一起返回
return list_file
2.数据ddt参数化
2.1实施步骤
- 创建测试数据
- 封装读取数据的方法,保留测试脚本调用的接口/属性(需要传递给脚本什么参数)
- 编写自动化测试脚本
- 脚本中调用封装好的处理数据文件的模块并引入测试数据
- 执行测试脚本并分析测试结果
2.2代码举例(unittest框架)
import unittest
import ddt
from openpyxl import load_workbook
from selenium import webdriver
def Excelread():
driver= load_workbook('sanmu.xlsx')
sheet = driver['登录']
rows = sheet.max_row
usernamelist = []
#取出表格中有用的数据信息
for one in range(2, rows+1):
#取出姓名
name = sheet.cell(one, 2).value
password = sheet.cell(one, 3).value
usernamelist.append([name, password])
driver.close()
return usernamelist
@ddt.ddt
class Logincases(unittest.TestCase):
a = 5
b = 2
@classmethod
def setUpClass(cls) -> None:
#数据可以是元祖,列表,字典
value = Excelread()
#装饰器@ddt.data是用来将value拆成['姓名数据', '密码数据']
@ddt.data(*value)
#unpack则是将['姓名数据', '密码数据']两个元素分别赋值传入给uname和passwd
@ddt.unpack
def test_login(self, uname, passwd):
self.driver = webdriver.Chrome()
self.driver.get('登录网站')
self.driver.implicitly_wait(15)
self.driver.find_element_by_name('userName').send_keys(uname)
self.driver.find_element_by_name('userPass').send_keys(passwd)
self.driver.find_element_by_css_selector('button[οnclick="login();"]').click()
@classmethod
def tearDownClass(cls) -> None:
self.driver.quit()
if __name__ == '__main__':
Logincases.main()
3.PO 模式
3.1介绍
PO模式:Page Object,是一种页面对象设计模式,算是一种比较好的设计模式。在该设计模式中,功能类(PageObjects)所代表的是每个页面之间的逻辑关系。核心思想是分层,实现松耦合,脚本重用,脚本易维护。
3.2非po模式和po模式对比
非PO模式 | PO模式 |
面向过程的线性脚本 | POM把页面元素定位和业务操作流程分开。实现松耦合。 |
复用性差 | UI元素的改变不需要修改业务逻辑代码。只需要找到对应的PO页修改定位即可,数据代码分离 |
维护性差 | PO能使我们的测试代码提高代码的可读性,高复用性,可维护性。 |
3.3Po分层及彼此关系
- 基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。
- PO层:元素定位、获得元素对象,页面动作
- 测试用例层:业务逻辑,数据驱动
- 三者关系:PO层继承基础层,测试用例层调用PO层。
3.4代码举例(非PO模式)
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class PracTesting( unittest.TestCase ):
@classmethod
def setUpClass(cls) -> None:
# 打开浏览器
cls.driver = webdriver.Chrome()
# 加载百度首页
cls.driver.get( 'http://www.baidu.com' )
cls.driver.fullscreen_window()
def test01(self):
self.driver.implicitly_wait(5)
# 在百度搜索栏中输入软件测试
self.driver.find_element( By.ID, 'kw' ).send_keys( '软件测试' )
# 点击百度一下按钮
self.driver.find_element( By.ID, 'su' ).click()
def test02(self):
time.sleep(2)
#返回搜索页面
self.driver.back()
time.sleep(2)
# 在百度搜索栏中输入接口测试
self.driver.find_element( By.ID, 'kw' ).send_keys( '接口测试' )
# 点击百度一下按钮
self.driver.find_element( By.ID, 'su' ).click()
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
if __name__ == '__main__':
unittest.main()
3.5代码举例(PO模式)
3.5.1基础层BasePage
from selenium import webdriver
class BasePage:
#构造方法
def __init__(self):
# 打开浏览器
self.driver = webdriver.Chrome()
# 加载百度首页
self.driver.get('http://www.baidu.com')
#封装定位元素
def find_ele(self,*args):
ele = self.driver.find_element(*args)
return ele
3.5.2PO层
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class BaiduPage(BasePage):
#元素定位,
baidu_text_loc = (By.ID, 'kw')
baidu_submit_loc = (By.ID, 'su')
#获得元素对象,
def get_text_obj(self):
ele = self.find_ele(*BaiduPage.baidu_text_loc)
return ele
def get_submit_obj(self):
ele = self.find_ele(*BaiduPage.baidu_submit_loc)
return ele
#页面操作
def search(self,search_string):
self.get_text_obj().send_keys(search_string)
self.get_submit_obj().click()
3.5.3测试用例层
from ddt import ddt, data
from po.baidu_page import BaiduPage
@ddt
class BaiduTest(unittest.TestCase):
@data('软件测试','接口测试')
def test01(self,seaString):
BaiduPage().search(seaString)
time.sleep(5)
if __name__ == '__main__':
unittest.main()