zoukankan      html  css  js  c++  java
  • ython学习笔记(接口自动化框架 V2.0)

    这个是根据上次框架版本进行的优化

    用python获取excel文件中测试用例数据

    通过requets测试接口、并使用正则表达式验证响应信息内容

    生成xml文件测试报告

    版本更新内容:

    1. 整理了CreateTest.test_main()流程逻辑

    2. 优化了testcase.xls文件格式

    3. 添加了生成XML文件测试报告

    #!/usr/bin/env python
    # -*- coding: utf_8 -*-
    # 获取测试用例文件excel
    
    import xlrd
    import json
    
    
    class CreateExcel:
        def __init__(self):
            pass
    
        @classmethod
        def open_excel(cls):
            path = "testcase.xls"
            workbook = xlrd.open_workbook(path)
            table = workbook.sheets()[0]
            return table
    
        # 获取sheet
    
        @classmethod
        def get_nrows(cls, table):
            nrows = table.nrows
            return nrows
    
        # 获取行号
    
        @classmethod
        def get_id(cls, table, nrows):
            testid = []
            for i in range(1, nrows):
                testid.append(table.cell(i, 0).value)
            return testid
    
        @classmethod
        def get_name(cls, table, nrows):
            testname = []
            for i in range(1, nrows):
                testname.append(table.cell(i, 1).value)
            return testname
    
        # 获取用例name
    
        @classmethod
        def get_data(cls, table, nrows):
            testdata = []
            for i in range(1, nrows):
                try:
                    data = json.loads(table.cell(i, 2).value)
                    testdata.append(data)
                except ValueError:
                    testdata.append(None)
            return testdata
    
        # 获取data接口参数
    
        @classmethod
        def get_url(cls, table, nrows):
            testurl = []
            for i in range(1, nrows):
                testurl.append(table.cell(i, 3).value)
            return testurl
    
        # 获取接口测试url
    
        @classmethod
        def get_method(cls, table, nrows):
            testmethod = []
            for i in range(1, nrows):
                testmethod.append(table.cell(i, 4).value)
            return testmethod
    
        # 获取接口测试method
    
        @classmethod
        def get_pattern(cls, table, nrows):
            testpattern = []
            for i in range(1, nrows):
                testpattern.append(table.cell(i, 5).value)
            return testpattern
    
        # 获取接口期望响应结果
    #!/usr/bin/env python
    # -*- coding: utf_8 -*-
    # 测试核心组件
    
    import requests
    import re
    from datetime import datetime
    from createexcel import CreateExcel
    from xml.dom import minidom
    import sys
    
    
    class CreateTest:
        reload(sys)
        sys.setdefaultencoding("utf-8")
    
        # 避免字符串写入文件出错
    
        def __init__(self):
            pass
    
        @classmethod
        def test_api(cls, method, url, data):
            global results
            try:
                if method == "post":
                    results = requests.post(url, data)
                if method == "get":
                    results = requests.get(url, data)
                return results
            except Exception.__bases__:
                print "服务器访问失败"
    
        # 接口函数
    
        @classmethod
        def test_on(cls):
            print "用例执行开始"
    
        @classmethod
        def test_close(cls):
            print "用例执行结束"
    
        @classmethod
        def test_result(cls, pa):
            global report
            try:
                pattern = re.compile(pa)
                match = pattern.search(testresults.text)
                if match.group() == pa:
                    report = "测试通过"
            except AttributeError:
                report = "测试失败"
            return report
    
        # 正则表达式检测
    
        @classmethod
        def test_http(cls, code):
            print "请求返回状态码: ", code
    
        @classmethod
        def test_time(cls):
            nowtime = datetime.today()
            time = nowtime.strftime("%Y-%m-%d %H:%M:%S")
            return time
    
        # 获取当前时间转化字符串
    
        @classmethod
        def test_report(cls):
            nowtime = datetime.today()
            reportime = nowtime.strftime("%Y%m%d%H%M%S")
            reportname = reportime + ".xml"
            return reportname
    
        # 获取测试报告文件名称
    
        @classmethod
        def test_main(cls):
            global testresults
            table = CreateExcel.open_excel()
            nrows = CreateExcel.get_nrows(table)
            xml = minidom.Document()
            xml.appendChild(xml.createComment("测试报告"))
            caselist = xml.createElement("caselist")
            xml.appendChild(caselist)
            for i in range(0, nrows - 1):
                testid = CreateExcel.get_id(table, nrows)[i]
                testname = CreateExcel.get_name(table, nrows)[i]
                testdata = CreateExcel.get_data(table, nrows)[i]
                testurl = CreateExcel.get_url(table, nrows)[i]
                testmethod = CreateExcel.get_method(table, nrows)[i]
                testpattern = CreateExcel.get_pattern(table, nrows)[i]
    
                # 执行测试
                CreateTest.test_on()
                testresults = CreateTest.test_api(testmethod, testurl, testdata)
                testcode = str(testresults.status_code)
                try:
                    CreateTest.test_http(testresults.status_code)
                except AttributeError:
                    pass
                CreateTest.test_close()
                # 执行结束
                # 生成xml文件
                case = xml.createElement("case")
                case.setAttribute("id", testid)
                # 输入用例ID
    
                name = xml.createElement("name")
                name.appendChild(xml.createTextNode(testname))
                # 输入用例名称
                method = xml.createElement("method")
                method.appendChild(xml.createTextNode(testmethod))
                # 输入接口类型
                code = xml.createElement("code")
                code.appendChild((xml.createTextNode(testcode)))
                # 输入用例返回状态码
                result = xml.createElement("result")
                result.appendChild(xml.createTextNode(CreateTest.test_result(testpattern)))
                # 输入用例测试结果
                time = xml.createElement("time")
                time.appendChild(xml.createTextNode(CreateTest.test_time()))
                # 输入用例执行时间
    
                case.appendChild(name)
                case.appendChild(method)
                case.appendChild(code)
                case.appendChild(result)
                case.appendChild(time)
    
                caselist.appendChild(case)
                # xml文件生成结束
            filename = file(CreateTest.test_report(), "w+")
            # 生成以当前时间命名的测试报告文件
            xml.writexml(filename)
            filename.close()
            # 关闭文件
    
    
    if __name__ == '__main__':
        CreateTest.test_main()

    下面是测试入口:

    #!/usr/bin/env python
    # -*- coding: utf_8 -*-
    # ****************************************************************
    # interface.py
    # Author     : ChenLei
    # Version    : 2.0
    # Date       : 2016-4-15
    # ****************************************************************
    
    import time
    from createtest import CreateTest
    
    start = time.clock()
    CreateTest.test_main()
    end = time.clock()
    
    print "接口自动化脚本运行时间:%.03f seconds" % (end - start)

     运行后自动生成 当前时间的xml文件 如下:

    除非注明,本博客文章均为原创,转载请以链接形式标明本文地址

    本文地址:http://www.cnblogs.com/cllovewxq/p/5394549.html

  • 相关阅读:
    python之打开python源文件方法
    python学习网站
    python知识点
    计算机概念--鸭子类型
    装饰器、函数调用 语句分析法
    python相关软件安装
    python之字典的作用
    [转载]理解HTML语义化
    Java 入门 代码2浮点数据类型
    Java入门1dayCode
  • 原文地址:https://www.cnblogs.com/clarke/p/5898510.html
Copyright © 2011-2022 走看看