欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python接口自动化-连接数据库

程序员文章站 2022-07-05 20:36:26
...

我们做测试的时候经常会去数据库取数据,这样能够保证数据有差异性,而且准确,那么怎么去数据库取数据,并且应用到接口里呢,我今天就来讲解一下

1、需求

加入购物车:我们加入购物车的商品必须是库里存在且上架的,我们每次加入购物车的商品不同,才能判断加入购物车功能是否可用

2、接口

python接口自动化-连接数据库

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())

根据上边的代码,取出来的结果如下:
python接口自动化-连接数据库
为什么取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)

运行结果如下:
python接口自动化-连接数据库

这样的返回值就非常清晰,如果有了bug,直接用打印出来的这些数据返测,一目了然,并且批量运行用例时,这些数据也会出现在测试报告上,非常方便。前边几篇已经介绍过测试报告了,这里就不批量运行了,一样一样的。

可能有小伙伴会问,为什么不把数据库连接和取数据放在一个文件里,因为有可能会有很多个需要从数据库取数据的接口,所以另写一个文件会更清晰,我也建议大家尽量把数据文件,配置文件,接口文件,测试文件,批量运行文件,日志文件分开,这样复用性会好一些。

今天的分享就到这里,如果对您有帮助的话,记得点赞加关注哦,有问题的小伙伴,评论见!