02_pytest_基础实战篇

一、pytest_ini 文件

1、通过 pytest.ini配置文件运行的规则
2、位置 : pytest.ini文件一般放在项目的跟目录
3、编码方式必须是 ANSI 可以使用 nodepade++修改编码方式(或者在pychaem右下角将文件格式改为GBK)
4、作用 可以修改pytest的默认的行为规则
5、运行规则: 不管是主函数的模式运行,还是命令行的模式运行,都会去读取这个配置文件
文件内容:

[pytest]
#m命令行参数
addopts = -vs -m 'smoke or sign'
#指定测试用例的文件夹
testpaths = ./vip_pytest_one/testcases/
#改变默认的模块规则
python_files = test_*.py
#改变默认的类规则
python_classes = Test*
#改变默认的用例规则
python_functions = test_*
#改变默认的基础路径
#pytest_base_url = ""
#用例标记分组定义标记
markers =
    smoke:冒烟测试
    product_manager:商品管理
    user_manager:用户管理
    sign:注册

二、如果通过pytest进行冒烟测试

如何分组执行(冒烟、分模块执行)
 smoke :冒烟用例 分布在各个模块里面
1、需要在用例上面标记  @pytest.mark.smoke
2、需要在pytest.ini中 添加配置 markers 标记

markers =
    smoke:冒烟测试
    product_manager:商品管理
    user_manager:用户管理
    sign:注册

3、在测试用例中去用@pytest.mark.XXX去调用这个标记(注意先标记才能使用)

最好间一个文件夹 testcases/ 在下面存放测试用例的各个模块(test_api.py)

pytest规定模块名必须test_ 开头

import pytest


class Testapi:
    #使用标记之前必须到先在pytest.ini文件中定义标记
    @pytest.mark.smoke
    def test_01_login(self):
        print("登录")

    @pytest.mark.sign
    def test_02_singn(self):
        print("注册")

4、添加冒烟测试或者分模块执行,怎么运行,在pytest.ini中配置命令行参数 -m 多个标记执行用 or 分开 

[pytest]
#m命令行参数
addopts = -vs -m 'smoke or sign'

也可以在命令行中直接执行被标记的

pytest -vs -m “smoke”
pytest -vs -m “usermanage”
pytest -vs -m “smoke or usermanage”

5、运行,通过主函数来执行

建一个 run.py文件放在根目录下面,敲入一下代码,会先调用 pytest.ini配置文件,从而判断执行那些测试用例,或者模块, 以及执行的参数, 执行的顺序, 冒烟测试 等等 

import pytest

if __name__ == '__main__':
    pytest.main()

三、、pytest执行测试用例的顺序
unittest : asccil
pytest : 从上到下执行
(1)如果在pytest不想从上倒在执行怎么办?
通过添加标记装饰器去执行: 在每一个用例(函数test_)的上一行 添加
@pytest.mark.run(order=num)

(2)pytest跳过测试用例
1、无条件跳过
@pytest.mark.skip(reason="XXX")
2、有条件跳过 
@pytest.mark.skipif(age>=18,reason='已成年')

import pytest


class Testapi:
    def test_01_login(self):
        print("登录2")
    
    #标记执行的顺序
    @pytest.mark.run(order=1)
    def test_02_sign(self):
        print("注册2")

四、pytest测试用例胡前后置(夹具)

pytest框架实现的一些前后置(固件,夹具)的处理,常用三种
注意: 和unittest不同的是定义的前后置方法都是小写
def setup_class(self):   //在每一个类执行之前的初始化工作 :比如创建日志,创建数据库对象
def setup(self):       // 在执行每个测试用例之前的初始化的代码: 打开浏览器 加载网页
def test_01_baili(self)://用例
def teardown(self):   //在执行测试用例之后的测试的收尾工作
def teardown_class(self)  //在每个类执行之后的扫尾工作 ,比如销毁日志对象 ,销毁数据库链接


2、更灵活的实现前后置的方法:

使用@pytest.fixture()装饰器实现部分用例的前后置, 也可以实现全部用例的前后置
@pytest.fixture(scope=“”,params=“”,autouse=“”,name=“”)
(1)scope:表示的是被@pytest.fixture标记的方法的作用域  function(默认) ,class, module,package/session
(2)params :参数化 支持的数据格式: list dict tuple 字典列表【{},{},{}】  字典元组({},{})
(3)autouse=True :自动使用   默认Flase

(4)ids:当使用params参数化时候,给每一个值设置一个变量,意义不大
(5)name:表示的是给我们被标记的 @pytest.fixture 标记的方法取一个别名  ,如果定义了别名,调用的时候,原来定义的夹具方法名字就不再可用

实现参数化要注意:  fixture:夹具 
@pytest.fixture(scope='function',params=['1','2','3'])
def my_fixture(request):
      print("前置")
      yield
      print("后置")
 
     return request.param    //注意在一个函数里面 yiled后置和 返回参数不能公用 
以下写法ok
@pytest.fixture(scope='function',params=['1','2','3'])
def my_fixture(request):
      print("前置")
      return request.param
规则:参数列表传递个给 request、 每次执行返回一个参数 ,有几个参数则被执行几次

@pytest.fixture(scope='function',params=['1','2','3'])
def my_fixture(request):
      print("前置")
      yield  request.param
     print(“后置”)
规则:return 和yeield 都表示返回的意思,但是return 后面不能有代码,yield返回后可以接代码 

3、conftest.py和@pytest.fixture() 结合使用实现全局的前置应用 (比如项目全局登录,模块的全局处理 )
1、conftest.py 文件是单独存放的一个夹具配置文件,名称是不能改的
2、用处是可以在不同的py文件中 使用同一个fixture函数
3、原则上 contest.py 需要和运行的用例放到同一层里面,并且不需要做任何的导入文件的操作

总结:
 setup/teardown  ,setup_class/teardown_class 他是作用域所有的用例和所有的类
@pytest.fixture() 他的作用不是既可以部分也可以全局后置 
confest.py和  @pytest_fixture()  结合使用,作用于全局的前后置

五、断言不写笔记了

六、pytest结合allure-pytest插件生成allure测试报告
1、pytest-html
2、allure-pytes

allure-pytes 下载 ,解压 ,配置path路径 
1、下载 : allure-2.13.7 zip  找到此报的bin的路径 配置到path路径下面 
系统属性 高级 环境变量  系统变量   path 将bin路径配置到最前面  
验证 : allure --version
doc验证 
pycharm验证  
问题 doc可以验证  但是pycharm验证失败 需要重启pycharm

2、生成 json格式的临时报告
在pytest.ini
[pytest]
addopts = -vs --alluredir ./temp

3、

3、生成allure报告
在all.py 
if__name_=='__main__'
    pytest.main() 
    os.system('allure generate ./temp -o ./report --clean')    //  ./temp 找到json临时报告   -o 表示ouput输出  --clean 表示生成报告之前先清空之前的报告

你可能感兴趣的:(pytest)