pytest 学习笔记一

1、pyest  运行规则:

查找当前目录及其子目录下以test _*.py或   *_test.py 文件,找到文件后,在文件中找到以test开头的函数并执行。

 

2、pytest用例设计原则:

1、测试文件以以test _*.py或   *_test.py   

2、测试类以Test开头,并且不能带有 init 方法

3、测试函数以test_ 开头

4、以test_开头的方法

5、断言使用assert

6、所有的包package必须要有 __init__.py   文件

 

3、 cmd  执行pytest 用例有三种方法:

1、pytest

2、py.test

3、python -m pytest

如果不带参数,在某个文件夹下执行时,它会查找该文件夹下所有符合条件的用例

pytest -[options]参数解析:

pytest -X xx.py //-x 遇到错误时停止测试

pytest --maxfail=num xx.py //当用例错误个数达到指定数量时,停止测试

pytest -q  以显示简单结果退出

 

4、执行用例规则:

1、执行某个某个目录下所有用例  pytest   文件名 /

2、执行某一个 py 文件下用例  pytest  脚本名称 .py

3、 -k  按关键字匹配 pytest -k “xxxx” 运行包含与给定字符串表达式匹配的名称的测试,其中包括Python使用的文件名、类名、函数名作为变量的运算符。

4、按节点运行 

    每个收集的测试都分配了一个唯一的nodeid,它由模块文件名和后跟说明符组成来自参数化的类名、函数名和参数,由::characters 分隔。

运行.py模块里的某个函数:pytest 文件夹/test_mod.py::test_func

运行.py模块里面,测试类里面的某个方法:pytest 文件夹/test_mod.py::TestClass::test_method

5、标记表达式

    运行用@pytest.mark.slow装饰器修饰的所有测试

6、从包里运行

    pytest —pyargs pkg_name //导入包,并使用其文件系统位置来查找和运行测试。

 

5、测试用例的setup 和teardown

用例执行级别

1、模块级(setup_module/teardown_module)开始于模块始末,全局的

2、函数级(setup_function/teardown_function)只对函数用例生效(不在类中)

3、类级(setup_class/teardown_class)只在类中前后运行一次(在类中)

4、方法级(setup_method/teardown_method)开始于方法始末(在类中)

5、类里面的(setup/teardown)运行在调用方法的前后

 

6、fixture  之conftest.py

fixture 优势

1、fixture 相对于setup 和teardown 的优势如下

1)命名方式灵活,不局限于setup 和teardown这几个命名

2)conftest.py配置里可以实现数据共享,不需要import就能自动找到一些配置

3)scope = “module"可以实现多个.py跨文件共享前置

4)scope ="session"可以实现多个.py跨文件使用一个session来完成多个用例

 

fixture(scope = “function”,params = None,autouse=False,ids=None,name=None)

使用装饰器fixture的功能,可以使用此装饰器(带或不带参数)来定义fixture的功能。fixture功能的名称可以在以后使用,引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename)标记。测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能被注入。

scope:scope 有四个级别参数,”function”(默认),”class”,”module”,”session”。

params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。

autouse:如果为True,则为所有测试激活,fixture fund 可以看到它。如果为False(默认值)则需要显式激活fixture。

name:fixture的名称,这默认为装饰器函数的名称。如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题的一种方法是将装饰器函数命名

"fixture_<fixturename>",使用 "@pytest.fixture(name=‘fixturename’)”

 

conftest.py 

1、conftest.py 配置脚本的名称是固定的,不能修改名称

2、conftest.py 与运行的用例要在同一个package下,并且有__init__.py  文件

3、不需要import 导入conftest.py,pytest 用例会自动查找

fixtures 可以选择使用yield语句作为测试函数提供它们的值,而不是return。在这种情况下,yield语句之后的代码块作为拆卸代码执行,而不管测试结果如何。fixture功能必须只能产生一次。

7、yield

1、fixture 的teardown 用yield 来唤醒teardown 的执行

2、yield 遇到异常,如果其中一个用例出现异常,不影响yield 后面的teardown执行,运行结果互不影响,并且全部用例执行完之后,yield 呼唤teardown操作。

3、如果在setup 就异常了,就不会去执行yield 后面的teardown 的内容了

4、yield 可以配合with语句使用

 

8、addfinalizer 终结函数

1、在request-context对象中注册addfinalizer 方法也可以终结函数

