基于Pytest框架的自动化测试开发实践

本文以Pytest为核心,通过一个实际的API测试项目,详细讲解如何运用Pytest进行自动化测试,包括创建测试项目、编写测试用例、参数化、测试配置管理、并发执行等,旨在帮助读者将Pytest功能应用于实际测试工作中。
摘要由CSDN通过智能技术生成

Pytest 是 Python 的一种易用、高效和灵活的单元测试框架,可以支持单元测试和功能测试。本文不以介绍 Pytest 工具本身为目的,而是以一个实际的 API 测试项目为例,将 Pytest 的功能应用到实际的测试工程实践中,教大家将 Pytest 用起来。

在开始本文之前,我想跟大家澄清两个概念,一个是测试框架一个是测试工具。很多人容易把他们搞混了,测试框架是诸如 Unittest、Pytest、TestNG 这类,而测试工具指的则是 Selenium、Appium、Jmeter 这类。

测试框架的作用是,帮助我们管理测试用例、执行测试用例、参数化、断言、生成测试报告等基础性工作,让我们将精力用在测试用例的编写上。好的测试框架应该具有很高的扩展性,支持二次开发,并能够支持多种类型的自动化测试。

测试工具的作用是为了完成某一类型的测试,比如 Selenium 用于对 WEB UI 进行自动化测试,Appium 用来对 APP 进行自动化测试,Jmeter 可以用来进行 API 自动化测试和性能测试。另外,Java 语言中 OkHttp 库,Python 语言中的 requests 库,这些 HTTP 的 client 也可以看做是一种 API 测试工具。

澄清了这两个概念,说一下本文的目的。其实网上已经有很多教程,包括官方文档,都是以介绍 Pytest 的功能为出发点,罗列了各种功能的使用方法,大家看完之后会感觉都明白了,但是还是不知道如何与实际项目相结合,真正落地用起来。本文不以介绍 Pytest 工具本身为目的,而是以一个实际的 API 测试项目为例,通过单元测试框架 Pytest 和 Python 的 Requests 库相结合,将 Pytest 功能应用到实际的测试工程实践中,教大家将 Pytest 用起来。

请相信我,使用 Pytest 会让你的测试工作非常高效。

01 Pytest 核心功能

在开始使用 Pytest 之前,先来了解一下 Pytest 的核心功能,根据官方网站介绍,它具有如下功能和特点:

  • 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考。
  • 能够支持简单的单元测试和复杂的功能测试。
  • 支持参数化。
  • 能够执行全部测试用例,也可以挑选部分测试用例执行,并能重复执行失败的用例。
  • 支持并发执行,还能运行由 nose, unittest 编写的测试用例。
  • 方便、简单的断言方式。
  • 能够生成标准的 Junit XML 格式的测试结果。
  • 具有很多第三方插件,并且可以自定义扩展。
  • 方便的和持续集成工具集成。

Pytest 的安装方法与安装其他的 python 软件无异,直接使用 pip 安装即可。

pip install pytest

安装完成后,可以通过下面方式验证是否安装成功:

pytest --help

如果能够输出帮助信息,则表示安装成功了。

接下来,通过开发一个 API 自动化测试项目,详细介绍以上这些功能是如何使用的。

02 创建测试项目

先创建一个测试项目目录 api_pytest,为这个项目创建虚拟环境。关于虚拟环境的创建,可以参考这篇文章 虚拟环境。这里我们直接介绍如何使用,执行下面两条命令:

mkdir api_pytest
cd api_pytest
virtualenv --python=python3 env

这样,项目目录和虚拟环境就创建完成了。

应用虚拟环境

source env/bin/activate

接着,安装依赖包,第一个是要安装 pytest,另外本文是以 API 自动化测试为例,因此还要安装一下 HTTP 的 client 包 requests。

pip install pytest requests

现在我们创建一个 data 目录,用来存放测试数据,一个 tests 目录,用来存放测试脚本,一个 config 目录,用来存放配置文件,一个 utils 目录从来存放工具。

mkdir data tests config utils

现在,项目的目录结构应该是如下这样:

├── config
├── data
├── env
├── tests
└── utils

至此测试项目就创建完成了。接着编写测试用例。

03 编写测试用例

在这部分,我们以测试豆瓣电影列表 API 和电影详情 API 为例,编写测试用例。

这两个 API 信息如下:

接口 示例

电影列表 http://api.douban.com/v2/movie/in_theaters?apikey=0df993c66c0c636e29ecbb5344252a4a&start=0&count=10

电影详情 https://api.douban.com/v2/movie/subject/30261964?apikey=0df993c66c0c636e29ecbb5344252a4a

我们先写电影列表 API 的自动化测试用例,设置 3 个校验点:

1. 验证请求中的 start 与响应中的 start 一致。
- 验证请求中的 count 与响应中的 count 一致。
- 验证响应中的 title 是"正在上映的电影-上海"。

在 tests 目录里面,创建个 testintheaters.py 文件,里面编写测试用例,内容如下:

import requests
​
​
class TestInTheaters(object):
    def test_in_theaters(self):
        host = "http://api.douban.com"
        path = "/v2/movie/in_theaters"
        params = {
   "apikey": "0df993c66c0c636e29ecbb5344252a4a",
                  "start": 0,
                  "count": 10
                  }
        headers = {
   
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
        }
        r = requests.request("GET", url=host + path, headers=headers, params=params)
        response = r.json()
        assert response["count"] == params["count"]
        assert response["start"] == params["start"]
        assert response["title"] == "正在上映的电影-上海", "实际的标题是:{}".format(response["title"])

你可能会问,这就是测试用例了?这就是基于 Pytest 的测试用例了吗?答案是肯定的。基于 Pytest 编写自动化测试用例,与编写平常的 Python 代码没有任何区别,唯一的区别在于文件名、函数名或者方法名要以 test开头或者test 结尾,类名以 Test 开头。

Pytest 会在 test*.py 或者 *test.py 文件中,寻找 class 外边的 test开头的函数,或者 Test 开头的 class 里面的 test开头的方法,将这些函数和方法作为测试用例来管理。可以通过下面的命令,查看 Pytest 收集到哪些测试用例:

$ py.test tests/testintheaters.py --collect-only
====================================================== test session starts =======================================================
platform linux -- Python 3.5.2, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /root/api_pytest
collected 1 item                                                                                                                       
<Module tests/testintheaters.py>
  <Class TestInTheaters>
      <Function test_in_theaters>===================================================== no tests ran in 0.10s ======================================================

从结果中看到,一共有一条测试用例,TestInTheaters 这个类中的 testintheaters 这个方法。

在 Pytest 中断言使用的是 Python 自带的 assert 语句,非常简单。

04 执行测试用例

下面来运行这个测试:

$ pytest tests/testintheaters.py
========================================================= test session starts ==========================================================
platform linux -- Python 3.5.2, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /root/api_pytest
collected 1 item                                                                                                                       
<Module tests/testintheaters.py>
  <Class TestInTheaters>
      <Function test_in_theaters>

======================================================== no tests ran in 0.08s =========================================================
(env) root@iZ2zec08ev0qz7nmp85ewsZ:~/api_pytest# pytest tests/testintheaters.py 
========================================================= test session starts ==========================================================
platform linux -- Python 3.5.2, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /root/api_pytest
collected 1 item                                                                                                                       

tests/testintheaters.py F                                                                                                        [100%]

=============================================================== FAILURES ========================================================
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值