python调用接口并统计出测试结果_python接口测试之测试用例封装与测试报告的生成...

前言:

本文涉及到unittest单元测试框架、BSTestRunner扩展文件、requests模块、time等模块的应用,利用python语言实现以接口为测试对象,执行用例封装,通过BSTestRunner来输出测试报告的整体思想;

API信息:http://t.weather.sojson.com/api/weather/city/city_code

本文测试api:http://t.weather.sojson.com/api/weather/city/101210101

接口请求方式:get,接口入参:city_code

备注:文中涉及的API为又拍云提供的免费接口,尽量不要做性能方面的测试,请求量过大可能会导致ip被封;

一、测试用例设计

1、基本逻辑:

a、设计不同的测试场景

b、使用不同的断言判断是否与预期一致

c、将所有的请求结果汇总以html形式输出测试报告

2、测试用例

场景

请求api

预期结果

正常入参

http://t.weather.sojson.com/api/weather/city/101210101

"status":“200”

异常入参

http://t.weather.sojson.com/api/weather/city/cdy

"status":“404”

参数缺省

http://t.weather.sojson.com/api/weather/city/

"status":“404”

三、代码实现

准备工作:pycharm中新建testcase文件夹,testcase文件夹下新建reports文件夹与test_wt.py文件

1、test_wt.py文件

导入需要的模块

# -*- coding: utf-8 -*-

import unittest #引入unittest模块

import requests #导入request库

import time #time模块

from time import sleep

定义全局变量

url = "http://t.weather.sojson.com/api/weather/city/101210101"

url_error = "http://t.weather.sojson.com/api/weather/city/10123"

url_lose = "http://t.weather.sojson.com/api/weather/city/101210101"

date = time.strftime("%Y%m%d",time.localtime()) #获取当前时间,判断响应结果

定义weather天气类并继承unittest

class weather(unittest.TestCase):

testcase_1

def test_hangzhou(self):

res = requests.get(url)

result = res.json()

self.assertEqual(result['status'],200)

self.assertEqual(result['message'],'success感谢又拍云(upyun.com)提供CDN赞助')

self.assertEqual(result['date'],date)

sleep(5)

testcase_2

def test_error(self):

res = requests.get(url_error)

result = res.json()

self.assertEqual(result['status'],404)

self.assertEqual(result['message'],'Request resource not found.')

sleep(5)

testcase_3

def test_lose(self):

res = requests.get(url_lose)

result = res.json()

self.assertEqual(result['status'],404)

self.assertEqual(result['message'],'Request resource not found.')

执行函数:

if __name__ == '__main__': #执行函数

unittest.main()

整体代码:

# -*- coding: utf-8 -*-

import unittest #引入unittest模块

import requests #导入request库

import time #time模块

from time import sleep

#定义全局变量

url = "http://t.weather.sojson.com/api/weather/city/101210101"

url_error = "http://t.weather.sojson.com/api/weather/city/cdy"

url_lose = "http://t.weather.sojson.com/api/weather/city"

date = time.strftime("%Y%m%d",time.localtime())#获取当前时间,判断响应结果

class weather(unittest.TestCase): #创建天气class类

def test_hangzhou(self): #测试用例1

res = requests.get(url)

result = res.json()

self.assertEqual(result['status'],200)

self.assertEqual(result['message'],'success感谢又拍云(upyun.com)提供CDN赞助')

self.assertEqual(result['date'],date)

sleep(5)

def test_error(self): #测试用例2

res = requests.get(url_error)

result = res.json()

self.assertEqual(result['status'],404)

self.assertEqual(result['message'],'Request resource not found.')

sleep(5)

def test_lose(self): #测试用例3

res = requests.get(url_lose)

result = res.json()

self.assertEqual(result['status'],404)

self.assertEqual(result['message'],'Request resource not found.')

if __name__ == '__main__':

unittest.main()

2、run文件

准备工作:在testcase文件夹下创建run.py文件

引入必要模块

import unittest

from BSTestRunner import BSTestRunner

import time

指定测试用例与报告路径

test_dir='test_wt'

report_dir= './reports'

加载测试用例

discover=unittest.defaultTestLoader.discover(test_dir)

定义报告格式

now=time.strftime('%Y-%m-%d %H_%M_%S')

report_name=report_dir+'/'+now+'test_report.html'

运行测试用例并生成测试报告

with open(report_name,'wb') as f:

runner = BSTestRunner(stream=f, title="cdy api test report", description="china city weather test report")

runner.run(discover)

整体代码:

import unittest

from BSTestRunner import BSTestRunner

import time

#指定测试用例和报告路径

test_dir='test_wt'

report_dir= './reports'

#加载测试用例

discover=unittest.defaultTestLoader.discover(test_dir)

#定义报告格式

now=time.strftime('%Y-%m-%d %H_%M_%S')

report_name=report_dir+'/'+now+'test_report.html'

#运行用例并生成测试报告

with open(report_name,'wb') as f:

runner = BSTestRunner(stream=f, title="cdy test report", description="weather test report")

runner.run(discover)

四、输出结果

1、执行run.py文件后,会在reports文件夹下生成一个html文件

2、打开该文件,在浏览器中打开,就可以看到测试报告了(这个时候可以考虑如何优化这个测试报告,使其更具有可读性)

五、异常情况处理

下面整理了一下新手在使用unittest框架时常遇到的几个错误

1、No tests where found

解析:

a、在使用unittest框架时,python则根据是否有以test_作为前缀的文件来判断是否是有要执行的测试用例,出现这种情况往往是使用的函数方法没有加上test_前缀,python识别不了,故而报了没有找到测试点的错误

b、除了上述的原因还有一种可能也会导致No tests where found--执行语句写的是unittest.main();在python3中执行测试用例的语句需要优化成下面的格式才能执行测试用例

if __name__ == '__main__':

unittest.main()

2、ImportError: Start directory is not importable: 'test_wt'

解析:文件指向性错误,通常是涉及的运行文件代码中调用的文件路径没有定义,若测试用例指向test_dir='test_wt',则这个文件应该在根目录下,而report_dir= './reports'代表的是指向根目录下的reports文件夹

3、BSTestRunner调用不了

解析:这个文件使用与HTMLTestRnner大同小异,调用方法相同,但是BSTestRunner需要自己手动添加源码并把文件添加至自己电脑python目录下的lib文件夹下才能够被执行,源码网上很好找,拷贝下来另存为.py文件放在指定文件夹就能运行,不用付费下载别人存好的文件;指定文件夹参考目录C:\Users\86132\AppData\Local\Programs\Python\Python38\Lib

4、断言中时间戳对不上

后面调用接口下发现响应时间格式为

"message": "success感谢又拍云(upyun.com)提供CDN赞助",

"status": 200,

"date": "20200608",

"time": "2020-06-08 16:44:23",

代码中调用的是datetime.datetime.now(),返回的是时间戳格式精确至秒,修改为time.strftime("%Y%m%d",time.localtime())即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值