2、yield 和addfinalizer方法都是在测试完成后呼应相应的代码,但是addfinalizer 具有以下不同点:

1)addfinalizer 可以注册多个终结函数

2)这些终结方法总是会被执行,无论在之前的setup 有没有抛出错误。这个方法对于正确关闭所有的fixture 创建的资源非常便利,即使其一在创建或获取时失败

 

9、参数化parametrize

pytest.mark.parametrize 装饰器可以实现测试用例参数化。可以使用内置的mark.xfail 标记单个测试实例。

@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2-4",6),pytest.param("6*9",42,marks=pytest.mark.xfail),])

def test_eval(test_input,expected):

    print("-------开始用例------")

    assert eval(test_input)==expected

标记为失败的用例就不用执行了,直接跳过显示xfailed.

若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器。

@pytest.mark.parametrize("x",[0,1])

@pytest.mark.parametrize("y",[2,3])

def test_foo(x,y):

    print("测试数据组合:x->%s, y->%s" %(x,y))

assert

pytest 允许使用标准的python 断言来验证python测试中的期望和值。当断言出现异常信息,可以输出一些提示信息

def f():

    return 3

def test_function():

    a = f()

    assert a % 2 == 0,"判断a为偶数,当前a的值为:%s”%a

def test_zero_division1():

    with pytest.raises(NameError):

        1/0

def test_zero_division():

    with pytest.raises(ZeroDivisionError) as excinfo:

        1/0

    assert excinfo.type == ZeroDivisionError

    assert "division by zero" in str(excinfo.value)

 

为了写关于引发异常的断言,可以使用 pytest.raises作为上下文管理器。excinfo是一个异常信息实例,它是围绕实际引发的异常的包装器,主要属性是.type \.value\.traceback。断言type的时候,异常类型不需要加引号,断言value值的时候,需转str。

常用的断言:

assert xx :判断xx 为真

assert not xx :判断 xx不为真

assert a in b: 判断b 包含a

assert a==b:判断a 等于 b

assert a!=b:判断a 不等于 b

 

10、skip 跳过用例

pyest.mark.skip 可以标记无法在某些平台运行的测试功能,或者希望失败的测试功能。

skip 在满足某些条件时才通过测试,否则pytest 应该跳过运行测试。常见的在非windows跳过仅限windows的测试,或者跳过依赖当前不可用的外部资源。

xfail 测试由某种原因而失败,比如对功能的测试尚未实施或尚未修复的错误。标有pytest.mark.xfail ,是一个xpass,在测试摘要中报告。

pytest 计数分别列出skip 和 fail 测试,未显示有关跳过/xfailed测试的详细默认信息,以避免混乱输出,但是可以使用-r选项查看与”short”字母对应的详细信息显示在测试进度中。

pyest -rxXs //显示关于xfailed,xpassed,skipped测试的额外的详细信息

跳过装饰器,可以传递一个可选的原因:

1、跳过测试函数的最简单的方法是使用跳过装饰器标记它,可以传递一个可选的原因

@pytest.mark.skip(reason=“aaaa”)

def test_the_unkown():

    pass

2、通过调用来在测试执行或设置期间强制跳过pytest.skip(reason)

def test_function():

    if not valid_config():

       pytest.skip(reason) 

3、使用pytest.skip(reason, allow_module_level=True) 跳过正个模块级别

if not purest.config.getoption(“—custom-flag”):

    Purest.skip("custom-flag is missing, skipping tests”,allow_module_level=True))

 

skipif:可以用来有条件的跳过某些内容

@pytest.mark.skipif(sys.version_info<3.6,reason=“aaaa”)

def test_the_unkown():

    pass

如果条件在收集期间评估为True,则跳过测试函数,具体制定的原因使用-rs时出现在摘要中。

 2、可以导入标记并在另一个测试模块中重复使用它,对于较大的测试套件,通常最好使用一个文件来定义标记,然后一致适用整个测试套件。

3、使用条件字符而不是布尔值,使模块之间不轻易共享它们,支持它们主要是出于向后兼容的原因。

 

1、无条件的跳过模块中的所有测试:

pytestmark = pytest.mark.skip(reason=“aaaa”)

 

2、根据某些条件跳过模块中的所有测试

pytestmark = pytest.mark.skipif(sys.version_info<3.6,reason=“aaaa”)

 

3、如果缺少某些导入,则跳过模块中的所有测试

pexpect  =  pytest.importtorskip("pexpect")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值