Pytest----设计开发自动化测试框架
作者:redrose2100   类别:    日期:2022-12-10 18:43:38    阅读:833 次   消耗积分:0 分

    这里就一步一步的设计一套实用的自动化测试框架。比如我们将此测试框架命名为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中设置如下配置:

    1. [pytest]
    2. python_files = test_* *_test.py
    3. python_classes = Test* *Test
    4. python_functions = test_* *_test

    接下来,考虑测试脚本中使用的标签,因为如果标签不注册,在执行的时候会产生大量的告警,因此这里事先注册号几个常用通用的标签,标签按照通常的测试分类进行注册,即在pytest.ini中增加markers的内容,增加后内容为:

    1. [pytest]
    2. python_files = test_* *_test.py
    3. python_classes = Test* *Test
    4. python_functions = test_* *_test
    5. markers =
    6. api: api tests
    7. smoke: smoke tests
    8. function: function tests
    9. system: system tests
    10. security: security tests
    11. performance: performance tests

    接下来配置日志,这里将实时日志和捕获日志全部配置为推荐配置,如下

    1. [pytest]
    2. python_files = test_* *_test.py
    3. python_classes = Test* *Test
    4. python_functions = test_* *_test
    5. markers =
    6. api: api tests
    7. smoke: smoke tests
    8. function: function tests
    9. system: system tests
    10. security: security tests
    11. performance: performance tests
    12. log_cli = True
    13. log_cli_level = info
    14. log_cli_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
    15. log_cli_date_format = %Y-%m-%d %H:%M:%S
    16. log_level = info
    17. log_file = eTest.log
    18. log_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
    19. log_date_format = %Y-%m-%d %H:%M:%S

    接下来配置pytest命令默认的参数,比如这只将 –s 参数加到默认的参数中,pytest.ini此时的配置如下所示,这里配置 –s 参数主要是将默认配置放在这里,当用户看到时如果想增加配置,很自然的可以想到直接在 adopts 后面增加即可。

    1. [pytest]
    2. python_files = test_* *_test.py
    3. python_classes = Test* *Test
    4. python_functions = test_* *_test
    5. markers =
    6. api: api tests
    7. smoke: smoke tests
    8. function: function tests
    9. system: system tests
    10. security: security tests
    11. performance: performance tests
    12. log_cli = True
    13. log_cli_level = info
    14. log_cli_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
    15. log_cli_date_format = %Y-%m-%d %H:%M:%S
    16. log_level = info
    17. log_file = eTest.log
    18. log_format = %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(message)s"
    19. log_date_format = %Y-%m-%d %H:%M:%S
    20. addopts = -s

    至此pytest.ini的配置基本就能满足通常情况下的场景了。
    然后在 eTest/eTest/tests/ 目录下创建env.py文件,用于存放测试环境信息,目的在于做到测试脚本与环境解耦,即通过修改env.py中的环境信息即可做到脚本迁移环境执行,这一点对于设计自动化测试框架来说是至关重要的。此外,因为python文件在引入的时候就会自动执行文件,因此建议使用类来组织变量,即这里在 eTest/eTest/tests/env.py中创建Env类,在类中定义变量,比如这定义ip、username、password。

    1. class Env:
    2. ip="127.0.0.1"
    3. user="root"
    4. password="root"

    接下来在eTest/eTest/tests/目录下创建conftest.py文件,在conftest.py中定义一个用于传递环境变量的值的fixture即env,如下所示:

    1. import pytest
    2. from .env import Env
    3. @pytest.fixture(scope="session")
    4. def env():
    5. return Env
    6. 然后继续在conftest.py中编写一个session级别的fixture,用于编写session级别的setupteardown,此时conftest.py的代码如下:
    7. import pytest
    8. import logging
    9. from .env import Env
    10. @pytest.fixture(scope="session")
    11. def env():
    12. return Env
    13. @pytest.fixture(scope="session",autouse=True)
    14. def session_setup_teardown():
    15. logging.info("开始执行session级别的setup ...")
    16. # session级的setup,可在下面继续编写session级别的setup操作
    17. yield
    18. logging.info("开始执行session级别的teardown ...")
    19. # 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打印日志。当后续继续编写脚本时,可以直接新建脚本文件,将如下模板拷贝过去,然后进行修改填充即可,此外这里还演示了如何使用全局环境变量。

    1. import pytest
    2. import allure
    3. import logging
    4. @allure.step("测试步骤1:xxx")
    5. def step_1(env):
    6. logging.info("测试步骤1:xxx ...")
    7. # 编写步骤1的内容,比如这里打印env.ip
    8. logging.info(env.ip)
    9. @allure.step("测试步骤2:xxx")
    10. def step_2(env):
    11. logging.info("测试步骤2:xxx ...")
    12. # 编写步骤1的内容,比如这里打印env.username 和 env.password
    13. logging.info(env.username)
    14. logging.info(env.password)
    15. @allure.feature("功能:xxx")
    16. @allure.issue(url="www.xxx.com",name="需求来源于xxx")
    17. @allure.link(url="www.xxx.com",name="需求文档地址")
    18. @allure.story("用户故事:xxx")
    19. @allure.severity('normal')
    20. @allure.title("测试用例:xxxc")
    21. @allure.description("测试用例描述:xxx")
    22. def test_api_01(env):
    23. step_1(env)
    24. step_2(env)

    最后,打开cmd窗口,进入eTest目录下,通过如下命令即可创建一个基于Python3.7版本的虚拟机环境

    1. pipenv python 3.7

    然后执行如下命令即可激活此虚拟环境。

    1. pipenv shell

    然后安装依赖。

    1. pip install pytest
    2. pip install allure-pytest

    然后执行如下命令生成依赖文件。

    1. pip freeze > requirements.txt

    此时即会在eTest/目录下生成requirements.txt文件,其内容如下所示。

    1. allure-pytest==2.12.0
    2. allure-python-commons==2.12.0
    3. attrs==22.1.0
    4. colorama==0.4.6
    5. exceptiongroup==1.0.4
    6. importlib-metadata==5.1.0
    7. iniconfig==1.1.1
    8. packaging==22.0
    9. pluggy==1.0.0
    10. pytest==7.2.0
    11. six==1.16.0
    12. tomli==2.0.1
    13. typing_extensions==4.4.0
    14. zipp==3.11.0

    然后在cmd中切换到eTest/eTest/tests目录下,执行pytest命令,结果如下所示,可见所有日志配置均已生效。

    1. (eTest-OXFOQ-1z) G:\github\eTest\eTest\tests>pytest
    2. =================== test session starts ===================
    3. platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
    4. rootdir: G:\github\eTest\eTest\tests, configfile: pytest.ini
    5. plugins: allure-pytest-2.12.0
    6. collected 1 item
    7. api-test/test_api_example.py::test_api_01
    8. --------------------- live log setup ----------------------
    9. 2022-12-11 11:31:46 | INFO | conftest.py:11 | 开始执行session级别的setup ..."
    10. ---------------------- live log call ----------------------
    11. 2022-12-11 11:31:46 | INFO | test_api_example.py:8 | 测试步 骤1:xxx ..."
    12. 2022-12-11 11:31:46 | INFO | test_api_example.py:10 | 127.0.0.1"
    13. 2022-12-11 11:31:46 | INFO | test_api_example.py:14 | 测试步骤2:xxx ..."
    14. 2022-12-11 11:31:46 | INFO | test_api_example.py:16 | root"
    15. 2022-12-11 11:31:46 | INFO | test_api_example.py:17 | root"
    16. PASSED
    17. -------------------- live log teardown --------------------
    18. 2022-12-11 11:31:46 | INFO | conftest.py:15 | 开始执行session级别的teardown ..."
    19. ==================== 1 passed in 0.03s ====================
    20. (eTest-OXFOQ-1z) G:\github\eTest\eTest\tests>

    至此一个简单使用的基于pytest自动化测试框架就搭建完成了,如果想编写自动化脚本只需要在eTest/eTest/tests目录下对应的测试类型的目录下进行脚本开发即可

    始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
    版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/497
    个人成就
    • 博客总数: 613 
    • 阅读总量: 541084 
    • 2022年 : 371 篇 
    • 2023年 : 211 篇 
    • 2024年 : 31 篇 
    • 2025年 : 0 篇 
    测试开发技术全栈公众号
    DevOps技术交流微信群