Python+unittest+requests接口自动化测试框架搭建 完整的框架搭建过程

ops/2025/3/31 10:25:49/

首先配置好开发环境,下载安装Python并下载安装pycharm,在pycharm中创建项目功能目录。如果不会的可以百度Google一下,该内容网上的讲解还是比较多比较全的!

大家可以先简单了解下该项目的目录结构介绍,后面会针对每个文件有详细注解和代码。

common:

——configDb.py:这个文件主要编写数据库连接池的相关内容,本项目暂未考虑使用数据库来存储读取数据,此文件可忽略,或者不创建。本人是留着以后如果有相关操作时,方便使用。

——configEmail.py:这个文件主要是配置发送邮件的主题、正文等,将测试报告发送并抄送到相关人邮箱的逻辑。

——configHttp.py:这个文件主要来通过get、post、put、delete等方法来进行http请求,并拿到请求响应。

——HTMLTestRunner.py:主要是生成测试报告相关

——Log.py:调用该类的方法,用来打印生成日志

result:

——logs:生成的日志文件

——report.html:生成的测试报告

testCase:

——test01case.py:读取userCase.xlsx中的用例,使用unittest来进行断言校验

testFile/case:

——userCase.xlsx:对下面test_api.py接口服务里的接口,设计了三条简单的测试用例,如参数为null,参数不正确等

caselist.txt:配置将要执行testCase目录下的哪些用例文件,前加#代表不进行执行。当项目过于庞大,用例足够多的时候,我们可以通过这个开关,来确定本次执行哪些接口的哪些用例。

config.ini:数据库、邮箱、接口等的配置项,用于方便的调用读取。

getpathInfo.py:获取项目绝对路径

geturlParams.py:获取接口的URL、参数、method等

readConfig.py:读取配置文件的方法,并返回文件中内容

readExcel.py:读取Excel的方法

runAll.py:开始执行接口自动化,项目工程部署完毕后直接运行该文件即可

test_api.py:自己写的提供本地测试的接口服务

test_sql.py:测试数据库连接池的文件,本次项目未用到数据库,可以忽略

二、Python+unittest+requests+HTMLTestRunner完整的接口自动化测试框架搭建_01——测试接口服务

首先,我们想搭建一个接口自动化测试框架,前提我们必须要有一个可支持测试的接口服务。有人可能会说,现在我们的环境不管测试环境,还是生产环境有现成的接口。但是,一般工作环境中的接口,不太满足我们框架的各种条件。举例如,接口a可能是get接口b可能又是post,等等等等。因此我决定自己写一个简单的接口!用于我们这个框架的测试!

按第一讲的目录创建好文件,打开test_api.py,写入如下代码

 
 
  1. import flask

  2. import json

  3. from flask import request

  4. '''

  5. flask: web框架,通过flask提供的装饰器@server.route()将普通函数转换为服

  6. '''

  7. # 创建一个服务,把当前这个python文件当做一个服务

  8. server = flask.Flask(__name__)

  9. # @server.route()可以将普通函数转变为服务 登录接口的路径、请求方式

  10. @server.route('/login', methods=['get', 'post'])

  11. def login():

  12. # 获取通过url请求传参的数据

  13. username = request.values.get('name')

  14. # 获取url请求传的密码,明文

  15. pwd = request.values.get('pwd')

  16. # 判断用户名、密码都不为空

  17. if username and pwd:

  18. if username == 'xiaoming' and pwd == '111':

  19. resu = {'code': 200, 'message': '登录成功'}

  20. return json.dumps(resu, ensure_ascii=False) # 将字典转换字符串

  21. else:

  22. resu = {'code': -1, 'message': '账号密码错误'}

  23. return json.dumps(resu, ensure_ascii=False)

  24. else:

  25. resu = {'code': 10001, 'message': '参数不能为空!'}

  26. return json.dumps(resu, ensure_ascii=False)

  27. if __name__ == '__main__':

  28. server.run(debug=True, port=8888, host='127.0.0.1')

执行test_api.py,在浏览器中输入http://127.0.0.1:8888/login?name=xiaoming&pwd=11199回车,验证我们的接口服务是否正常~  

 变更我们的参数,查看不同的响应结果确认接口服务一切正常

 三、Python+unittest+requests+HTMLTestRunner完整的接口自动化测试框架搭建_02——配置文件读取

在我们第二讲中,我们已经通过flask这个web框架创建好了我们用于测试的接口服务,因此我们可以把这个接口抽出来一些参数放到配置文件,然后通过一个读取配置文件的方法,方便后续的使用。同样还有邮件的相关配置~

