08 自动化测试框架-03pytest测试框架
为什么选择pytest
python的测试框架有:unnittest、pytest、nose。
unittest是Python所提供的标准的单元测试框架,一句话可以选择,Pytest则是基于unittest所研发出来的更好用的、更易用的测试框架,插件也更丰富。并且Pytest几乎兼容了unittest的所有特性,所以我们可以在pytest使用unnitest的特性,反之则不行。
使用pytest
- 安装
pip install pytest
2. 结构
测试文件名字不能一样,否则会报错,我这里写错了。
测试类必须以Test开头,并且不能带有init方法
从上面我们可以看到,我们需要了解的有
- conftest
- pytest的运行参数
- pytest的用例文件名称
断言
assert 条件,条件不符合时的错误输出
# -*- coding: utf-8 -*-
import pytest
a=1
b=1
c=3
class TestDemo():
def test_01(self):
assert a==b, 'a不等于b'
@pytest.mark.test
def test_02(self):
assert a==c, 'a不等于c'
if __name__ == '__main__':
pytest.main(['-q', 'test_case_login.py'])
复制代码
查找用例
- pytest 目录
命令行:pytest test_case
会运行test_case下的所有test_开头或者_test结尾的测试文件
pytest.ini:
[pytest]
testpaths=./test_cases
复制代码
- 显式指定函数名,通过
::
标记
命令行: pytest test_case::test_01
py文件: pytest.mian([‘test_case::文件名字’])
-
–maxfail=1:出现1个失败就终止测试
-
mark
我们可以给每个函数打上不同的标记,测试时指定就可以允许所有被标记的函数
一个函数可以打多个标记;多个函数也可以打相同的标记。
控制运行参数
- -s
默认情况,默认情况下你在用例中写的print
或者log
输出,都不会在测试结果中展示。
如果你想看到用例中的标准输出,那么需要加上-s
参数
pytest test_login.py -s
pytest.main([’-s’, ‘test_login.py’])
复制代码
- -v
使用-v
会让输出结果更详细,不用的时候一个文件占一行,而用例之后一个用例占结果的一行。并且结果中的用例名称和结果都会展示,而不仅仅是一个.
或字符。
- -q
与-v
相反,-q
会输出更简化的信息。
- -l
使用-l
会展示运行过程中的全局变量和局部变量。
参数化 pytest.mark.parametrize(argnames, argvalues)
当对一个测试函数进行测试时,通常会给函数传递多组参数。pytest.mark.parametrize(argnames, argvalues)
- 单元素
2. 多元素参数
一般来说,数据是和逻辑层分开的,数据一般是从excel等文件解析而来
固件fixtures
pytest 会在执行测试函数之前(或之后)加载运行它们。比如说很多操作需要我们登录,或者准备数据库的连接等
在复杂的项目中,可以在不同的目录层级定义 conftest.py
,其作用域为其所在的目录和子目录。
- 预处理
很多时候需要在测试前进行预处理(如新建数据库连接),并在测试完成进行清理(关闭数据库连接)。
当有大量重复的这类操作,最佳实践是使用固件来自动化所有预处理和后处理。
Pytest 使用 yield
关键词将固件分为两部分,yield
之前的代码属于预处理,会在测试前执行;yield
之后的代码属于后处理,将在测试完成后执行。可以把yield可以返回后面的参数
- 作用域 scope
function
: 函数级,每个测试函数都会执行一次固件;class
: 类级别,每个测试类执行一次,所有方法都可以使用;module
: 模块级,每个模块执行一次,模块内函数和方法都可使用;session
: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。
- 自动执行
autouse=True
复制代码
pytest.ini
- 运行test_login的test_01
有配置文件,还有命令行方式。
- pytest.ini
总的来说,相当于全局配置
常用设置选项如下:
[pytest]
addopts = -s …#可添加多个命令行参数,用空格分隔
testpaths = ./test_case #测试用例文件夹,可自己配置,…/pytestproject为上一层的pytestproject文件夹。
python_files = test*.py#配置测试搜索的模块文件名称
python_classes = Test*#配置测试搜索的测试类名
python_funtions = test#配置测试搜索的测试函数名