python接口自动化-连接数据库
程序员文章站
2022-07-05 20:36:26
...
我们做测试的时候经常会去数据库取数据,这样能够保证数据有差异性,而且准确,那么怎么去数据库取数据,并且应用到接口里呢,我今天就来讲解一下
1、需求
加入购物车:我们加入购物车的商品必须是库里存在且上架的,我们每次加入购物车的商品不同,才能判断加入购物车功能是否可用
2、接口
3、代码
首先创建一个py文件,用来连接数据库,我这里创建了个conf.py
# -*- coding: utf-8 -*-
import pymysql #python连接mysql的驱动程序,需要用pip安装
#连接数据库
hostname = '192.168.*.*' #被连接的数据库服务器地址
username = 'root' #数据库账号
password = '123456' #账号密码
dab = 'student' #要连接的具体库名
conn = pymysql.connect(host=hostname, user=username, password=password, db=dab, charset='utf8')
cur = conn.cursor()
上边这段代码是用来连接数据库的,接下来我们从数据库取数据,创建一个py文件,名称为db_sql.py
import sys
sys.path.append('../')
from conf import * #把数据库连接语句导进来,也就是conf.py的内容加进来
class Sql_select(object):
def sql_addshopping(self):
conn.ping(reconnect=True) #这句的作用非常关键,是在每次取数据之前,先判断数据库是不是连接状态,如果未连接,则重连
self.sql1 = '这里是你的sql语句'
cur.execute(self.sql1) #执行sql
self.conid = cur.fetchone() #fetchone取1条,fetchall()取全部,运行完成以后,取出来的其实是一个元组,但是传参的时候,参数要求是字符串,所以需要处理一下,这就是下边这句的作用了
self.sql = ''.join(self.conid[0]) #去掉元组中的小括号
conn.close() #关闭连接
return (self.sql)
if __name__ == '__main__':
print (Sql_select().sql_addshopping())
根据上边的代码,取出来的结果如下:
为什么取isbn呢,因为上边的接口里要求了,传的参数必须是isbn,所以,我这里取出来的就是isbn,具体取什么数据,需要看接口的要求。
最后再创建一个测试文件,名称为:shopping_api.py,在这个文件里边,我们把从数据库取出来的数据用上
import unittest
import requests
import json
import sys
sys.path.append('../')
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
from db_sql import * #导入取数据文件
class Test_Apicase(unittest.TestCase):
def setUp(self):
self.url = 'http://*****/login'
self.param = {
'loginName' : '15333333333', #登录账号
'loginPwd' : '123456' #密码
}
self.res = requests.post(self.url,params=self.param)
self.r = self.res.headers
self.token = self.r['api-token'] #这里是登录,因为加入购物车动作是针对某一个用户做的,所以得先登录
def test_10add_shop(self):
'''add_shopping''' #用例名
self.isbn = Sql_select().sql_addshopping() #这里是从数据库取数据
self.url = 'http://*****/shoppingCart/add'
self.header = {
'api-token' : self.token
}
self.param = {
'isbn' : self.isbn #把从数据库取出来的数据放在这里当参数
}
self.res = requests.post(self.url,headers=self.header,params=self.param)
self.r = self.res.json()
print ('登录的账号是:%s\n密码是:%s' % ('15333333333','123456'))
print ('加入购物车的isbn是:%s\n返回值是:%s\n' % (self.isbn,self.r)) #这两个打印是为了有bug的时候有依据,建议大家打印出来,方便手动确认bug
self.assertEqual(200,self.r.get('code')) #断言
def tearDown(self):
pass
if __name__=='__main__':
suite = unittest.TestSuite()
suite.addTest(Test_Apicase('test_10add_shop'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
运行结果如下:
这样的返回值就非常清晰,如果有了bug,直接用打印出来的这些数据返测,一目了然,并且批量运行用例时,这些数据也会出现在测试报告上,非常方便。前边几篇已经介绍过测试报告了,这里就不批量运行了,一样一样的。
可能有小伙伴会问,为什么不把数据库连接和取数据放在一个文件里,因为有可能会有很多个需要从数据库取数据的接口,所以另写一个文件会更清晰,我也建议大家尽量把数据文件,配置文件,接口文件,测试文件,批量运行文件,日志文件分开,这样复用性会好一些。
今天的分享就到这里,如果对您有帮助的话,记得点赞加关注哦,有问题的小伙伴,评论见!