按第一讲的目录创建好config.ini文件,打开该文件写入如下:

 
 
  1. # -*- coding: utf-8 -*-

  2. [HTTP]

  3. scheme = http

  4. baseurl = 127.0.0.1

  5. port = 8888

  6. timeout = 10.0

  7. [EMAIL]

  8. on_off = on;

  9. subject = 接口自动化测试报告

  10. app = Outlook

  11. addressee = songxiaobao@qq.com

  12. cc = zhaobenshan@qq.com

在HTTP中,协议http,baseURL,端口,超时时间。

在邮件中on_off是设置的一个开关,=on打开,发送邮件,=其他不发送邮件。subject邮件主题,addressee收件人,cc抄送人。

在我们编写readConfig.py文件前,我们先写一个获取项目某路径下某文件绝对路径的一个方法。按第一讲的目录结构创建好getpathInfo.py,打开该文件

 
  1. import os

  2. def get_Path():

  3. path = os.path.split(os.path.realpath(__file__))[0]

  4. return path

  5. if __name__ == '__main__':# 执行该文件,测试下是否OK

  6. print('测试路径是否OK,路径为:', get_Path())

填写如上代码并执行后,查看输出结果,打印出了该项目的绝对路径:

继续往下走,同理,按第一讲目录创建好readConfig.py文件,打开该文件,以后的章节不在累赘

 
 
  1. import os

  2. import configparser

  3. import getpathInfo#引入我们自己的写的获取路径的类

  4. path = getpathInfo.get_Path()#调用实例化,还记得这个类返回的路径为C:\Users\songlihui\PycharmProjects\dkxinterfaceTest

  5. config_path = os.path.join(path, 'config.ini')#这句话是在path路径下再加一级,最后变成C:\Users\songlihui\PycharmProjects\dkxinterfaceTest\config.ini

  6. config = configparser.ConfigParser()#调用外部的读取配置文件的方法

  7. config.read(config_path, encoding='utf-8')

  8. class ReadConfig():

  9. def get_http(self, name):

  10. value = config.get('HTTP', name)

  11. return value

  12. def get_email(self, name):

  13. value = config.get('EMAIL', name)

  14. return value

  15. def get_mysql(self, name):#写好,留以后备用。但是因为我们没有对数据库的操作,所以这个可以屏蔽掉

  16. value = config.get('DATABASE', name)

  17. return value

  18. if __name__ == '__main__':#测试一下,我们读取配置文件的方法是否可用

  19. print('HTTP中的baseurl值为:', ReadConfig().get_http('baseurl'))

  20. print('EMAIL中的开关on_off值为:', ReadConfig().get_email('on_off'))

执行下readConfig.py,查看数据是否正确

 一切OK

四、Python+unittest+requests+HTMLTestRunner完整的接口自动化测试框架搭建_03——读取Excel中的case

配置文件写好了,接口我们也有了,然后我们来根据我们的接口设计我们简单的几条用例。首先在前两讲中我们写了一个我们测试的接口服务,针对这个接口服务存在三种情况的校验。正确的用户名和密码,账号密码错误和账号密码为空

 我们根据上面的三种情况,将对这个接口的用例写在一个对应的单独文件中testFile\case\userCase.xlsx ,userCase.xlsx内容如下:

 紧接着,我们有了用例设计的Excel了,我们要对这个Excel进行数据的读取操作,继续往下,我们创建readExcel.py文件

 
  1. import os

  2. import getpathInfo# 自己定义的内部类,该类返回项目的绝对路径

  3. #调用读Excel的第三方库xlrd

  4. from xlrd import open_workbook

  5. # 拿到该项目所在的绝对路径

  6. path = getpathInfo.get_Path()

  7. class readExcel():

  8. def get_xls(self, xls_name, sheet_name):# xls_name填写用例的Excel名称 sheet_name该Excel的sheet名称

  9. cls = []

  10. # 获取用例文件路径

  11. xlsPath = os.path.join(path, "testFile", 'case', xls_name)

  12. file = open_workbook(xlsPath)# 打开用例Excel

  13. sheet = file.sheet_by_name(sheet_name)#获得打开Excel的sheet

  14. # 获取这个sheet内容行数

  15. nrows = sheet.nrows

  16. for i in range(nrows):#根据行数做循环

  17. if sheet.row_values(i)[0] != u'case_name':#如果这个Excel的这个sheet的第i行的第一列不等于case_name那么我们把这行的数据添加到cls[]

  18. cls.append(sheet.row_values(i))

  19. return cls

  20. if __name__ == '__main__':#我们执行该文件测试一下是否可以正确获取Excel中的值

  21. print(readExcel().get_xls('userCase.xlsx', 'login'))

  22. print(readExcel().get_xls('userCase.xlsx', 'login')[0][1])

  23. print(readExcel().get_xls('userCase.xlsx', 'login')[1][2])

结果为:

完全正确~ 

