Pytest框架实现一些前后置(固件、夹具)的处理

Pytest框架实现一些前后置(固件、夹具)的处理,常用三种。

一、setup/teardown,setup_class/teardown_class所有用例

为什么需要这些功能?
class TestProduct():

##这个在所有的用例之前只执行一次
    def setup_class(self):
        print("在每个类执行前的初始化工作:比如创建日志对象,创建数据库的连接,创建接口的请求对象")

    def setup(self):
        print("在执行测试用例之前初始化的代码:找开浏览器,加载网页面")

    def test_01_tester(self):
        print("我是电视机")

    def test_02_developer(self):
        print("我是沙发")

    def test_03_producter(self):
        print("我是衣柜")

    def teardown(self):
        print("在执行测试用例之后的扫尾的代码")

    def teardown_class(self):
        print("在每个类执行后的扫尾工作:比如销毁日志对象,销毁数据库的连接,销毁接口的请求对象")
注意:和Unittest不一样的是,全是小写
 

二、使用@pytest.fixture()装饰器来实现部分用例的前后置。

@pytest.fixture(scope="",params="",autouse="",ids="",name="")
  1. scope表示的是被pytest.fixture标记的方法的作用域。function(默认),class,module,package/session

@pytest.fixture()如果不写参数,参数默认就是scope="function",它的作用范围是每个测试用例之前运行一次,销毁代码在测试用例之后运行。

fixture为class级别的时候,如果一个class里面有多个用例,都调用了次fixture,那么此fixture只在此class里所有用例开始前执行一次。

fixture为module时,在当前.py脚本里面所有用例开始前只执行一次

fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。

 

2. params:参数化(支持列表[], 元祖(),字典列表[{},{},{}],字典元祖({},{},{})

@pytest.fixture(scope="function",params=['爸爸','妈妈','宝贝'])
def my_fixture(request):
    print("前置")
    yield request.param        ##另外一种方法即return request.param,区别:return和yield都表示返回的意思,但是return的后面不能有代码,yield
                                 返回后后面可以接代码
    print("后置")
    
class TestLogin():
    def test_01_tester(self):
        print("我是测试,可以登录")

    def test_02_developer(self,my_fixture):
        print("我是开发,可以登录")
        print('-------------------------'+ str(my_fixture))

    def test_03_producter(self):
        print("我是产品,不可以登录")
###输入结果:
test_login.py::TestLogin::test_01_tester 我是测试,可以登录
PASSED
test_login.py::TestLogin::test_02_developer[u7238u7238] 我是开发,可以登录
-------------------------爸爸
PASSED
test_login.py::TestLogin::test_02_developer[u5988u5988] 我是开发,可以登录
-------------------------妈妈
PASSED
test_login.py::TestLogin::test_02_developer[u5b9du8d1d] 我是开发,可以登录
-------------------------宝贝
PASSED
test_login.py::TestLogin::test_03_producter 我是产品,不可以登录
PASSED

3.autouse=True : 自动执行,默认False,为true时每个用例前执行一次前置

4. ids: 当使用params参数化,给每一个值设置一个变量名,意义不大,作用于传参时返回[u7238u7238] 的问题

@pytest.fixture(scope="function",params=['爸爸','妈妈','宝贝'],ids=['dad','mom','baby'])
def my_fixture(request):
    print("前置")
    yield request.param  
    print("后置")

5. name: 表示的是被@pytest.fixture标记的方法取一个别名,当取了别名之后,那么原来的名称就用不了了。

 

三、通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)

 
  1. conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改。

  2. 可以作用于不同的py文件中的使用同一个fixture的函数。

  3. conftest.py需要和运行的用例放到同一层目录下,并且不需要做任何的import导入的操作。

 

总结:

setup/teardown, setup_class/teardown_class, 它是作用于所有用例或者所有的类

@pytest.fixture() 它的作用是既可以部分也可以全部前后置

conftest.py 和@pytest.fixture()结合使用,作用于全局的前后置

 

四、断言

assert 1==2
 

五、pytest结合allure-pytest插件生成allure测试报告

  1. 下载,解压,配置path路径

验证:allure --version
问题:终端中可以验证,pycharm中不能验证,重启pycharm

2. 加入命令生成json格式的临时报告

--alluredir ./temp

3. 生成allure报告

os.system('allure generate ./temp -o ./report --clean')
    • allure generate 命令,固定写法

    • ./temp 临时的json格式报告的路径

    • -o 输出output

    • ./report 生成的allure报告的路径

    • --clean 清空./report 路径原来的报告

三十六般武艺,七十二般变化,修练出个人品牌并发出光芒
原文地址:https://www.cnblogs.com/deeptester-vv/p/14844345.html