基于python的接口自动化测试 ddt数据驱动


在测试接口时,一个接口会先写好测试用例,这个用例主要针对功能,传入参时考虑到各种场景,正常的,异常的,如:参数缺省,参数传一个六位数字写用例时考虑边界情况等。

一个接口设计用例时有可能会十几条到几十条都有可能,多个接口就有很多了,这时候我们可以考虑到自动化测试接口。

采用数据驱动方式,把数据写在excel表格中,代码做封装,用数据驱动测试,两部分相互独立。python中用ddt模块来做数据驱动,代码简单好维护,调试也方便。

自己写的框架,结构如下:

common:公共层,放读取表格数据,发送request请求,生成测试报告的.py文件

data:放excel数据

report:放测试报告

testcase:写测试用例

run_main.py:运行用例并生成测试报告

HTMLTestRunner.py文件是从网上下载的模板,可以直接使用。

readExcel.py读取表格数据,返回的是一个列表,里面的数据以字典格式存放,通过索引得到字典然后取字典的值

1  #! /usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 """
     5 @version: 1.0
     6 @author: fky
     7 @site: 
     8 @software: PyCharm
     9 @file: readExcel.py
    10 @time: 2018/3/24 9:37
    11 """
    12 import xlrd
    13 
    14 class ReadExcel():
    15      def readExcel(fileName,SheetName="Sheet1"):
    16          data = xlrd.open_workbook(fileName)
    17          table = data.sheet_by_name(SheetName)
    18 
    19          #获取总行数总列数
    20          nrows = table.nrows
    21          ncols = table.ncols
    22          if nrows > 1:
    23              #获取第一行的内容列表格式
    24              keys = table.row_values(0)
    25              #print(keys)
    26 
    27              listApiData = []
    28              #获取每一行的内容列表格式
    29              for col in range(1,nrows):
    30                  values = table.row_values(col)
    31                  # keysvalues这两个列表一一对应来组合转换为字典
    32                  api_dict = dict(zip(keys, values))
    33                  #print(api_dict)
    34                  listApiData.append(api_dict)
    35 
    36              return listApiData
    37          else:
    38              print("表格未填写数据")
    39              return None
    40 
    41 if __name__ == '__main__':
    42     s = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx","Sheet1")
    43     print(s)

sendRequest.py中的文件,读取表格的数据作为request请求的参数:

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

    """
    @version: 1.0
    @author: fky
    @site:
    @software: PyCharm
    @file: sendRequests.py
    @time: 2018/3/24 11:40
    """
    from common.readExcel import ReadExcel
    import requests
    import json
    class SendRequests():
        def sendRequests(self,s,apiData):
            try:
                #从读取的表格中获取响应的参数作为传递
                method = apiData["method"]

                url = apiData["url"]

                if apiData["params"] == "":
                    par = None
                else:
                    par = eval(apiData["params"])

                if apiData["headers"] == "":
                    h = None
                else:
                    h = apiData["headers"]


                if apiData["body"] == "":
                    body_data = None
                else:
                    body_data = eval(apiData["body"])

                type = apiData["type"]

                v = False

                if type == "json":
                    body = json.dumps(body_data)
                if type == "data":
                    body = body_data
                else:
                    body = body_data

                #发送请求
                re = s.request(method=method,url=url,headers=h,params=par,data=body,verify=v)
                return re

            except Exception as e:
                print(e)

    if __name__ == '__main__':
        s = requests.session()
        testData = ReadExcel.readExcel("apiTest.xlsx", "Sheet1")
        response = SendRequests().sendRequests(s,testData[3])
        print(response.json())

用例部分(case_01_yoyo.py)

#! /usr/bin/env python
    # -*- coding:utf-8 -*-

    """
    @version: 1.0
    @author: fky
    @site:
    @software: PyCharm
    @file: case_01.py
    @time: 2018/3/16 10:58
    """
    import unittest
    import requests
    from ddt import ddt,data,unpack
    from common.sendRequests import SendRequests
    from common.readExcel import ReadExcel
    import os

    # path = os.path.dirname(os.getcwd())+"\\data\\yoyo_apiTest.xlsx"
    # print(path)
    testData = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx", "Sheet1")
    @ddt
    class Test1(unittest.TestCase):

        def setUp(self):
            self.s = requests.session()

        def tearDown(self):
            pass

        @data(*testData)
        def test_yoyo_api(self,data):

            re = SendRequests().sendRequests(self.s, data)
            #print(re.json())

            #切割字符串取后面的部分
            expect_result1 = data["expect_result"].split(":")[1]
            #转换为字符串
            expect_result = eval(expect_result1)
            #断言
            self.assertEqual(re.json()["origin"], expect_result, "返回错误,实际结果是%s"%re.json()["origin"])


    if __name__ == '__main__':

        unittest.main()

run_main.py,跑用例最后生成测试报告:

#! /usr/bin/env python
    # -*- coding:utf-8 -*-

    """
    @version: 1.0
    @author: fky
    @site: 
    @software: PyCharm
    @file: run_main.py
    @time: 2018/3/16 10:58
    """
    import unittest
    import  time
    import os
    from common.HTMLTestRunner_jpg import HTMLTestRunner

    def run_case(dir = "testcase"):
        case_dir = os.getcwd() + "\\" + dir
        print(case_dir)
        test_case = unittest.TestSuite()
        discover = unittest.defaultTestLoader.discover(case_dir,pattern="case_01_yoyo.py",top_level_dir=None)
        return  discover
    if __name__ == '__main__':

        current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
        report_path =os.getcwd() + "\\report\\" + current_time + '.html'  # 生成测试报告的路径
        print(report_path)
        fp = open(report_path, "wb")
        runner = HTMLTestRunner(stream=fp, title=u"自动化测试报告", description=u'yoyo接口',verbosity=2)
        runner.run(run_case())
        fp.close()

报告结果

--------------------------------------------------------------------------------------------

更新于2019-12-16日下午18:03

不好意思好久没看微博,今天才看见有人提问了,所有重新检查了下项目文件

case_02_qq.py 这个用例经测试是可以成功执行的,各位网友可以自行到github下载或克隆使用:

github项目地址:https://github.com/ctnyan/fukun_apitest


原文链接:https://www.cnblogs.com/fukun/p/8671718.html