Pytest框架(常用执行命令)
Pytest测试框架与unittest测试框架的区别
安装的命令为:
二、Pytest常用执行命令
import pytest @pytest.mark.add def add(a,b): return a+b @pytest.mark.add def test_add_001(): assert add(1,1)==2 @pytest.mark.add def test_add_002(): assert add('hi','!')=='hi!' @pytest.mark.add def test_add_003(): assert add(8,8)==15 @pytest.mark.skip(reason="该功能已经取消") def test_add_004(): pass @pytest.mark.add def test_admin_001(): pass class TestLogin(object): def test_login_001(self): pass def test_login_002(self): pass if __name__ == '__main__': pytest.main(["-v","-s","test_add.py::TestLogin::test_login_001"])
python -m pytest -v tests/ 模块级别的
moduld级别:python3 -m pytest -v tests/test_add.py
python -m pytest -v tests/test_add.py::test_add_001 执行具体的测试函数
python -m pytest -v tests/test_add.py::TestLogin 执行测试类
python -m pytest -v tests/test_add.py::TestLogin::test_login_001 执行测试方法
(2) -k的是允许你使用表达式来指定希望执行的测试用例,比如某个测试名称是唯一的,以及多个测试名的最前面的名称或者后面名称一致,那么可以使用表达式来快速执行。
python -m pytest -v -k "login" tests/test_wuya.py
python -m pytest -v -k "login or logout" tests/test_wuya.py or关系
python -m pytest -v -k "login and logout" tests/test_wuya.py and的关系
def test_login_001(): pass def test_login_002(): pass def test_logout_001(): pass def test_login_logout_001(): pass def test_regisater_001(): pass
(3)失败立刻停止:-x 我们希望失败立刻停止
python -m pytest -v -x tests/test_add.py
(4)指定失败次数:--maxfail
(5)输出信息展示
python -m pytest -v --tb=short tests/test_add.py
python -m pytest -v --tb=line tests/test_add.py
(6)定位错误:--lf
(9)忽略执⾏: -rs 在编写的测试点中,有的测试⽤例我们是忽略执⾏的
import pytest @pytest.mark.skip(reason="该功能已经取消") def test_add_004(): pass
python -m pytest -v -rs tests/test_add.py
(10)分组执⾏:-m -k
(11)测试执行速度:--durations=N
使用该选项,可以加速测试用例的执行,当然有一点需要记住的是它不关心测试内部是怎么实现的,只统计测试过程中那个阶段执行速度是最慢的,如果参数是--duration=0,它就会按所有阶段耗时从长到短进行排序。
三、Pytest与WebDriver
⾸先安装对应的库,安装的命令为:pip install pytest-selenium pytest来操作webdriver
python -m pytest -v --driver Chrome tests/test_ui.py 指定被测试的浏览器
import pytest import time as t def test_baidu_title(selenium): selenium.maximize_window() selenium.get('http://www.baidu.com') selenium.implicitly_wait(30) assert selenium.title=="百度一下,你就知道" def test_baidu_so(selenium): selenium.maximize_window() selenium.get('http://www.baidu.com') selenium.implicitly_wait(30) so=selenium.find_element_by_id('kw') so.send_keys('无涯 接口测试') t.sleep(3) assert so.get_attribute('value')=='无涯 接口测试'
Pytest参数化
在pytest的测试框架中,我们也是可以通过parametrize来实现参数化的测试,达到刚才说的测试点,⽐如写⼀个add()的函数,那么现在来测试两个数的相加,会存在很多的测试场景的。
import pytest def add(a,b): return a+b @pytest.mark.parametrize("x,y,result",[ (1,2,3), (2,3,5), ("Hi,","zhongguo","Hi,zhongguo"), (1.0,2.0,3.0), (0,0,0), (7,8,15) ]) def test_add_many(x,y,result): assert add(a=x,b=y)==result @pytest.mark.parametrize("data",[ (1,2,3), (2,3,5), ("Hi,","zhongguo","Hi,zhongguo"), (1.0,2.0,3.0), (0,0,0), (7,8,15) ]) def test_add_many(data): # print(data) assert add(a=data[0],b=data[1])==data[2] if __name__ == '__main__': pytest.main(["-v","-s","test_params.py"])
#-v详细信息 -s 输出