本文涉及到unittest单元测试框架、BSTestRunner扩展文件、requests模块、time等模块的应用,利用python语言实现以接口为测试对象,执行用例封装,通过BSTestRunner来输出测试报告的整体思想;
备注:文中涉及的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文件
导入需要的模块
# -*- 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()
准备工作:在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())即可