测试开发技术网站
博客
设计
设计
开发
Python
测试
unittest
运维
Linux基础应用
CI/CD
CI/CD
数据库
数据库
云计算
云计算
云原生
云原生
爬虫
爬虫
数据分析
数据分析
人工智能
人工智能
登录
注册
Pytest----设计开发自动化测试框架
收藏本文
作者:redrose2100 类别: 日期:2022-12-10 18:43:38 阅读:873 次 消耗积分:0 分
[TOC] ![](https://redrose2100.oss-cn-hangzhou.aliyuncs.com/img/7cd47362-951c-11ee-986a-0242ac110004.png) 这里就一步一步的设计一套实用的自动化测试框架。比如我们将此测试框架命名为eTest,因此首先创建eTest目录,为了考虑后续扩展性,比如后期如果觉得测试框架可以发布为python包,则此时就要考虑好,因此在eTest目录中继续创建一个eTest目录,当然暂时先不考虑发布包的方式,但是要为后续可能的功能增强做好兼容性扩展性设计。这里后面的操作将都在eTest/eTest/ 目录下。 首先在eTest/eTest/ 目录下创建tests文件夹,用于存放自动化测试脚本,然后再创建libs文件夹,用于存放公共的函数封装,那么libs目录下这里就不再进行深入的讲解了,这个主要根据具体业务的自动化脚本进行恰当的函数库封装,作为公共的框架,这里就不再进一步的深入了。 至此需要说明的一点,后续自动化脚本的执行位置应该要定位在 eTest/eTest/tests 目录下,即eTest/eTest/tests/目录相当于测试脚本的根目录,因此首先在eTest/eTest/tests目录下创建一个pytest.ini文件,用于配置通用的公共的自动化脚本。 首先配置测试函数、测试类、测试文件的命名规则,虽然说一般来说不推荐对默认的命名规则进行修改,但是由于默认的规则中存在一个很容易混淆的点,即pytest中默认的要求测试文件必须是test_*.py或者*_test.py格式,测试方法必须是test开头,测试必须是Test开头,这里面就涉及到了一些混乱,比如有的有的以test_开头即要求带下划线,有的则没有要求下划线,有的可以以_test结尾,有的又不能,这本身就很容易引起混乱,因此这里可以完全把范围扩大一点,即将测试用例文件的规则修改为以test_*.py或*_test.py,测试函数以test_开头或者以_test结尾,测试类以Test开头或Test结尾,这样一来就很容易记忆了,而且也能包括默认的的pytest规则,这里是否带下划线完全根据python代码规范要求,即文件名或者测试函数名均为小写,此时必须要带下划线,而测试类首字母大写,因此不需要带下划线,这样一来既能包含默认的pytest命名规则,有能做到风格统一,因此首先在pytest.ini中设置如下配置: ```bash [pytest] python_files = test_* *_test.py python_classes = Test* *Test python_functions = test_* *_test ``` 接下来,考虑测试脚本中使用的标签,因为如果标签不注册,在执行的时候会产生大量的告警,因此这里事先注册号几个常用通用的标签,标签按照通常的测试分类进行注册,即在pytest.ini中增加markers的内容,增加后内容为: ```bash [pytest] python_files = test_* *_test.py python_classes = Test* *Test python_functions = test_* *_test markers = api: api tests smoke: smoke tests function: function tests system: system tests security: security tests performance: performance tests ``` 接下来配置日志,这里将实时日志和捕获日志全部配置为推荐配置,如下 ```bash [pytest] python_files = test_* *_test.py python_classes = Test* *Test python_functions = test_* *_test markers = api: api tests smoke: smoke tests function: function tests system: system tests security: security tests performance: performance tests log_cli = True log_cli_level = info log_cli_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s" log_cli_date_format = %Y-%m-%d %H:%M:%S log_level = info log_file = eTest.log log_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s" log_date_format = %Y-%m-%d %H:%M:%S ``` 接下来配置pytest命令默认的参数,比如这只将 –s 参数加到默认的参数中,pytest.ini此时的配置如下所示,这里配置 –s 参数主要是将默认配置放在这里,当用户看到时如果想增加配置,很自然的可以想到直接在 adopts 后面增加即可。 ```bash [pytest] python_files = test_* *_test.py python_classes = Test* *Test python_functions = test_* *_test markers = api: api tests smoke: smoke tests function: function tests system: system tests security: security tests performance: performance tests log_cli = True log_cli_level = info log_cli_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s" log_cli_date_format = %Y-%m-%d %H:%M:%S log_level = info log_file = eTest.log log_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s" log_date_format = %Y-%m-%d %H:%M:%S addopts = -s ``` 至此pytest.ini的配置基本就能满足通常情况下的场景了。 然后在 eTest/eTest/tests/ 目录下创建env.py文件,用于存放测试环境信息,目的在于做到测试脚本与环境解耦,即通过修改env.py中的环境信息即可做到脚本迁移环境执行,这一点对于设计自动化测试框架来说是至关重要的。此外,因为python文件在引入的时候就会自动执行文件,因此建议使用类来组织变量,即这里在 eTest/eTest/tests/env.py中创建Env类,在类中定义变量,比如这定义ip、username、password。 ```python class Env: ip="127.0.0.1" user="root" password="root" ``` 接下来在eTest/eTest/tests/目录下创建conftest.py文件,在conftest.py中定义一个用于传递环境变量的值的fixture即env,如下所示: ```python import pytest from .env import Env @pytest.fixture(scope="session") def env(): return Env 然后继续在conftest.py中编写一个session级别的fixture,用于编写session级别的setup和teardown,此时conftest.py的代码如下: import pytest import logging from .env import Env @pytest.fixture(scope="session") def env(): return Env @pytest.fixture(scope="session",autouse=True) def session_setup_teardown(): logging.info("开始执行session级别的setup ...") # session级的setup,可在下面继续编写session级别的setup操作 yield logging.info("开始执行session级别的teardown ...") # session级别的teardown,可在下面继续编写session级别的teardown的操作 ``` 然后在eTest/eTest/tests/ 目录下依次创建目录api-test、function-test、performance-test、security-test、system-test,依次存放api测试用例、功能测试用例、性能测试用例、安全测试用例、系统测试用例。注意这里创建的目录中都默认创建一个__init__.py文件,用于标志这些目录均为可导入的包,然后在eTest/eTest/tests/api-test/目录下继续创建一个脚本模板,比如test_api_example.py,然后编写脚本模板代码如下,这里使用allure生成报告,使用logging打印日志。当后续继续编写脚本时,可以直接新建脚本文件,将如下模板拷贝过去,然后进行修改填充即可,此外这里还演示了如何使用全局环境变量。 ```python import pytest import allure import logging @allure.step("测试步骤1:xxx") def step_1(env): logging.info("测试步骤1:xxx ...") # 编写步骤1的内容,比如这里打印env.ip logging.info(env.ip) @allure.step("测试步骤2:xxx") def step_2(env): logging.info("测试步骤2:xxx ...") # 编写步骤1的内容,比如这里打印env.username 和 env.password logging.info(env.username) logging.info(env.password) @allure.feature("功能:xxx") @allure.issue(url="www.xxx.com",name="需求来源于xxx") @allure.link(url="www.xxx.com",name="需求文档地址") @allure.story("用户故事:xxx") @allure.severity('normal') @allure.title("测试用例:xxxc") @allure.description("测试用例描述:xxx") def test_api_01(env): step_1(env) step_2(env) ``` 最后,打开cmd窗口,进入eTest目录下,通过如下命令即可创建一个基于Python3.7版本的虚拟机环境 ```bash pipenv –python 3.7 ``` 然后执行如下命令即可激活此虚拟环境。 ```bash pipenv shell ``` 然后安装依赖。 ```bash pip install pytest pip install allure-pytest ``` 然后执行如下命令生成依赖文件。 ```bash pip freeze > requirements.txt ``` 此时即会在eTest/目录下生成requirements.txt文件,其内容如下所示。 ```bash allure-pytest==2.12.0 allure-python-commons==2.12.0 attrs==22.1.0 colorama==0.4.6 exceptiongroup==1.0.4 importlib-metadata==5.1.0 iniconfig==1.1.1 packaging==22.0 pluggy==1.0.0 pytest==7.2.0 six==1.16.0 tomli==2.0.1 typing_extensions==4.4.0 zipp==3.11.0 ``` 然后在cmd中切换到eTest/eTest/tests目录下,执行pytest命令,结果如下所示,可见所有日志配置均已生效。 ```python (eTest-OXFOQ-1z) G:\github\eTest\eTest\tests>pytest =================== test session starts =================== platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0 rootdir: G:\github\eTest\eTest\tests, configfile: pytest.ini plugins: allure-pytest-2.12.0 collected 1 item api-test/test_api_example.py::test_api_01 --------------------- live log setup ---------------------- 2022-12-11 11:31:46 | INFO | conftest.py:11 | 开始执行session级别的setup ..." ---------------------- live log call ---------------------- 2022-12-11 11:31:46 | INFO | test_api_example.py:8 | 测试步 骤1:xxx ..." 2022-12-11 11:31:46 | INFO | test_api_example.py:10 | 127.0.0.1" 2022-12-11 11:31:46 | INFO | test_api_example.py:14 | 测试步骤2:xxx ..." 2022-12-11 11:31:46 | INFO | test_api_example.py:16 | root" 2022-12-11 11:31:46 | INFO | test_api_example.py:17 | root" PASSED -------------------- live log teardown -------------------- 2022-12-11 11:31:46 | INFO | conftest.py:15 | 开始执行session级别的teardown ..." ==================== 1 passed in 0.03s ==================== (eTest-OXFOQ-1z) G:\github\eTest\eTest\tests> ``` 至此一个简单使用的基于pytest自动化测试框架就搭建完成了,如果想编写自动化脚本只需要在eTest/eTest/tests目录下对应的测试类型的目录下进行脚本开发即可
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/497
上一篇:
Pluggy源码解读----PluginManager类的其他功能
下一篇:
Pytest----测试脚本上传git代码仓库
搜索
个人成就
出版书籍
《Pytest企业级应用实战》
测试开发技术全栈公众号
测试开发技术全栈公众号
DevOps技术交流微信群
加微信邀请进群
常用网站链接
开源软件洞察
云原生技术栈全景图
Python语言官方文档
Golang官方文档
Docker官方文档
Jenkins中文用户手册
Scrapy官方文档
VUE官方文档
Harbor官方文档
openQA官方文档
云原生开源社区
开源中国
Kubernetes中文文档
Markdown语法官方教程
Kubernetes中文社区
Kubersphere官方文档
BootStrap中文网站
JavaScript中文网
NumPy官方文档
Pandas官方文档
GitLink确实开源网站
数据库排名网站
编程语言排名网站
SEO综合查询网站
数学加减法练习自动生成网站
Kickstart Generator
文章分类
最新文章
最多阅读
特别推荐
×
Close
登录
注册
找回密码
登录邮箱:
登录密码:
图片验证码:
注册邮箱:
注册密码:
邮箱验证码:
发送邮件
注册邮箱:
新的密码:
邮箱验证码:
发送邮件