项目背景
公司内部的软件采用B/S架构,目的是进行实验室的数据存储、分析、管理。大部分是数据的增删改查,但是由于还在开发阶段,所以UI的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与时间维护自动化脚本,对于小团队来说就得不偿失了。针对此种情况,选用接口测试较为有效。
工具选择
针对接口测试的自动化工具也很多,例如Soup UI、Postman、robotframework,甚至jmeter这样的性能测试工具都可以进行接口测试。
robot framework测试框架有很多的第三方库可以使用,采用的是填表的方式进行,较容易上手,但是无法深入底层的了解客户端与服务器的交互过程。jmeter这样的专注性能测试的工具,进行接口测试,有点大材小用的感觉而且无法生成测试报告。但是这些工具灵活性不够,也不完全适用于被测系统。
综上考虑,决定自己开发一个简单的框架,优点是足够灵活,可以随时根据需求进行变更,后台使用的是python+flask进行开发,此次选用python 2.7.11进行框架的开发,python开发的速度很快,且容易上手,丰富的第三方库,大大加快了开发速度和难度。
框架思路
由于是框架,所以要考虑到框架的可重用性和可维护性。其次,需要考虑到测试人员编写测试用例的方便性,采用数据驱动的设计方式,将数据分层出来,与业务逻辑剥离。这样测试人员就可以通过数据文件专注的写测试用例,不用关注代码编写,提高了效率。此次框架采用基本的excel进行数据管理。通过对excel 的读取获得数据。
之后将测试的结果生成HTML格式的测试报告发送给相关开发人员。
第三方库介绍
Requests
python中有许多针对http的库,例如自带的urllib2,但是自带的urllib2编写起来实在是太费精力,所以采用号称"HTTP for Humans"的requests库。
xlrd
xlrd使得python可以方便的对excel文件进行读写操作,此次通过xlrd读取excel文件中的测试数据。
以上第三方库都可以通过pip直接安装或者通过pypi下载源码包安装。
模块介绍
get_conf:读取配置文件,获得邮件发送的配置信息,如smtpserver、receiver、sender等。
md5Encode:部分数据采用md5加密后传输,所以需要把从excel读取的数据进行md5加密。
sendMail:当测试完成后,将测试报告自动的发送给相关开发人员。
runTest:此部分读取excel中的数据,调用下方的interfaceTest方法,保存interfaceTest返回的信息。
interfaceTest:将runTest读取的excel数据作为入参,执行接口测试,并将后台返回的信息返回给runTest。
Excel的文件格式如下图,API Purpose记录接口的名称,API Host记录主机地址,Request Methon记录请求方式,可以选择GET或者POST。
Request Data就是构造的测试数据,这里需要注意其格式的书写。
Check Point是检查点的设置,当获得数据后,需要跟检查点的数据进行比对,如果符合,说明测试成功,反之失败。
配置文件的格式如下图:
在这里可以设置邮件发送人、接收者、smtp服务器地址以及用户名密码。需要根据实际情况进行改变。
代码实现
python
#通过自带的ConfigParser模块,读取邮件发送的配置文件,作为字典返回 import ConfigParser def get_conf(): conf_file = ConfigParser.ConfigParser() conf_file.read(os.path.join(os.getcwd(),'conf.ini')) conf = {} conf['sender'] = conf_file.get("email","sender") conf['receiver'] = conf_file.get("email","receiver") conf['smtpserver'] = conf_file.get("email","smtpserver") conf['username'] = conf_file.get("email","username") conf['password'] = conf_file.get("email","password") return conf |
#此处使用python自带的logging模块,用来作为测试日志,记录测试中系统产生的信息。 import logging,os log_file = os.path.join(os.getcwd(),'log/sas.log') log_format = '[%(asctime)s] [%(levelname)s] %(message)s' logging.basicConfig(format=log_format, filename=log_file, filemode='w', level=logging.DEBUG) console = logging.StreamHandler() console.setLevel(logging.DEBUG) formatter = logging.Formatter(log_format) console.setFormatter(formatter) logging.getLogger('').addHandler(console) |
#读取testcase excel文件,获取测试数据,调用interfaceTest方法,将结果保存至errorCase列表中。 import xlrd,hashlib,json def runTest(testCaseFile): testCaseFile = os.path.join(os.getcwd(),testCaseFile) if not os.path.exists(testCaseFile): logging.error('测试用例文件不存在!') sys.exit() testCase = xlrd.open_workbook(testCaseFile) table = testCase.sheet_by_index(0) errorCase = [] #用于保存接口返回的内容和HTTP状态码 s = None for i in range(1,table.nrows): if table.cell(i, 9).vale.replace('\n','').replace('\r','') != 'Yes': continue num = str(int(table.cell(i, 0).value)).replace('\n','').replace('\r','') api_purpose = table.cell(i, 1).value.replace('\n','').replace('\r','') api_host = table.cell(i, 2).value.replace('\n','').replace('\r','') request_method = table.cell(i, 4).value.replace('\n','').replace('\r','') request_data_type = table.cell(i, 5).value.replace('\n','').replace('\r','') request_data = table.cell(i, 6).value.replace('\n','').replace('\r','') encryption = table.cell(i, 7).value.replace('\n','').replace('\r','') check_point = table.cell(i, 8).value if encryption == 'MD5': #如果数据采用md5加密,便先将数据加密 request_data = json.loads(request_data) request_data['pwd'] = md5Encode(request_data['pwd']) status, resp, s = interfaceTest(num, api_purpose, api_host, request_url, request_data, check_point, request_methon, request_data_type, s) if status != 200 or check_point not in resp: #如果状态码不为200或者返回值中没有检查点的内容,那么证明接口产生错误,保存错误信息。 errorCase.append((num + ' ' + api_purpose, str(status), 'http://'+api_host+request_url, resp)) return errorCase |
版权声明:本文出自《51测试天地》原创测试文章系列(四十二)投稿。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
相关推荐: