欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4-pytest之高阶用法-appium测试补充

程序员文章站 2024-02-27 13:53:51
...

pytest之高阶用法

一:pytest之fixture介绍

1,fixture 修饰器用来标记固定的工厂函数,在其他函数、模块、类或者整个工程调用他时会被**优先执行,
通常被用作完成预处理和重复操作

注释:
工厂函数
工厂函数都是类对象, 即当你调用他们时, 创建的其实是一个类实例
例如: str(), list(), tuple()...
内建函数
内建函数通常是python自定义的一些函数, 这些函数通常具有某些特定的功能
例如: len(), hex(), string.capitalize()...

2,ixture是以模块化的方式实现的,因为每个fixture名称都会触发fixture函数,其本身也可以使用其他fixture
3,fixture管理从简单的单元扩展到复杂的函数测试,允许根据配置和组件选项参数化fixture和测试,或者在函数、类、模块或整个测试会话范围内重复使用fixture

二:pytest之fixture用途

1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现

2.测试用例的前置条件可以使用fixture实现

3.支持经典的xunit fixture ,像unittest使用的setup和teardown

4.fixture可以实现unittest不能实现的功能
a>unittest中的测试用例和测试用例之间是无法传递参数和数据的;
b>当每个测试用例的执行环境和条件都不一样时,显然无法用 setup 和 teardown 来实现但是fixture却可以解决这个问题;
c>fixture可以使环境管理更灵活,每个测试用例可以有自己的fixture,作用域可对整个测试类全局生效;

二:pytest之fixture用法

fixture(scope="function",params=None,autouse=False,ids=None,name=None,
1,scope:可以理解成fixture的作用域,
默认:function,作用于每个测试方法,每个test都运行一次
	class,作用于整个类,每个class的所有test 只运行一次
	module,作用于整个module,每个module的所有test 只运行一次,moudule是__init__.py 定义成的资源包
session:作用于整个session,每个session 只运行一次
2,params:list类型,提供参数数据,供调用标记方法的函数使用
3,autouse:是否为自动运行,False为关闭,True 为自动运行

三:pytest之fixture调用

1,通过参数的调用

import pytest
@pytest.fixture()
def before():
    print('\n'+'before_'.rjust(50,'>'))
    with open('data.text',"w") as f:
        f.write("1")
class Test_demo:
    def test_a(self,before):
        with open('data.text',"r") as f:
            assert f.read() =="1", "前置写入的不是1"
if __name__ == '__main__':
    pytest.main(" -s  test_demo.py")
注释:
1,优先运行fixture修饰before() 函数
2,test_a中修饰before函数在此作为参数传入
3,如果此处不调用的话,before就不会运行,想要不传参也运行时,@pytest.fixture(autouse=True)默认是function 时,类内全部用例都会前置执行一次before
@pytest.fixture(scope='class',autouse=True)
当设置成class时,一个类只执行一次。

2,通过函数的调用

# -*-coding:utf-8 -*-
import pytest
def before():
    print('before')
    with open('data.text',"w") as f:
        f.write("1")
@pytest.mark.usefixtures("before")
class Test_demo:
    def setup(self):
        print('setup ')
    def teardown(self):
        print('teardown')
    def test_a(self):
        print('test_a')
        with open('data.text',"r") as f:
            assert f.read() =="1", "前置写入的不是1"
    def test_b(self):
        print('test_b')
        assert True
if __name__ == '__main__':
    pytest.main(" -s  test_demo.py")
注释:
1,test_a不做传参使用,因@pytest.mark.usefixtures("before")修饰类,在类内的所有的test用例执行前都会执行before函数,setup 与teardown除外
2,test_a传参和@pytest.mark.usefixtures("before")修饰类同时修饰时,单个用例传参效果与@pytest.mark.usefixtures("before")修饰效果相同。
3,@pytest.mark.usefixtures("before")此处也可单独放在类中函数中,执行时只会在这个函数之前执行一次

3,通过函数的调用