pytest是python的一种单元测试框架,与python自带的unittest测试框架相似,可是比unittest框架使用起来更简洁,效率更高。python
安装方法:web
1 pip install -U pytest
安装成功,查询安装的版本号数组
1 pytest --version
pytest经常使用的插件 session
pytest-selenium 集成 selenium多线程
pip install allure-pytest 生成漂亮的allure测试报告框架
pip install pytest-sugar 优化运行效果分布式
pip install pytest-rerunfailures 执行用例失败后从新运行函数
pip install pytest-xdist 多线程并行与分布式执行单元测试
pip install pytest-assume 多条断言前面报错后面依然执行测试
pip install pytest-cover 测试覆盖率
新建test_one.py,输入如下代码,cmd至文件目录下,输入pytest运行
1 def func(x): 2 return x + 1 3 def test_answer(): 4 assert func(3) == 5 5 #assert func(3) == 4
运行pytest命令,或py.test命令,或python –m pytest命令。(pytest的三种运行方式)
用例不经过与用例经过的结果展现,以下图所示。
pytest容许你使用标准Python断言来验证Python测试中的指望值。
pytest里面断言实际上就是python里面的assert断言方法,经常使用的有如下几种:
assert xx 判断xx为真
assert not xx 判断xx不为真
assert a in b 判断b包含a
assert a == b 判断a等于b
assert a != b 判断a不等于b
pytest.mark.skip 能够标记没法在某些平台上运行的测试功能,或者但愿失败的测试功能。
skip if意味着在不知足某些条件时才但愿测试经过,不然 pytest应该跳过运行测试。 常见示例是在非 Windows 平台上跳过仅限Windows 的测试,或跳过测试依赖于当前不可用的外部资源。
xfail 意味着你但愿测试因为某种缘由而失败。 一个常见的例子是对功能的测试还没有实施,或还没有修复的错误。。
跳过测试函数的最简单方法是使用跳过装饰器标记它,能够传递一个可选的缘由。
例:
@pytest.mark.skip(reason=“本轮测试不执行此用例")
def test_the_unknown():
若是你但愿有条件地跳过某些内容,则可使用 skipif 代替。
例:
import sys
@pytest.mark.skipif(sys.version_info < (3,6),
reason="requires python3.6 or higher")
pytest 能够支持自定义标记,自定义标记能够把一个 web 项目划分多个模块,而后指定模块名称执行。
@pytest.mark.webtest
def test_send_http():
若是不想执行标记 webtest 的用例,那就用”not webtest”
unittest 的都知道里面用前置和后置 setup 和 teardown 很是好用,在每次用例开始前和结束后都去执行一次。
setupClass 和 teardownClass,需配合@classmethod 装饰器一块儿使用。
setup_class>setup_method>setup >用例>teardown> teardown_method>teardown_class
若是一个.py 的文件里面既有函数用例又有类和方法用例,运行顺序以下:
setup_module/teardown_module 的优先级是最大的。
函数里面用到的 setup_function/teardown_function和类里面的 setup_class/teardown_class 互不干涉
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里能够实现数据共享,不须要import就能自动找到一些配置
scope=”module” 能够实现多个.py跨文件共享前置
scope=”session” 以实现多个.py跨文件使用一个session来完成多个用例
1 fixture(scope="function", params=None, autouse=False, ids=None, name=None): 2 """使用装饰器标记fixture的功能 3 可使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称能够在之后使用 4 引用它会在运行测试以前调用它:test模块或类可使用pytest.mark.usefixtures(fixturename标记。 5 测试功能能够直接使用fixture名称做为输入参数,在这种状况下,夹具实例从fixture返回功能将被注入。 6 7 :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session". 8 9 :arg params: 一个可选的参数列表,它将致使多个参数调用fixture功能和全部测试使用它 10 11 :arg autouse: 若是为True,则为全部测试激活fixture func 能够看到它。 若是为False(默认值)则显式须要参考来激活fixture 12 13 :arg ids: 每一个字符串id的列表,每一个字符串对应于params 这样他们就是测试ID的一部分。 若是没有提供ID它们将从params自动生成 14 15 :arg name: fixture的名称。 这默认为装饰函数的名称。 若是fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 16 “fixture_ <fixturename>”而后使用”@ pytest.fixture(name ='<fixturename>')“”。
fixture(scope="function", params=None, autouse=False,ids=None, name=None):
scope 有四个级别参数:function, class、Module、session
params: 一个可选的参数列表,它将致使多个参数调用fixture 功能和全部测试使用它。
autouse: 若是为 True,则为全部测试激活 fixture func 能够看到它。 若是为 False(默认值)则显式须要参考来激活 fixture
每一个字符串 id 的列表,每一个字符串对应于 params 这样他们就是测试 ID 的一部分。 若是没有提供 ID 它们将从 params 自动生成。
name: fixture 的名称。 这默认为装饰函数的名称。
conftest.py 配置脚本名称是固定的,不能更名称
conftest.py 和运行的用例要在同一个 pakage 下,而且有__init__.py 文件
不须要 import 导入 conftest.py, pytest 用例会自动查找
yield:提供fixture 里面的 teardown 功能,用 yield 来唤醒teardown的执行
1.若是其中一个用例出现异常,不影响 yield 后面的 teardown 执行,运行结果互不影响,而且所有用例执行完成后, yield 呼唤 teardown操做。
2.若是在 setup 就异常了,那么是不会去执行 yield 后面的teardown 内容了。
3.yield 也能够配合 with 语句使用。
pytest.mark.parametrize 装饰器能够实现测试用例参数化 它也能够标记单个测试实例在参数化 参数组合 若要得到多个参数化参数的全部组合,能够堆叠参数化装饰器