python学习笔记(接口自动化框架 V2.0)

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

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

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

生成xml文件测试报告

版本更新内容:

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

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

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

代码如下:

  1 #!/usr/bin/env python
  2 # -*- coding: utf_8 -*-
  3 # 获取测试用例文件excel
  4 
  5 import xlrd
  6 import json
  7 
  8 
  9 class CreateExcel:
 10     def __init__(self):
 11         pass
 12 
 13     @classmethod
 14     def open_excel(cls):
 15         path = "testcase.xls"
 16         workbook = xlrd.open_workbook(path)
 17         table = workbook.sheets()[0]
 18         return table
 19 
 20     # 获取sheet
 21 
 22     @classmethod
 23     def get_nrows(cls, table):
 24         nrows = table.nrows
 25         return nrows
 26 
 27     # 获取行号
 28 
 29     @classmethod
 30     def get_id(cls, table, nrows):
 31         testid = []
 32         for i in range(1, nrows):
 33             testid.append(table.cell(i, 0).value)
 34         return testid
 35 
 36     @classmethod
 37     def get_name(cls, table, nrows):
 38         testname = []
 39         for i in range(1, nrows):
 40             testname.append(table.cell(i, 1).value)
 41         return testname
 42 
 43     # 获取用例name
 44 
 45     @classmethod
 46     def get_data(cls, table, nrows):
 47         testdata = []
 48         for i in range(1, nrows):
 49             try:
 50                 data = json.loads(table.cell(i, 2).value)
 51                 testdata.append(data)
 52             except ValueError:
 53                 testdata.append(None)
 54         return testdata
 55 
 56     # 获取data接口参数
 57 
 58     @classmethod
 59     def get_url(cls, table, nrows):
 60         testurl = []
 61         for i in range(1, nrows):
 62             testurl.append(table.cell(i, 3).value)
 63         return testurl
 64 
 65     # 获取接口测试url
 66 
 67     @classmethod
 68     def get_method(cls, table, nrows):
 69         testmethod = []
 70         for i in range(1, nrows):
 71             testmethod.append(table.cell(i, 4).value)
 72         return testmethod
 73 
 74     # 获取接口测试method
 75 
 76     @classmethod
 77     def get_pattern(cls, table, nrows):
 78         testpattern = []
 79         for i in range(1, nrows):
 80             testpattern.append(table.cell(i, 5).value)
 81         return testpattern
 82 
 83     # 获取接口期望响应结果
 84 
  1 #!/usr/bin/env python
  2 # -*- coding: utf_8 -*-
  3 # 测试核心组件
  4 
  5 import requests
  6 import re
  7 from datetime import datetime
  8 from createexcel import CreateExcel
  9 from xml.dom import minidom
 10 import sys
 11 
 12 
 13 class CreateTest:
 14     reload(sys)
 15     sys.setdefaultencoding("utf-8")
 16 
 17     # 避免字符串写入文件出错
 18 
 19     def __init__(self):
 20         pass
 21 
 22     @classmethod
 23     def test_api(cls, method, url, data):
 24         global results
 25         try:
 26             if method == "post":
 27                 results = requests.post(url, data)
 28             if method == "get":
 29                 results = requests.get(url, data)
 30             return results
 31         except Exception.__bases__:
 32             print "服务器访问失败"
 33 
 34     # 接口函数
 35 
 36     @classmethod
 37     def test_on(cls):
 38         print "用例执行开始"
 39 
 40     @classmethod
 41     def test_close(cls):
 42         print "用例执行结束"
 43 
 44     @classmethod
 45     def test_result(cls, pa):
 46         global report
 47         try:
 48             pattern = re.compile(pa)
 49             match = pattern.search(testresults.text)
 50             if match.group() == pa:
 51                 report = "测试通过"
 52         except AttributeError:
 53             report = "测试失败"
 54         return report
 55 
 56     # 正则表达式检测
 57 
 58     @classmethod
 59     def test_http(cls, code):
 60         print "请求返回状态码: ", code
 61 
 62     @classmethod
 63     def test_time(cls):
 64         nowtime = datetime.today()
 65         time = nowtime.strftime("%Y-%m-%d %H:%M:%S")
 66         return time
 67 
 68     # 获取当前时间转化字符串
 69 
 70     @classmethod
 71     def test_report(cls):
 72         nowtime = datetime.today()
 73         reportime = nowtime.strftime("%Y%m%d%H%M%S")
 74         reportname = reportime + ".xml"
 75         return reportname
 76 
 77     # 获取测试报告文件名称
 78 
 79     @classmethod
 80     def test_main(cls):
 81         global testresults
 82         table = CreateExcel.open_excel()
 83         nrows = CreateExcel.get_nrows(table)
 84         xml = minidom.Document()
 85         xml.appendChild(xml.createComment("测试报告"))
 86         caselist = xml.createElement("caselist")
 87         xml.appendChild(caselist)
 88         for i in range(0, nrows - 1):
 89             testid = CreateExcel.get_id(table, nrows)[i]
 90             testname = CreateExcel.get_name(table, nrows)[i]
 91             testdata = CreateExcel.get_data(table, nrows)[i]
 92             testurl = CreateExcel.get_url(table, nrows)[i]
 93             testmethod = CreateExcel.get_method(table, nrows)[i]
 94             testpattern = CreateExcel.get_pattern(table, nrows)[i]
 95 
 96             # 执行测试
 97             CreateTest.test_on()
 98             testresults = CreateTest.test_api(testmethod, testurl, testdata)
 99             testcode = str(testresults.status_code)
100             try:
101                 CreateTest.test_http(testresults.status_code)
102             except AttributeError:
103                 pass
104             CreateTest.test_close()
105             # 执行结束
106             # 生成xml文件
107             case = xml.createElement("case")
108             case.setAttribute("id", testid)
109             # 输入用例ID
110 
111             name = xml.createElement("name")
112             name.appendChild(xml.createTextNode(testname))
113             # 输入用例名称
114             method = xml.createElement("method")
115             method.appendChild(xml.createTextNode(testmethod))
116             # 输入接口类型
117             code = xml.createElement("code")
118             code.appendChild((xml.createTextNode(testcode)))
119             # 输入用例返回状态码
120             result = xml.createElement("result")
121             result.appendChild(xml.createTextNode(CreateTest.test_result(testpattern)))
122             # 输入用例测试结果
123             time = xml.createElement("time")
124             time.appendChild(xml.createTextNode(CreateTest.test_time()))
125             # 输入用例执行时间
126 
127             case.appendChild(name)
128             case.appendChild(method)
129             case.appendChild(code)
130             case.appendChild(result)
131             case.appendChild(time)
132 
133             caselist.appendChild(case)
134             # xml文件生成结束
135         filename = file(CreateTest.test_report(), "w+")
136         # 生成以当前时间命名的测试报告文件
137         xml.writexml(filename)
138         filename.close()
139         # 关闭文件
140 
141 
142 if __name__ == '__main__':
143     CreateTest.test_main()

 

下面是测试入口:

 1 #!/usr/bin/env python
 2 # -*- coding: utf_8 -*-
 3 # ****************************************************************
 4 # interface.py
 5 # Author     : ChenLei
 6 # Version    : 2.0
 7 # Date       : 2016-4-15
 8 # ****************************************************************
 9 
10 import time
11 from createtest import CreateTest
12 
13 start = time.clock()
14 CreateTest.test_main()
15 end = time.clock()
16 
17 print "接口自动化脚本运行时间:%.03f seconds" % (end - start)

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

posted on 2016-04-15 10:59  堕落的伊丝莉  阅读(1375)  评论(5编辑  收藏  举报