Pytest测试框架介绍

1.Pytest测试框架介绍

Pytest框架是近年来比较流行的python自动化测试框架,主要有以下优点:

  • 使用简洁,方便:无需测试类继承,提供详细的失败信息。
  • 自动发现测试用例。
  • 灵活运行指定的测试用例,指定模块,制定测试类,测试用例通过加标签区分正常用例,回归用例 冒烟用例等。
  • 兼容unittest/nose框架。
  • 相关插件众多,可以根据需要扩展功能。

2.环境准备

2.1 安装python

目前基本都是用python3,所以建议装python3.

2.1.1使用home-brew工具安装python3

安装之前先查询以下本机是否已经有python3的包

在终端输入命令brew search python3

如果存在,就可以直接安装了

在终端输入命令brew install python3

如果遇到下面的报错,是因为电脑启用了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下依然无法修改文件,在必要时候为了能够修改下面的文件,我们只能关闭该保护机制。方法:重启电脑,开机一瞬间 按住command+R,打开terminal终端 输入csrutil disable,再次重启。

shopeedeMacBook-Pro:~ shopee1$ brew install python
fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied
fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied
error: could not lock config file .git/config: Permission deniedni


2.1.2或者去官方下载相应的版本自行安装

https://www.python.org/downloads/mac-osx/

2.2 安装编译器

可以选择社区版

https://www.jetbrains.com/pycharm/download/#section=mac

2.3安装pytest包

在终端输入命令pip3 install pytest

3.Pytest特性介绍

3.1 命名

  • 测试文件test_*.py 和 *_test.py开头或结尾,
  • 测试类Test开头,没有__init__函数,测试方法名以test_开头的函数
  • 测试函数以test_开头

3.2特殊的conftest.py文件

定义:conftest.py是pytest独有的文件,文件名字是固定的,不可以做任何修改

作用:可以在文件里面编写fixture,而这个fixture的作用就相当于我们unittest框架里面的setup()和teardown(),供测试函数使用。

用法:一个测试工程下是可以有多个conftest.py的文件,一般在工程根目录放一个conftest.py起到全局作用。在不同的测试子目录也可以放conftest.py,作用范围只在该层级以及以下目录生效。所有同目录测试文件运行前都会执行conftest.py文件,不需要import。

3.3 参数化

  • 使用pytest.mark.parametrize()方式进行参数化

    @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])
    def test_eval(test_input, expected):
        assert eval(test_input) == expected
  • pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数

    @pytest.fixture(params=[0, 1, pytest.param(2, marks=pytest.mark.skip)])
    def data_set(request):
        return request.param
    def test_da(data_set):
        Pass

3.4给用例打标签

给用例打标签

  • 跳过该用例不执行

@pytest.mark.skip(reason='out-of-data api')

  • 当满足某个条件时就跳过

@pytest.mark.skipif(sys.plafform == "win32", reason="does not run on windows")

自定义标签

在pytest.ini文件中注册自己的mark标签,

[pytest]
markers =
       smoketest


在测试用例前面加上标签@pytest.mark.smoketest

加上-m参数执行pytest -v -s Test_DownloadKeywordFile.py -m=smoketest

3.5运行方式

3.5.1运行文件

  • 指定运行某个模块,命令行输入pytest test_demo1.py
  • 指定某个模块下某个类的某个用例,pytest 模块名::类名::方法名,例pytest test_demo2.py::TestDemo2::test_success
  • 指定某个模块下的某个方法,pytest 模块名::方法名,例pytest test_demo1.py::test_fail

3.5.2常用运行参数

可以通过pytest -h或pytest --help查看所有的命令,包含了所有插件的

  • -s:默认情况下你在用例中写的print或者log输出,都不会在测试结果中展示。如果你想看到用例中的标准输出,那么需要加上-s参数
  • -v:使用-v会让输出结果更详细,不用的时候一个文件占一行,而用例之后一个用例占结果的一行。并且结果中的用例名称和结果都会展示,而不仅仅是一个.或字符。
  • -m:标记markers用于标记测试并分组,以便快速选中某些需要的用例并运行。比如我们在冒烟测试时运行其中某一部分用例,等到真正测试时运行另一部分用例。可以通过@pytest.mark.标记名来标记这些需要的用例,运行时用-m标记就能快速选出这部分用例运行。
  • -k:pytest -k "stra or strb"测试类或函数包含stra或strb字符测试将被运行,其他的将忽略

4.测试报告生成

  • 生成txt格式的报告:加参数 --resultlog及存放路径,如 pytest test_class.py --resultlog=./log.txt
  • 生成JunitXML 格式的测试报告, JunitXML报告是一种很常用的测试报告,比如可以和Jenkins进行集成,在Jenkins的GUI上显示Pytest的运行结果,非常便利。 运行完case后可以到report路径下去查看相应的xml文件,也可以在PyCharm打开该xml文件查看。运行时加上参数--junitxml及存放路径
  • 生成html测试报告:需安装pytest-html包。运行时加上--html参数及存放路径
  • 利用allure插件生成测试报告,也可以集成到jenkins。

5.案例实践

上面介绍了pytest的一些特性,现在来看以下Listing QC系统目前的接口自动化实现。

5.1测试背景

目前需要测试http接口,需要验证接口主要是3个方面的内容:

请求参数:每个字段的校验,格式,是否必填,边界值等

返回参数:是否都返回了预期的字段

逻辑校验:是否按照预定的输入返回预期的输出,有些需要和数据库的数据进行比对

5.2整体代码分布

目前由于时间紧急,搭得比较简陋,只有一些基础功能。

--Common存放一些自己编写的类,由于Listing QC涉及的数据库有些是分表分库的,找到具体的表有一定的逻辑,我把这部分逻辑封装成函数,方便操作数据库。

--Conf配置文件存放数据库的连接信息及API的配置信息等。

--run.py 主函数入口,目前主要是用allure插件生成报告

--TestCase测试用例存放处。每个API单独存放一个文件。

--Util存放一些基础操作类,如数据库连接。

5.3设计思路

  • Conftest.py文件中利用pytest自带pytest_addoption函数负责存储好命令行参数。

  • 封装fixture,返回某个表的查询结果。内置的request fixture可以获取设定的命令行参数

  • 将fixture mqc_file_profile_tab作为参数传入测试函数中

  • 命令行输入pytest -v -s Test_ListUploadedFiles.py::test_responsecheck_records运行用例

  • 如果要切换环境,加上参数--env参数,如--env=sit即可

  • 参数化,对于校验字段格式时很实用

allure插件报告生成


5.4未完待续

后续还可以加上日志打印,邮件发送,CI集成等。

写在最后:只要是写的代码就有可能有瑕疵,因此手工测试也是很有必要,我更多地把这个作为辅助测试手段。

附录:

1.pytest参考文档

https://docs.pytest.org/en/latest/contents.html

2.使用Pytest实现接口自动化

原文地址:https://www.cnblogs.com/xingxing666/p/14898854.html