python_pytest
一。过滤用例
1.定义
pytest,是由第三方开发的一个python单元测试框架,与python自带的unittest有些类似(pytest不完全兼容unittest)。
与unittest相比:
优点:
1)编写用例比较灵活,不需要unittest那样先继承,setUp,tearDown这样的写法,pytest中可以在函数或者类中使用
2)pytest更加简洁灵活(筛选用例)
3)不需要加载用例,自动发现用例
4)pytest兼容unittest
--pytest的 parametrize 、fixture、hook 、无法兼容unittest兼容
5)可以使用测试插件
6)引用测试报告更加方便
不足之处:
1)unittest是python自带的标准库,不需要安装
2)不需要考虑与python版本兼容的问题
注意:
2.parametrize 数据驱动
1)调用方法:
@pytest.mark.parametrize("test_info", page_footing_expected)
def test_login(self, test_info, driver):
'''
test_info:需要和 parametrize中的写法保持一致
page_footing_expected:测试数据,目前只写了预期结果
driver:前置条件,打开某个网址后的driver
'''
try:
# 获取预期结果
expected = test_info
# 操作步骤
actual = home_page.get().page_footing().page_footing_keyword_click()
assert expected == actual
except Exception as e:
logger.error("测试失败用例不通过")
raise e
2)与unittest中的ddt 相比还是有很大区别的:
--首先不用继承unittest.Testcase
--不用在测试类上面写装饰器:@ddt.ddt (pytest 是可以不用写类就可以运行 测试用例的)
--在unitest中需要使用self.assert..来进行结果比对 pytest 直接使用assert就可以了
3.pytest发现用例的规则(也可以在pytest.ini配置文件中重新设置发现规则)
1)模块名称以test_或者_test.py
2)测试类中不能有__init__(self)
3)方法名称必须以test_开头
4)pytest测试用例可以脱离类的形式,可以直接使用函数的形式;类也可以不集成unittest.TestCase
5)自动发现用例(以如上1)、2)、3)的规则),unittest需要加载用例,用例执行顺序是按照ASCII码的顺序执行,pytest是按照用例的先后顺序一条条执行。
4.过滤用例
1)先注册ini文件,添加标签名(pytest.ini)
2)打标签:需要在测试用例函数上面加 @pytest.mark.标签名 (标签名:步骤1)注册的标签名)
3)运行制定标签用例:
-m 运行指定标签名的测试用例
--or :error_test or sucess_test :只有有这两个标签中的其中一个标签就会运行
--and :error_test and sucess_test :找到同时有这两个标签的用例运行
-s 捕获所有的输出,如果不加-s输出信息不会展示
1.控制台命令:python -m "标签名"
2.python文件中执行:
if __name__ == "__main__":
#执行标签名为error_test的用例
pytest.main("-m error_test")
3.引用测试报告:
if __name__ == "__main__":
#新增一个时间戳
ts = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
#引入html测试报告,使用测试报告时需要先下载测试报告(pip install pytest-html)
pytest.main(["--html={}.html".format(ts), "-m error_test"])
#运行多个标签
pytest.main(["--html={}.html".format(ts),"-m error_test","-m suesses"])
5.测试夹具
1).测试夹具设置(需要写在固定py文件中 =‘conftest’,该文件一般与‘run.py’同级放置--也就是放在最外层)
yield:相当于unittest中的setup和teardown前置准备机制
@pytest.fixture(scope="function")
def driver():
'''
yield之前为前置条件
yield之后的为后置条件
yield 并排的driver是返回的参数,此处可以把driver返回
管理浏览器
function:每次执行都调用
class:一个类只执行一次
module:一个模块中只执行一次
:return:
'''
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(WAIT_TIME)
yield driver
driver.quit()
2).测试夹具的使用:
pytest.main(["--html={}.html".format(ts),"-m error_test","-m suesses"])
assertTrue
二。重运行
安装:pip install pytest-rerunfailures
执行:pytest -- reruns 2 --reruns-delay 5 :运行失败后每隔5秒中运行一次,总共重新运行2次
pytest.main(['--reruns','5']) :运行失败后重新运行5次