前言:在使用unittest 框架时,发现其两个缺点:
1、unittest 执行测试用例中每个.py文件时都要重新打开浏览器,无法实现一次性加载浏览器来执行所有用例(如:登录--》执行所有用例--》退出);
2、unittest框架局限性,driver不能跨py模块使用。
为了解决以上问题,于是就去学习了pytest框架并做了初步实践,如果写的不好,还请大家多指教!
场景及操作步骤:
1、登录(需要输入用户名、密码,点击登录按钮;登录成功后获取登录结果)
2、新建用户 (登录以后可以新建用户)
3、关闭浏览器
一、pytest 的安装
1、安装
命令:pip install -U pytest
2、查看版本
命令:pip show pytest
二、编写代码
1、项目目录
case : 存放测试用例
common : 存放公共文件
page: 封装页面业务
report: 存放测试报告
conftest.py : 文件名不能修改,同目录下所有测试文件运行前会执行此文件
2、base.py 文件,封装基本操作方法
#-*- coding=utf-8 -*-
from selenium.webdriver.support.ui importWebDriverWaitfrom selenium importwebdriverfrom selenium.webdriver.support importexpected_conditions as ECfrom selenium.common.exceptions importTimeoutExceptionclassBase(object):def __init__(self, driver):
self.driver=driverdeffind(self, locator):"""locator = ("id","kw"),查找某元素"""
try:
element= WebDriverWait(self.driver, 10, 1).until(lambda x: x.find_element(*locator))returnelementexceptTimeoutException as msg:print("元素不存在")defsend(self, locator, text):"""输入框传值,元素不存在时跳过执行"""
try:
self.find(locator).clear()
self.find(locator).send_keys(text)exceptTimeoutException as msg:#print("元素不存在",msg)
pass
defclick(self,locator):"""点击事件"""self.find(locator).click()
3、login.py 文件,登录的业务代码
#-*- coding=utf-8 -*-
from selenium importwebdriverimporttimefrom common.base importBaseclassLogin(Base):deflogin(self, username, password):"""登录"""user= ('name', 'loginName')
self.send(user, username)
pwd= ('name', 'loginPassWord')
self.send(pwd, password)
submit= ('id', 'loginBtn')
self.click(submit)
time.sleep(2)
content= ('id', 'title')
res=self.find(content).textprint('已成功登录', res)if __name__ == '__main__':
driver=webdriver.Chrome()
url= ""driver.get(url)
4、adduser.py 文件 登录后添加用户的业务代码
#-*- coding=utf-8 -*-
from selenium importwebdriverimporttimefrom common.base importBaseimporttimeclassAddUser(Base):defadd_user(self, user, phone, password, repassword):"""登录后添加用户"""yonghu= ('id', 'uname')
self.send(yonghu, user)
shouji= ('id', 'uphone')
self.send(shouji, phone)
mima= ('id', 'password')
self.send(mima, password)
remima= ('id', 'password2')
self.send(remima, repassword)
time.sleep(1)
button= ('id', 'savebtn2')
self.click(button)if __name__ == '__main__':
driver=webdriver.Chrome()
url= ""driver.get(url)
5、conftest.py 文件
#-*- coding=utf-8 -*-
importpytestfrom selenium importwebdriverfrom page.login importLoginimporttime
@pytest.fixture(scope='session')defdriver():global_driverprint('------------open browser------------')
_driver=webdriver.Chrome()
_driver.maximize_window()
_driver.implicitly_wait(10)yield_driverprint('------------close browser------------')
_driver.quit()
@pytest.fixture(scope='session')deflogin(driver):"""登录"""url= "登录的url地址"driver.get(url)
time.sleep(5)
login_system=Login(driver)
login_system.login("13166666666", "666666")yielddriver.delete_all_cookies()
6、测试用例文件:test_user_one.py、test_user_two.py ,两个文件内容一样,只是模拟两个用例。
importpytestfrom page.adduser importAddUserclassTestOne(object):deftest_01(self, login, driver):
url= "新增用户页面的url地址"driver.get(url)
user=AddUser(driver)
user.add_user('test', '13122222224', '666666', '666666')if __name__ == '__main__':
pytest.main(["-s", "test_user_one.py"])
三、运行测试用例
1、进入项目根目录
2、输入命令:
pytest case (运行多个测试用例)
pytest case/test_user_one.py (运行单个用例)
-s : 显示打印信息
四、生成allure测试报告
1、安装allure
将下载后的压缩包解压至本地(比如解压至D盘)
把bin目录添加到环境变量path下
2、安装 allure-pytest
pip install allure-pytest
3、运行用例
(1)打开cmd命令
(2)进入到项目根目录
(3)执行命令
pytest --alluredir ./report/allure_raw
执行命令完成后,在report文件下中可以看到生成了一个allure_raw的原始文件,不能打开成html的报告。
打开html的报告需要启动allure服务,启动命令如下
allure serve report/allure_raw
启动服务后会自动分配端口并打开浏览器
五、查看测试报告
以上就是所有内容了,快来试试吧~
过程中报错解决:
运行生成报告命令时报如下错误:是因为安装的pytest版本不兼容,提示推荐使用pytest 4.5.0 。
卸载 pytest 其他版本,如5.3.2
pip uninstall pytest==5.3.2
安装 pytest 4.5.0
pip install pytest==4.5.0