这个是根据上次框架版本进行的优化
用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文件 如下: