• 利用python和excel 搭建接口测试框架
  • 发布于 2个月前
  • 180 热度
    0 评论
互联网公司对QA几乎有一个统一的要求:自动化测试能力。哪怕公司所有的测试都是业务测试,自动化能力也是个标配。对测试过程和质量保证过程中,适量的自动化能达到事半功倍的效果。

相对于UI自动化测试,接口自动化测试更加稳定;相对于白盒自动化测试,接口自动化更加容易;接口自动化的好处,再老生常谈一下:
1.提高测试效率。这几乎是所有自动化测试的好处。
2.完成手工测试繁琐的工作,但对自动化测试却很easy的事情。
3.反复执行。执行次数越多,收益越大。
4.提高/维持测试覆盖率。通过自动化来覆盖更多的场景,来提高代码覆盖率。

本文就以python加excel, 应用requests来搭建一个简易的自动化框架。对于业务不是很复杂,单个的接口测试,用excel可以实现数据驱动,方便管理和维护case。运用第三方库requests请求接口,根据结果和期望值进行断言,根据输出报告判断接口测试是否通过。

requests是一个很实用的python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到。
安装方式一般采用
pip install requests
通过前一篇文章,搭建天气预报的api server.
我们设计一些用例如下:

先写一个manage excel的类:
import xlrd
class readExcel(object):
    def __init__(self, path):
        self.path = path
    @property
    def getSheet(self):
        # 获取索引
        xl = xlrd.open_workbook(self.path)
        sheet = xl.sheet_by_index(0)
        return sheet
    @property
    def getRows(self):
        # 获取行数
        rows = self.getSheet.nrows
        return rows
    @property
    def getCol(self):
        # 获取列数
        col = self.getSheet.ncols
        return col
    # 以下是分别获取每一列的数值
    def getName(self, column_index):
        if column_index <= self.getCol:
            ColumnName = []
            for i in range(1, self.getRows):
                ColumnName.append(self.getSheet.cell_value(i, column_index))
            return ColumnName
        else:
            print("输入的column不合法!")
然后写一个处理接口的类,对于大多数接口来说,我们只用到get, post方法:
import requests
class testApi(object):
    def __init__(self, method, url, data):
        self.method = method
        self.url = url
        self.data = data
    @property
    def testApi(self):
        # 根据不同的访问方式来访问接口
        try:
            if self.method == 'post':
                if self.data == "":
                    print("No data post")
                else:
                    result = requests.post(self.url, data=(self.data).encode('utf-8'))
            elif self.method == 'get':
                if self.data == "":
                    result = requests.get(self.url)
                else:
                    result = requests.get(self.url, params=self.data)
            return result
        except:
            print('失败')
    def getCode(self):
        # 获取访问接口的状态码
        code = self.testApi.status_code
        return code
    def getJson(self):
        # 获取返回信息的json数据
        json_data = self.testApi.json()
        return json_data
写个管理全局变量的文件:
from manageexcel import readExcel
CASE_NUMBER = 0 #用例编号
CASE_NAME = 1   #用例名称
CASE_METHOD = 2 #请求类型
CASE_URL = 3    #请求地址
CASE_DATA = 4   #用例数据
CASE_STATUS = 5 #用例状态
CASE_KEY = 6    #验证关键字
file_path = "/Users/anderson/PycharmProjects/restfulapi/api_data.xlsx"
host = "http://localhost:5000"
row_num = readExcel(file_path).getRows
class CASE:
    number = readExcel(file_path).getName(CASE_NUMBER)
    name = readExcel(file_path).getName(CASE_NAME)
    method = readExcel(file_path).getName(CASE_METHOD)
    url = readExcel(file_path).getName(CASE_URL)
    data = readExcel(file_path).getName(CASE_DATA)
    status = readExcel(file_path).getName(CASE_STATUS)
    key = readExcel(file_path).getName(CASE_KEY)
接着就可以写实现用例了:
import unittest
from globals import CASE,host,row_num
from manageapi import testApi
class testWeatherApi(unittest.TestCase):
    def testWeatherApi(self):
        '''测试获取城市天气接口。'''
        for i in range(0, row_num - 1):
            api = testApi(CASE.method[i], host + CASE.url[i], CASE.data[i])
            apicode = api.getCode()
            apijson = api.getJson()
            if apicode == CASE.status[i]:
                print('{}、{}:测试成功。json数据为:{}'.format(i + 1, CASE.name[i], apijson))
            else:
                print('{}、{}:测试失败'.format(i + 1, CASE.name[i]))
if __name__ == '__main__':
    unittest.main(verbosity=2)
运行成功!
可以写一个执行suite的文件,并引入测试报告:
import unittest
from testcity import testWeatherApi
from HTMLTestRunner import HTMLTestRunner
testunit = unittest.TestSuite()
testunit.addTest(testWeatherApi("testWeatherApi"))
fp = open('./result.html','wb')
runner = HTMLTestRunner(stream=fp,title="API测试报告",description="测试执行情况")
runner.run(testunit)
fp.close()
报告如下:

一个简单的接口测试框架就搭建起来了,麻雀虽小,五脏俱全,当然可继续实现发送邮件,集成CI。对于简单的接口,用数据驱动来实现自动化更简单方便,实现起来简单快捷。
用户评论