全能软件测试工程师
PyTest测试框架
大周
assert ...
import pytest def add(a, b): return a + b # 第一种实现参数化的写法 @pytest.mark.parametrize(['x','y'],[(1,2),(0,3),(1,4)]) def test_add1(x, y): ... # 第二种参数化的写法 xy = [(-1,3),(-1,4),(1,-4)] @pytest.mark.parametrize(['x','y'],xy) def test_add2(x,y): ...
pytest用例默认执行顺序是从上到下
执行顺序通过装饰器设置:
@pytest.mark.run(order=1) @pytest.mark.first # 优先级最高,但不推荐同时使用,容易产生冲突
在优先级方面
如果我们在进行标记顺序时,假设我们采用了数字的形式,那么就都用数字
if __name__ == "__main__": #根据路径指定运行模块或文件夹 # pytest.main(['test_pytest1.py']) # pytest.main(['test_my_case/test_pytest1.py']) # pytest.main(['test_my_case']) #指定运行模块下的测试函数或者测试类 # pytest.main(['test_pytest4.py::test_01']) # pytest.main(['test_pytest4.py::TestLogin::test_05']) #指定多个测试模块运行 # pytest.main(['test_pytest4.py::TestLogin::test_05', # 'test_pytest4.py::test_01'])
setup_class和teardown_class 该方法表示在类中执行测试用例前,只执行1次测试前置和测试后置 setup_method和teardown_method 该方法表示在类中每次执行测试用例前,测试前置和测试后置都会执行一次 setup_module和teardown_module 该方法表示只能类外面执行用例过程中,只执行1次。 setup_function和teardown_function 该方法表示在类外面执行用例过程中,每次都会执行前置和后置
1、setup_class和setup_module执行用例时,只执行一次前置和后置
2、setup_class、setup_method、setup是在类中执行的
3、setup_module、setup_function、setup是在类外执行的
4、其中setup类中、类外都可以执行
fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数。
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。
@pytest.fixture def first_fixture(): return 1,2,3 def test_case1(first_fixture): a,b,c = first_fixture print(a,b,c)
@pytest.fixture def second_fixture(): print("这是第二个fixture") def test_case2(first_fixture,second_fixture): print(first_fixture) print(second_fixture)
session > module > class > function
scope=function
时,无论时在函数中,还是在方法中,都是作用域为funtion在生效import pytest # fixture实现参数化 test_case = [ { 'username':'admin', 'password':'12345678', 'case_desperation':'正确登录' }, { 'username': 'imooc', 'password': '12345678', 'case_desperation': '错误的登录' }, ] @pytest.fixture(params=test_case) def param_data(request): # request是pytest内置的fixture,必须这样写才能传进来 # 它的作用主要就是用来帮助我们传递参数 return request.param def test_param(param_data): usernmae = param_data.get('username') password = param_data.get('password') case_desperation = param_data.get('case_desperation') print("username:"+usernmae+", password:"+password+", case_desperation:"+case_desperation)
@pytest.mark.skip def function(): ...
@pytest.mark.skipif(...) def function(): ...
# 生成测试数据 if __name__ == "__main__": pytest.main([ 'test_pytest13.py', '--alluredir', './result' ]) # 生成allure报告 os.system("allure generate ./result -o ./report_allure --clean") # 直接在默认浏览器中打开测试报告 allure open ./report
学习了PyTest测试框架。