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参考文档