如何用pytest编写自动化测试脚本?

摘要:经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测试用例脚本。 一,明确测试对象 针对
经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接口测试用例脚本。 一,明确测试对象 针对某个功能做接口测试,首先我们需要确定实现这个功能调用的是哪个接口,这个接口的具体信息(如功能、协议、URL、请求方法、请求参数说明、响应参数说明等等)可以通过查看开发提供的接口文档获取,也可以通过抓包(在没有接口文档的情况下)获取。找到对应的接口也就是测试对象之后,才能有目的的进行下一步。 1,这里显然是没有接口文档提供接口相关的信息的,我们甚至都不知道请求url,那么先Fiddler抓包获取接口信息。 通过抓包我们抓取到了该接口的信息如下: 请求url:https://weathernew.pae.baidu.com/weathernew/pc 请求方式:GET 请求参数: 2,抓取到以上这些接口信息后,我们先编写简单的脚本请求该接口,如下: url = "https://weathernew.pae.baidu.com/weathernew/pc" params = { "query": "浙江杭州天气", "srcid": 4982 } res = requests.get(url=url, params=params) print(res.status_code) print(res.text) 运行代码,接口调试通过,能获取到结果,如下: 3,明确需求,确定用例。 我们在针对某个接口做自动化测试时,需要先明确用例需要验证的测试点。有些接口既要进行正向的校验,也要进行异常的校验,而有些接口可能在自动化时只需要进行正向校验就够了,无需做异常校验。 我们来分析一下示例的这个天气查询接口,主要有两个测试点: 正向请求:输入存在的城市,能查找对应城市的天气 异常请求:输入不存在的城市,提示错误 二,编写测试用例 编写测试用例时,我们需要将代码进行封装,可以封装成测试类/方法、测试函数。pytest中对用例封装的命名方式有要求,详细请参考我之前的文章pytest测试命名规则。 至于封装成类还是函数,其实没什么特定的要求,一般同一个场景或同一个测试点相关的接口可以定义成一个类。 同时用例还需要设置断言,用于校验返回内容是否为期望的内容。测试用例一定要进行断言,否则毫无意义。 构造请求数据 正向请求,数据如下: params = { "query": "浙江杭州天气", "srcid": 4982 } 异常请求,数据如下: params = { "query": "微信公众号:测试上分之路", "srcid": 4982 } 正向请求的结果我们在上面调试请求该接口的时候已经拿到了,如上面的截图。 我们来看下异常请求的结果,为后续设置断言做准备,结果如下: 发送异常请求后,返回的code也是200,结果中会出现暂未开通此城市查询,且没有出现正向请求中的window.tplData内容。 封装测试代码 这里是针对同一个接口的两条不同的测试用例,我们直接封装一个测试类,专门用于测试该接口。示例代码如下: class TestWeather: ''' 校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc ''' def test_get_weather_normal(self): '''正向校验-查询存在的城市的天气''' url = "https://weathernew.pae.baidu.com/weathernew/pc" params = { "query": "浙江杭州天气", "srcid": 4982 } res = requests.get(url=url, params=params) def test_get_weather_error(self): '''异常校验-查询不存在的城市的天气''' url = "https://weathernew.pae.baidu.com/weathernew/pc" params = { "query": "微信公众号:测试上分之路", "srcid": 4982 } res = requests.get(url=url, params=params) 注意,代码里还没有进行断言,不能算是完整的用例。这里我只是为了说明流程而把断言放到下一步,分析后再写断言。 断言设置 断言,即校验结果是否是我们期望的内容。pytest怎么进行断言请