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文件

python接口测试之测试用例封装与测试报告的生成_第1张图片

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

python接口测试之测试用例封装与测试报告的生成_第2张图片

五、异常情况处理

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

1、No tests where found

python接口测试之测试用例封装与测试报告的生成_第3张图片

解析:

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'

python接口测试之测试用例封装与测试报告的生成_第4张图片

解析:文件指向性错误,通常是涉及的运行文件代码中调用的文件路径没有定义,若测试用例指向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、断言中时间戳对不上

python接口测试之测试用例封装与测试报告的生成_第5张图片

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

 "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())即可

 

你可能感兴趣的:(python,接口测试,unittest)