加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Python接口测试自动化实战及代码示例:含Get、Post等方法

发布时间:2019-07-17 21:07:09 所属栏目:优化 来源:Atstudy网校
导读:副标题#e# 年初参与到一个后台系统开发的项目中,里面涉及了很多接口,我做为项目组测试人员,需要对这些接口进行测试,一开始使用 postman 工具测试,很是方便。但随着接口数量的增加,不光要执行手动点击测试,而且,一旦接口参数变动,都重新更改接口参
副标题[/!--empirenews.page--]

年初参与到一个后台系统开发的项目中,里面涉及了很多接口,我做为项目组测试人员,需要对这些接口进行测试,一开始使用 postman 工具测试,很是方便。但随着接口数量的增加,不光要执行手动点击测试,而且,一旦接口参数变动,都重新更改接口参数,次数多了,使得测试效率严重下降。

Python接口测试自动化实战及代码示例:含Get、Post等方法

后来我将目光转向了自动化测试,考虑到项目组对接口质量要求很高,需要快速开发。最终选定 python 作为脚本开发语言,使用其自带的 requests 和 urllib 模块进行接口请求,使用优化后的 unittest 测试框架编写测试接口函数,测试结果选用 HTMLTestRunner 框架予以展示,并使用 python 的 ssl 模块支持 https 协议的验证。接下来,我详细地介绍这些模块,并给出各个模块完整的测试代码。

1、接口请求

python 特别是 python 3.x 中的 urllib 和 requests 模块,是用来请求 url 的两个主要模块。这两个模块中,如果仅仅是支持 http 协议的 url 请求,推荐使用 requests 模块。为什么这么说呢?因为爱因斯坦说过一句话:简洁就是美。requests 模块对 urllib 模块又做了一层封装,使用更加方便。该模块支持 GET, POST, PUT, DELETE 等请求方法。请求返回信息包含状态码和消息体,状态码用三位数字表示,消息体可用字符串,二进制或json 等格式表示。下面用一个例子来介绍一下 requests 模块的使用。代码如下:

  1. import requests 
  2.  
  3. def get_method(url, para, headers): 
  4.  
  5. try: 
  6.  
  7. req = requests.get(url=url, params=para, headers=headers) 
  8.  
  9. except Exception as e: 
  10.  
  11. print(e) 
  12.  
  13. else: 
  14.  
  15. if req.status_code == "200": 
  16.  
  17. return req 
  18.  
  19. else: 
  20.  
  21. print("Requests Failed.") 
  22.  
  23. if __name__=='__main__': 
  24.  
  25. url = "http://www.google.com" 
  26.  
  27. req = get_method(url=url, para=None, headers=None) 
  28.  
  29. print(req.status_code) 
  30.  
  31. print(req.text) 

输出为:

  1. 200 
  2.  
  3. <!DOCTYPE html> 
  4.  
  5. <!--STATUS OK--><html> <head><meta...(省略) 

上述程序输出状态码为 200,表明请求成功,返回消息体为网页内容。这里我仅对requests 模块中的 get 请求方法做了封装,其它方法(如 post,put,delete 等)的封装类似。当让你也可以不用封装,直接使用 requests.methodName 来直接调用该方法。这里提醒一句,在实际的接口测试中,headers 和 data 都是有值的,要确保这些值的填写正确,大部分请求下的请求失败或返回结果错误,基本上都是由于这些值的缺失或错误造成的。更多关于 requests 模块的介绍,请参考官方文档。

2、测试框架优化

unittest 是 python 中进行单元测试使用广泛的框架,其与 java 中的单元测试框架junit 类似。该框架使用简单,需要编写以 test 开头的函数,选择 unittest 框架运行测试函数,测试结果在终端显示。这里举一个简单的例子:

  1. import unittest 
  2.  
  3. class ApiTestSample(unittest.TestCase): 
  4.  
  5. def setUp(self): 
  6.  
  7. pass 
  8.  
  9. def tearDown(self): 
  10.  
  11. pass 
  12.  
  13. def jiafa(self, input01, input02): 
  14.  
  15. result = input01 + input02 
  16.  
  17. return result 
  18.  
  19. def test_jiafa(self): 
  20.  
  21. testResult = self.jiafa(input01=4, input02=5) 
  22.  
  23. self.assertEqual(testResult, 9) 
  24.  
  25. if __name__=='__main__': 
  26.  
  27. unittest.main() 

简单解释下这段代码,首先我们创建一个类 ApiTestSample,这个类继承自unittest.TestCase 类。然后在这个类中写了 jiafa 函数,它有两个参数 input01,input02,返回 input01 与 input02 相加的和。接着在 test_jiafa 方法中,我们对刚才 jiafa 函数进行了和值校验。通过给 jiafa 输入两个值,获取其函数返回值,并与真实值做相等判断,以此实现函数单元测试。这里用到了 unittest 中断言值相等的 assertEqual(m, n)函数,上述代码运行结果如下:

  1. Ran 1 test in 0.000s 
  2.  
  3. OK 

以上是 unittest 框架最基本的单元测试应用,但是这个框架有个缺陷,就是不能自己传入参数。对于接口来说,往往需要传入很多参数,并且这每个参数又有很多取值,如果不对原先的 unittest 框架做改变,不仅无法用来进行接口测试,而且一个个结合参数取值去写测试代码,工作量极其庞大,也没有实现测试数据与脚本没有分离。基于此,我们对该框架做出一下两点优化。

1)扩展 unittest.TestCase 类,支持自定义参数输入;

2)测试数据与测试脚本分离,测试数据存储在文件和数据库中,以增强测试脚本复用性;

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读