单元测试框架-pytest

单元测试框架-pytest

官网

常用插件

  • pytest-html: 生成html报告
  • pytest-xdist: 实现并发测试
  • pytest-ordering: 实现测试用例顺序设置
  • pytest-rerunfailures: 测试用例失败重试
  • allure-pytest: 生成测试报告
引入依赖

在项目根目录下创建:requirements.txt

pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest

执行命令

pip install -r requirements.txt

验证安装成功

pytest --version

使用Pytest

规范
  • 模块名必须以test_开头或者_test结尾
  • 测试类必须以Test开头,并且不能有__init__方法
  • 测试方法必须以test开头
运行方式
  • 主函数模式

    pytest.main()
    
  • 命令行模式

    pytest
    
  • 通过读取pytest.ini配置文件运行

    • 一般放在项目根目录
    • 编码:必须时ANSI,可以使用notepad++修改编码格式
    • 作用:改变pytest默认行为
    • 运行规则:主函数与命令行模式都会读取该文件
    [pytest]
    #命令行参数,用空格分隔
    addopts = -vs
    # 测试用例文件夹,可以自己配置
    testpaths = ./testcase
    # 配置测试搜索的模块文件名称
    python_files = test*.py
    # 配置测试搜索的测试类名
    python_classes = Test*
    # 配置测试搜索的测试函数名
    python_functions = test
    #测试分组
    markers =
    	g11n:国际化测试组
    	i10n:本地化测试组
    
  • 执行指定模块

    pytest.main(['test_module.py'])
    
  • 指定目录

    pytest.main(['dir_name'])
    
  • 通过nodeid指定测试用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成

    pytest.main('./dir_name/module.py::class_name::fun_name')
    
参数详情
  • -s:显示测试用例的调试内容

  • -v:显示测试用例详细信息

  • -n:多线程执行测试用例

  • –reruns:设置重试次数

  • -x:只要有一个测试用例失败,停止测试

  • –maxfail:设置几个测试失败停止运行

  • -k:根据测试用例的部分字符串指定测试用例

  • -m:指定测试分组

执行顺序
  • unittest:按ascii的大小来运行

  • pytest:默认从上到下

指定测试用例顺序:需要安装pytest-ordering

@pytest.mark.run(order=)
分组测试
@pytest.mark.mark_name
  • mark_name:为自定义的分组名称

运行测试

pytest -m "mark_name"

运行多个分组

pytest -m "mark1 or mark2"
跳过测试
  • 无条件

    @pytest.mark.skip(reason="原因")
    
  • 条件跳过

    @pytest.mark.skipif(expr, reason="原因")
    
生成报告
  • HTML

    pytest --html ./save_path/report.html
    
  • Allure

    下载

    • 解压项目并配置到环境变量中,验证是否安装成功
    allure --version
    
    • 生成json格式临时报告
    --alluredir  ./temp
    
    • 生成allure报告
    allure generate ./temp -o ./report --clean
    

    -o: 报告输出目录

    –clean:对目录进行清除

测试夹具(前后置)
  • setup_class:所有测试用例执行之前运行一次
  • teardown_class:所有测试用例执行之后运行一次
  • setup_method:每个测试用例执行之前运行一次
  • teardown_method:每个测试用例执行完成执行一次

部分测试用例前后置实现:@pytest.fixture()

参数

  • scope:作用域
    • function 方法级别的前后置 (默认)
    • class 类级别的前后置
    • module 模块级别的前后置
    • package/session 包级别的前后置
  • params: 参数化
    • 支持参数类型:(列表:[] 元组() 字典列表[{},{},{}],字典元组:({},{},{}))
  • autouse: 自动执行 默认值:False 如果为False,需要将函数名作为需要调用的方法的参数
  • ids: 当使用params参数化时,给参数列表每一个值设置一个变量名
  • name: 表示的时被@pytest.fixture标记的方法取一个别名
# yield返回后面可以有代码,return后面不能有代码,返回值即为测试方法的所传入的参数
# 参数名必须为request,否则报错[not found]
# 使用name对标记的方法起别名后不能使用原函数名作为参数,否则报错
@pytest.fixture(scope='function', params=['赵姗姗', '马化腾', '张一鸣'], ids=['zss', 'mht', 'zym'], name='fixt')
def my_fixture2(request):
    print("前置")
    yield request.param
    print("后置")

conftest.py与fixture结合使用

  • 通常在每个测试包下可以包含一个conftest.py文件,通常将前后置fixture定义在该文件中,在其他模块中无需导入即可使用
  • 夹具可以使用当前包及其父包的conftest.py中所定义的,同级包无法使用
断言
assert
数据驱动
    @pytest.mark.parametrize('args', ['zss', 'nan', 'lis'])
    def test_ddt(self, args):
        print(args)

    @pytest.mark.parametrize('name,age', [('张三', 21), ('李四', 22), ('王五', 23)])
    def test_ddt2(self, name, age):
        print(name)
        print(age)
  • 参数1:迭代的变量名
  • 参数2:迭代的value

你可能感兴趣的:(Python,单元测试,pytest)