# pytest 接口自动化测试示例 **Repository Path**: com_developer/pytest-demo ## Basic Information - **Project Name**: pytest 接口自动化测试示例 - **Description**: python+pytest+request+allure+yaml接口自动化测试项目实战 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-06-09 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # python+pytest+request+allure+yaml接口自动化测试项目实战 ## Python 环境搭建 在开始项目之前,您的计算机上需要安装 Python。 **以 Window 平台安装 Python 为例:** * 最稳定的 Windows 下载可从 [Python for Windows](https://www.python.org/downloads/windows/) 页面获得。 * 在下载列表中选择 Window 平台安装包。 * 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。 **检查 Python 是否安装成功:** 进入 cmd 命令行,输入: ``` python --version ``` 然后,按下 Enter。 如能正常显示如下所示的 Python 版本号,即表示安装成功: ``` Python 3.9.7 ``` > 3.9.7 是本次安装示例的 Python 版本号,具体版本号请参考您安装的 Python 版本。 请参考 Python 官方[安装文档](https://wiki.python.org/moin/BeginnersGuide/Download)。 **配置系统环境变量:** 可通过安装 [Anaconda](https://www.anaconda.com/products/individual) 自动配置 Python 环境变量。 ## 安装 Virtualenv [virtualenv](https://pypi.org/project/virtualenv/) 是一个需要 Python 解释器才能运行的 CLI 工具。其主要作用是为项目创建独立的虚拟运行环境,所有的第三方库(模块包)安装到项目中与其它项目的环境隔开,保证项目的独立性。 使用 pip 安装 virtualenv,以管理员身份运行 cmd,在命令行输入: ``` pip install virtualenv ``` 然后,按下 Enter,等待安装完成即可。 > 注意:在运行 cmd 命令时,右键选择以管理员身份运行然后再进行安装操作。否则在运行 virtualenv 时会出现 “'virtualenv' 不是内部或外部命令,也不是可运行的程序”的错误。 ## 创建项目 在 D 盘中新建一个文件夹 Test。在命令行工具中定位到 D:/Test 目录。使用 virtualenv 创建项目虚拟环境: ``` virtualenv env ``` 也可以指定 python 版本号: ``` virtualenv env python=[python版本号] | [python路径] ``` 其中 env 为环境名称,您可以随意取一个名称。完成后 Test 目录下多了一个名为 env 的目录。 接下来,需要激活刚刚创建的项目环境。在命令行工具定位到 D:/Test/env/Scripts 目录,输入: ``` ./activate ``` 按下 Enter,即可激活环境。 激活环境后,控制台命令行路径前多了一个 (env) 的环境标识,控制台命令行路径变为如下格式: ``` (env) D:\Test\env\Scripts> ``` 关闭环境使用命令: ``` deactivate ``` > 注意:当结束开发的时候一定要及时关闭环境。 ## 安装 requests [requests](https://github.com/psf/requests) 是一个简单而优雅的 HTTP 库,通过它就可以向服务器发送接口请求并获取接口响应数据。激活环境后将路径回退到项目根目录 D:/Test,并执行以下命令安装 requests 模块: ``` pip install requests ``` 在项目根目录新建一个 run.py 文件,引用 requests 模块发送请求,代码如下: ```python # run.py import requests r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) print(r.status_code) ``` 输入python run.py命令,运行 run.py 文件: ``` (env) PS F:\DEMO\Test> python run.py ``` 控制台打印出 200,则接口请求成功。 ## 安装 pytest [pytest](https://github.com/pytest-dev/pytest) 是一个成熟的全功能 Python 测试工具,可以帮助您编写更好的测试程序。详细内容请查看[官方文档](https://docs.pytest.org/en/latest/reference/customize.html)。 执行安装命令: ``` pip install pytest ``` ### 编写测试用例 当通过 pytest 命令执行用例时,pytest 会自动递归遍历执行路径下所有的目录,根据 pytest 中默认用例的识别的规则,自动收集测试用例。所有在使用 pytest 编写测试用例之前,我们首先需要了解一下 pytest 收集用例时默认的用例识别规则。 **pytest 测试用例识别规则如下:** * 测试用例文件:所有文件名为 test_ 开头或者 _test 开头的文件会被识别为用例文件。 * 测试用例类:测试文件中每个 Test 开头的类就是一个测试用例类。 * 测试用例:测试类中每个 test 开头的方法就是一条测试用例,测试文件中每个 test 开头的函数也是一条测试用例。 > 备注:上述默认的用例查找规则,可在 pytest 的[配置文件](https://docs.pytest.org/en/7.0.x/reference/customize.html#configuration-file-formats)进行修改。 通过了解上述 pytest 中用例识别的规则,可以知道 pytest 中用例编写,能使用函数的形式,也能使用类的形式,那么接下来就分别给大家介绍一下这两种方式编写用例。 **函数形式编写用例:** 用例方法名以 test_ 开头即可,如下: ```python def test_demo(): assert 100 == 100 ``` > 使用命令 pytest 就可以执行测试函数。 **类形式编写用例:** 测试类命名以 Test_ 开头,用例方法以 test_ 开头,如下: ```python class Test_Dome: def test_demo1(self): assert 11 == 11 def test_demo(self): assert 22 == 21 ``` ### 执行测试用例 在上面我们使用的是 pytest 这个命令去执行测试用例。关于 pytest 执行测试,有两种方式,一种是命令行通过 pytest 这个命令执行,另外在代码中可以通过 pytest.main() 这个方法来执行测试。接下来就和大家分别详细的介绍一下 pytest 执行测试的方式和常用的参数。 **pytest.main 执行的参数传递:** ```python import pytest pytest.main(['-v','-s']) ``` 所以的参数放在列表中,每个参数就是列表中的一个元素。 > 详细的参数可以使用命令 pytest -h 查看 **指定执行的测试目录:** ``` pytest tests/ ``` 该命令执行 tests 目录下所有测试文件中的所有测试用例。 **指定执行的测试文件:** ``` pytest tests/test_login.py ``` 该命令执行 tests 目录下 test_login.py 文件中所有的测试用例。 **指定执行的测试类:** ``` pytest tests/test_login.py::Test_Login ``` 该命令执行 tests 目录下 test_login.py 文件中 Test_Login 类定义的所有测试用例。 **指定执行的测试用例:** ``` pytest tests/test_login.py::Test_Login::test_method ``` 该命令执行 tests 目录下 test_login.py 文件中 Test_Login 类定义的 test_method 测试用例。 ### 牛刀小试 在项目根目录新建一个 tests 文件夹管理测试文件,并在该文件夹下新建一个 test_demo.py 的测试文件,编写第一个测试函数,代码如下: ```python def test_passing(): assert(1, 2, 3) == (1, 2, 3) ``` 使用命令 pytest 运行测试函数: ``` pytest ``` 结果如下: ``` ======================= test session starts ======================= platform win32 -- Python 3.9.7, pytest-7.0.1, pluggy-1.0.0 rootdir: F:\DEMO\Test collected 1 item tests\test_demo.py . [100%] ======================== 1 passed in 0.04s ======================== ``` > 注意:pytest 使用 $\color{red}{.}$ 标识测试成功($\color{red}{PASSED}$),使用 $\color{red}{F}$ 标识测试失败($\color{red}{FAILED}$)。 修改上面使用 requests 模块请求接口的示例,做一个接口测试的例子。修改 test_demo.py 文件,代码如下: ```python import requests def test_passing(): r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass')) assert r.status_code == 200 ``` 运行测试查看结果。 ## 输出测试报告 对于软件测试工作来说,测试报告是非常重要的工作产出。一个漂亮、清晰、格式规范、内容完整的测试报告,既能最大化我们的测试工作产出,又能够减少开发人员和测试人员的沟通成本。 [Allure Framework](https://github.com/allure-framework/allure2) 是一个灵活,轻量级的多语言测试报告工具,它不仅可以非常简洁地表示以整洁的 Web 报告形式显示已测试的内容,而且允许参与开发过程的每个人从日常测试执行中提取最大的有用信息。它支持绝大部分测试框架,比如 TestNG、Junit 、pytest、unittest 等。 [Allure 测试报告效果演示](https://demo.qameta.io/allure/) ### 安装 Allure 将测试结果数据生成测试报告,需安装 [Allure](https://github.com/allure-framework/allure2/releases) 到您的计算机上(Windows 系统下载 zip 安装包并解压即可)。 **环境变量配置:** 将下载的压缩包解压后,把 bin 目录加入到系统 PATH 中,比如,我将解压后的文件存放的路径是: ``` D:\allure-2.17.2 ``` 那么就需要把如下路径加入到环境变量——>系统变量的 PATH 中: ``` D:\allure-2.17.2\bin ``` 还需要安装 allure 的 pytest 集成模块: ``` pip install allure-pytest ``` ### 生成报告 修改 tests/test_demo.py 测试文件,代码如下: ```python import requests import allure @allure.story('请求成功') def test_passing(): params = ('user', 'pass') with allure.step('设置请求参数,发起请求'): allure.attach('请求参数:' + ''.join(params), 'Parameters', allure.attachment_type.TEXT) r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=params) with allure.step('检查接口返回的 code 参数确定请求成功'): assert r.status_code == 200 allure.attach(str(r.status_code), 'Response', allure.attachment_type.TEXT) ``` 通过 allure 模块添加测试过程的说明,使整个测试报告更加详细明了。 要使 Allure 侦听器能够在测试执行期间收集结果,只需在命令行添加存储结果的文件夹的路径参数即可。例如: ``` pytest --alluredir=./results ``` 该命令运行测试并将测试结果数据存放在 results 目录中。也可以使用配置文件的方式进行配置,pytest 的配置文件的使用请参考[配置文件](https://docs.pytest.org/en/7.0.x/reference/customize.html#configuration-file-formats),在项目根目录新建一个 pytest.ini 文件,文件内容如下: ``` # pytest.ini [pytest] addopts = --clean-alluredir --alluredir=./results testpaths = tests ``` 其中,--clean-alluredir 是指定每次执行测试时都先清空测试结果目录,--alluredir=./results 是指定测试结果存放到 results 目录,testpaths = tests 是指定执行 tests 目录下的测试文件。然后,运行 pytest 命令运行测试完成后将在项目中多了一个 results 目录,里面的 .json .txt 文件就是测试结果内容。 要在测试完成后查看实际报告,需要使用 Allure 命令行实用程序从结果生成报告: ``` allure serve ./results ``` 此命令将 results 目录中测试结果生成测试报告,并启动本机服务器在默认浏览器中打开测试报告。 如需输出测试报告静态网页文件,使用如下命令格式: ``` allure generate <测试结果目录> -o <测试报告目录> --clean ``` * 测试结果目录:是运行测试后存放测试结果数据的目录。 * 测试报告目录:是最终生成的测试报告存放的目录。 * --clean:清空测试报告目录中已有(上一次)的报告,避免覆盖时出错。 如将 result 目录的测试结果数据生成测试报告,并将测试报告存放在 reports 目录。使用如下命令: ``` allure generate result -o reports --clean ``` 测试报告生成后,使用浏览器打开 reports 目录下的 index.html 文件即可看到报告内容。 ## 数据驱动 YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。Python 将 YAML 配置文件内容转 JSON 格式需要安装 [pyyaml](https://github.com/yaml/pyyaml),安装命令: ``` pip install pyyaml ``` 在项目根目录新建一个 config 文件夹,在该文件夹下新建一个 test_demo.yml 文件,编写测试用例配置信息,内容如下: ```yaml # 参数正确 - title: '参数正确,请求成功' user: user pass: pass code: 200 # 缺失user参数 - title: '缺失user参数,请求失败' user: '' pass: pass code: 401 # 缺失pass参数 - title: '缺失pass参数,请求失败' user: user pass: '' code: 401 ``` YAML 语法可以参考这个 [YAML 入门教程](https://www.runoob.com/w3cnote/yaml-intro.html)。 在 Pytest 中并不需要额外的库,通过 @pytest.mark.parametrize() 标志即可实现参数化。通过参数传递不同的数据来驱动用例运行,也就是数据驱动。 然后,修改 tests/test_demo.py 文件: ```python import requests import pytest import allure import yaml # 读取 yaml 文件内容转字典数据 def load_yaml(path): with open(path, 'r', encoding='UTF-8') as fs: data = fs.read() return yaml.load(data, Loader=yaml.SafeLoader) @allure.feature('接口测试示例') @pytest.mark.parametrize('data', load_yaml('./data/test_demo.yml')) def test_passing(data): allure.dynamic.title(data['title']) params = (data['user'], data['pass']) with allure.step('设置请求参数,发起请求'): allure.attach('请求参数:' + ' '.join(params), 'Parameters', allure.attachment_type.TEXT) r = requests.get('https://httpbin.org/basic-auth/user/pass', auth=params) with allure.step('检查接口返回的 code 参数确定请求成功'): assert r.status_code == data['code'] allure.attach(str(r.status_code), 'Response', allure.attachment_type.TEXT) ``` 这样就成功的将接口配置信息从 YAML 配置文件中读取出来,并使用到测试用例中。