首先,思考一下为什么要做接口测试?接口测试的正常流程是什么样的?明确了才容易着手搭建接口测试所需的框架。做接口测试的目的主要有以下几点:
(1)不同端(客户端、前端、后端)的工作进度不一样,需要对最开始出来的接口进行接口测试;(2)节约时间,缩短项目时间;(3)提高工作效率;(4)提高系统的健壮性等。而正常的测试流程大致分为:需求评审、场景设计、设计用例、配置需要的接口参数、执行测试、检查测试结果、生成测试报告这几个过程。
其次,还需要了解一下接口测试的种类有哪些?接口的种类主要分为外部接口、内部接口(包括上层服务和下层服务),不了解的可以查找相关资料,这个不作为本次重点讲述范围,所以不再此展开。
好了,下面开始讲述接口测试框架的搭建过程:
一、环境搭建
- 本套框架是采用python3.6自带的requests库来进行接口测试的,所以需要先安装python3.6以及request库(安装方法比较简单,不再赘述)
- 安装pycharm
- 在Pycharm官网,或者直接输入网址:http://www.https://www.jetbrains.com/pycharm/,下载PyCharm安装包,根据自己电脑的操作系统进行选择安装
- 安装后进入激活界面,选择第二个License server,然后输入注册码,这里提供四个(四个选一个即可):
http://im.js.cn:8888
http://idea.java.sx/
二、框架搭建
- 框架主要分为:配置文件、接口相关文件、测试用例、测试用例脚本、生成测试报告以及发送测试报告邮件这几个模块。目的是使业务逻辑和测试脚本分离,便于灵活的使用和管理接口自动化测试框架,我的结构是这样的,可以参考一下。
- 配置文件:
- config.ini配置文件:存放一些固定的数据,如域名、协议、端口、数据库账号密码、邮件发送人、邮件接收人,保存auth等。
2.readConfig.py:用于读取config配置文件内容,
import os
import codecs
import configparser
proDir = os.path.split(os.path.realpath(__file__))[0]
configPath = os.path.join(proDir, "config.ini")
class ReadConfig:
def __init__(self):
fd = open(configPath)
data = fd.read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
file = codecs.open(configPath, "w")
file.write(data)
file.close()
fd.close()
self.cf = configparser.ConfigParser()
self.cf.read(configPath)
def get_email(self, name):
value = self.cf.get("EMAIL", name)
return value
def get_http(self, name):
value = self.cf.get("HTTP", name)
return value
def get_db(self, name):
value = self.cf.get("DATABASE", name)
return value
- 接口相关文件配置:
- configHttp.py接口配置脚本:因为python自带的requests库已经封装好了测试接口的方法,用起来也比较方便,所以只需要在configHttp中配置需要的方法就可以了。
- interfaceURL.xml接口url文件:因为整个接口的前半部分的域名是固定的,放在了config.ini配置文件中,而接口后半部分因业务功能不一样而有所不同,所以将接口的后半部分放在这个xml文件中,可以根据实际情况获取。
- 测试用例管理:
- 使用excel表格来管理接口测试用例,一行对应一条测试用例,一个sheet表对应一个测试用例脚本
- 测试脚本统一放在testCase文件夹中,如图:
- caselist.txt文件:该配置文件用于配置每次执行的用例名称,如果不需要执行某一个测试用例,只需要在caselist.txt文件中将这个用例名称使用“#”号注释掉就好了
- result测试结果文件夹:该文件夹存放每次生成的测试结果,即测试报告和相关的日志文件,如图:
- 测试报告
- HTMLTestRunner.py是用于生成html格式的测试报告,如图:
- HTMLTestRunner.py配置方法:
(1)打开终端,输入which python确认python的安装目录
(2)然后将HTMLTestRunner.py文件拷贝到python目录下,例如:cp HTMLTestRunner.py /Library/Frameworks/Python.framework/Versions/3.6/bin/python3
(3)进入python交互模式,输入import HTMLTestRunner,如果没有报错,则说明添加成功
- 如果在pycharm中运行HTMLTestRunner时,报错:PyCharm:ModuleNotFoundError: No module named ‘HTMLTestRunner’提示找不到这个模块,但在python交互模式下,是可以导入HTMLTestRunner的,在pycharm中会报错是因为PyCharm和之前命令行安装使用的不是一套资源,需要在pycharm中重新导入HTMLTestRunner。
- configEmail.py把测试报告以附件的形式,通过email发邮件
- runAll.py整个框架运行的入口:首先我们要从caselist.txt文件中读取需要执行的case名称,然后将他们添加到python自带的unittest测试集中,最后执行run()函数,执行测试集
import unittest import HTMLTestRunner def set_case_list(self): fb = open(self.caseListFile) for value in fb.readlines(): data = str(value) if data != '' and not data.startswith("#"): self.caseList.append(data.replace("\n", "")) fb.close() def set_case_suite(self): self.set_case_list() test_suite = unittest.TestSuite() suite_model = [] for case in self.caseList: case_file = os.path.join(readConfig.proDir, "testCase") print(case_file) case_name = case.split("/")[-1] print(case_name+".py") discover = unittest.defaultTestLoader.discover(case_file, pattern=case_name + '.py', top_level_dir=None) suite_model.append(discover) if len(suite_model) > 0: for suite in suite_model: for test_name in suite: test_suite.addTest(test_name) else: return None return test_suite def run(self): try: suit = self.set_case_suite() if suit is not None: logger.info("********TEST START********") fp = open(resultPath, 'wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='Test Report', description='Test Description') runner.run(suit) else: logger.info("Have no case to test.") except Exception as ex: logger.error(str(ex)) finally: logger.info("*********TEST END*********") # 发送邮件 if int(on_off) == 0: self.email.send_email() elif int(on_off) == 1: logger.info("Doesn't send report email to developer.") else: logger.info("Unknow state.")
至此,这套接口测试框架基本搭建完成啦!