五、Python+unittest+requests+HTMLTestRunner完整的接口自动化测试框架搭建_04——requests请求配置文件有了,读取配置文件有了,用例有了,读取用例有了,我们的接口服务有了,我们是不是该写对某个接口进行http请求了,这时候我们需要使用pip install requests来安装第三方库,在common下configHttp.py,configHttp.py的内容如下:

 
 
  1. import requests

  2. import json

  3. class RunMain():

  4. def send_post(self, url, data): # 定义一个方法,传入需要的参数url和data

  5. # 参数必须按照url、data顺序传入

  6. result = requests.post(url=url, data=data).json() # 因为这里要封装post方法,所以这里的url和data值不能写死

  7. res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)

  8. return res

  9. def send_get(self, url, data):

  10. result = requests.get(url=url, params=data).json()

  11. res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)

  12. return res

  13. def run_main(self, method, url=None, data=None): # 定义一个run_main函数,通过传过来的method来进行不同的get或post请求

  14. result = None

  15. if method == 'post':

  16. result = self.send_post(url, data)

  17. elif method == 'get':

  18. result = self.send_get(url, data)

  19. else:

  20. print("method值错误!!!")

  21. return result

  22. if __name__ == '__main__': # 通过写死参数,来验证我们写的请求是否正确

  23. result1 = RunMain().run_main('post', 'http://127.0.0.1:8888/login', {'name': 'xiaoming','pwd':'111'})

  24. result2 = RunMain().run_main('get', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd=111')

  25. print(result1)

  26. print(result2)

执行该文件,验证结果正确性:

 我们发现和浏览器中进行请求该接口,得到的结果一致,说明没有问题,一切OK

六、Python+unittest+requests+HTMLTestRunner完整的接口自动化测试框架搭建_05——参数动态化

在上一讲中,我们写了针对我们的接口服务,设计的三种测试用例,使用写死的参数(result = RunMain().run_main('post', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd='))来进行requests请求。本讲中我们写一个类,来用于分别获取这些参数,来第一讲的目录创建geturlParams.py,geturlParams.py文件中的内容如下:

 
  1. import readConfig as readConfig

  2. readconfig = readConfig.ReadConfig()

  3. class geturlParams():# 定义一个方法,将从配置文件中读取的进行拼接

  4. def get_Url(self):

  5. new_url = readconfig.get_http('scheme') + '://' + readconfig.get_http('baseurl') + ':8888' + '/login' + '?'

  6. #logger.info('new_url'+new_url)

  7. return new_url

  8. if __name__ == '__main__':# 验证拼接后的正确性

  9. print(geturlParams().get_Url())

 通过将配置文件中的进行拼接,拼接后的结果:http://127.0.0.1:8888/login?和我们请求的一致


http://www.ppmy.cn/ops/170439.html

相关文章

【MVCC快照如何实现】

MVCC(多版本并发控制)快照的实现原理 MVCC(Multi-Version Concurrency Control)是现代数据库实现事务隔离级别的核心技术,它通过数据多版本和快照机制来实现高效的并发控制。下面我将详细解析MVCC快照的实现机制。 一、MVCC核心组件 1. 版本链结构 MVCC通过以下…

android|生成二维码qrcode(android)

1.build.gradle implementation com.google.zxing:core:3.4.1引入zxing库 只是生成的话引入core库就可以了 2.封装方法 import android.graphics.Bitmap; import android.graphics.Color;import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; imp…

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写? 文章介绍了第一种写法id选择器,其实XPath元素定位要比CSS好用,原因是CSS无法使用下标(工作当中也是常用的xpath),但CSS定位速度比XPat…

服务器数据恢复—Raid5热备盘同步中断的数据恢复案例

服务器数据恢复环境: 某公司一台存储上有一组由15块硬盘组建的raid5阵列。raid5阵列上层是一个xfs裸分区,起始位置是0扇区。 服务器故障: raid5阵列中有一块硬盘出现故障掉线,热备盘自动上线同步数据,数据同步还没有完…

macbook电脑如何清理键盘防止误触

M1芯片的MacBook电脑关机后按任意键开机,是苹果的功能设计。这样设计的目的是为了方便用户,让用户在想要使用电脑时能快速开机。但是清理电脑键盘的时候却成为了一种苦恼 以下是一些清理 MacBook 键盘防止误触的方法: 使用工具锁定键盘 Cle…

Oracle补丁自动化安装步骤

1.3.2 补丁安装说明 1. 回滚冲突补丁: 在应用补丁之前,你必须回滚任何在冲突检测中发现的冲突补丁。否则,执行 opatch apply 命令时,补丁安装可能会再次报告冲突。 2. 安装补丁的环境要求: Data Guard 物理备用数据…

【js逆向入门】图灵爬虫练习平台 第九题

地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…

MySQL原理:逻辑架构

目的:了解 SQL执行流程 以及 MySQL 内部架构,每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层:连接层 3.1 数据库连接池(Conn…