pytest 介绍及基本使用

阅读目录:
  pytest 介绍
  pytest 测试用例编写规则
  安装pytest
  pycharm 默认测试执行
  第一个示例
  主要命令参数

pytest介绍

官网:https://www.osgeo.cn/pytest/contents.html

pytest是python语言中的一种单元测试框架,与其python自带的unittest测试框架类似
(拓展: java语言下的单元测试框架是 junit 和testng)

pytest可结合requests 实现接口测试, 结合 selenium/playwright、appium实现自动化测试

pytest特点:

1、 具有unittest绝大部分功能,易上手,功能灵活,文档丰富,有很多实例可以参考

2、 具有强大灵活的fixture固件,支持简单的单元测试和复杂的功能测试

3、支持参数化(parametrize)、数据驱动

4、执行待测试过程中可以将某些测试用例跳过(skip),或对某些预期失败的case标记成失败(xfail)

5、支持重复执行(return)失败的case

6、支持运行nose、unittest编写的测试case

7、支持执行部分用例(如:根据标记、或feature、stories等。)

8、支持很多第三方插件(顺序控制pytest-ordering、 allure报告allure-pytest、多线程 pytest-xdist 等),并可自定义开发插件

9、可生辰html报告, 也可结合allure生成精美的测试报告

10、方便jenkins集成 实现持续交付

pytest和unittest区别:

不同点unittestpytest
命名测试方法以test开头模块名必需以test_开头,或以_test结尾
框架结构写case必需定义类,测试类要继承unittest.TestCase不需要继承,可以是函数也可以是类中方法
测试报告使用HTMLTestRunner使用allure-pytest
数据驱动参数化使用第三方ddt参数化使用自带的parametrize
断言断言库丰富采用python断言: 使用assert关键字
失败重试不支持,可自定义类支持支持
固件-灵活的fixture固件
扩展性-快速自定义插件开发

pytest测试用例编写规则

类型规则
模块模块名必需以test_开头 -- test_.py 或者以_test结尾 -- _testpy 建议: test_+业务名称
测试类类名以Test开头
方法/函数以test开头
包名无特殊要求, 包必需要有__init__.py文件

pytest安装

前提环境: 已经安装、配置好python环境

通过命令安装

安装命令: pip install pytest

如果安装不了, 请更换pip源,可考虑使用清华镜像源

image
(上图是已经安装完成的显示,补充: 升级到最新版本: pip install -U pyest)

通过pycharm安装

pycharm中安装需要的包,在settings中,选择Python Interpreter,然后点击“+”

image

搜索要安装的包,右下角可以选择需要的版本,最后左下角安装即可

image

验证安装是否成功:

pytest --version

image

pycharm默认测试执行器

settings中,进入Tools -> Python Intergrated Tools,Default test runner默认是自动发现的,可以直接选择pytest
image

pycharm运行

左侧有绿色执行按钮
image
点击绿色按钮,用的pytest解释器执行的,而不是python解释器

image
结果
image

一次执行模块中所有方法

1、可以非测试方法处点右键执行

2、可以使用main方法运行:调用pytest函数执行测试,需要import pytest

  #!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author: zzd
# @wx: M_Haynes
# @Blog: https://editor.mdnice.com/?outId=3922c88879f84d9d87275683f6153499

import pytest

def inc(x):
    return x + 1

def test_a():
    print("---test_a")
    assert inc(0) == 1

class TestCase:
    def test_b(self):
        print("---test_b")
        assert "zz" in "zzd"

if __name__ == "__main__":
    pytest.main()
# 注解:pytest.main() 等价于 pytest.mian([",/]) 运行当前目录下的所有用例

点击main左侧绿色按钮:
image
结果
image
补充:

如果放到vscode中,会执行工程下所有用例,只运行当前模块的用例,需要增加参数 _file_, 表示当前文件
image

命令运行

注意: 这里需要将前面写的 main 方法进行注销
image

在Terminal 中 进入项目目录,执行pytest

test_a改为失败,一个成功一个失败,成功是.,失败是F

pytest等价于python -m pytest
image

**注意:
如果没有main方法,执行 python case/test_zcs_example.py ,则不会有任何结果**
image
如果有main方法:
image

1. 用pytest的解释器执行用例:
  1、命令行中直接执行pytest
  2、pycharm 中方法和类、直接点绿色执行按钮,运行; 模块和包,选中模块或者包,右键运行;或者非测试方法处点击右键执行(此时pycharm已设置默认测试执行器师pytest)
2. 用python的解释器执行用例:
  1、命令中执行python -m pytest 调用pytest (jenkins持续集成可用到,可指定不同版本的python)
  2、有main函数,命令中执行python xxx.py, 调用py文件中main函数中的pytest.main(); 说明: 直接执行这个模块,被执行的模块是main(可 print(_name_)查看结果),如果此模块被其他模块导入,这个模块就不是main了

主要命令参数

image

-h参数

pytest -h 的结果分类:

  1. 命令行参数
    用于pytest运行时的参数,比如-k、-m等,有通用类、报告类、收集类、调试类、日志类等

通用类
image
报告类
image
告警
image

收集
image

调试
image
日志
image

  1. 元数据
    image
    3.配置参数:pytest.ini中配置的参数
    image
    4.环境变量
    image
    5.重跑失败
    image

    -s参数

    示例:上面示例发现,如果用例执行成功,print内容没显示,可以加-s参数捕获print函数的输出
    image

本文由mdnice多平台发布


承森的技术栈
1 声望0 粉丝