文件路径配置
– 框架结构当中,不同的目录路径配置。可移植
import os
# 1、basedir
basedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 拼到配置文件路径
conf_dir = os.path.join(basedir, "Conf")
# 拼接 测试数据路径
testdata_dir = os.path.join(basedir, "testdatas")
# 日志路径
log_dir = os.path.join(basedir, "outputs", "logs")
# 报告路径
report_dir = os.path.join(basedir, "outputs", "reports")
==================
pymysql 的 使用
一、python与各大数据库的连接:
http://testingpai.com/article/1596527686073
二、pymysql 安装
pip install pymysql
三、pymysql 包引入
import pymysql
1、连接数据库
数据库ip地址/域名
数据库名
用户名和密码
端口:mysql 3306
import pymysql
# 1、连接mysql数据库 - 占用数据库资源
db = pymysql.connect(
host="api.lemonban.com",
user="future",
password="123456",
port=3306,
database="futureloan",
charset="utf8",
cursorclass=pymysql.cursors.DictCursor
)
cur = db.cursor() # 2、创建游标
# 3、执行sql语句
sql = "select id from member where mobile_phone='13350171234'"
affected_rows = cur.execute(sql) # 返回的是affected_rows表示执行后的结果 条数
# 4、获取查询的结果
# data = cur.fetchone() # 获取第一个结果。返回是一个字典。
# cur.fetchmany(size=2) # 获取前2行
# 获取所有的结果。返回的是一个列表。
data = cur.fetchall()
print(data)
# 5、关闭游标、关闭数据库连接
cur.close() # 关闭游标
db.close() # 关闭数据库连接
================================
封装 pymysql
– 封装数据库连接,数据库操作,关闭。 数据库连接参数配置在Conf目录下
import pymysql
import os
from common.myConf import MyConf
from common.my_path import conf_dir
class MyMysql:
def __init__(self):
# 实例化配置类对象
conf = MyConf(os.path.join(conf_dir, "mysql.ini"))
# 连接数据库/生成游标
self.db = pymysql.connect(
host=conf.get("mysql", "host"),
user=conf.get("mysql", "user"),
password=conf.get("mysql", "passwd"),
port=conf.getint("mysql", "port"),
database=conf.get("mysql", "database"),
charset="utf8",
cursorclass=pymysql.cursors.DictCursor
)
# 2、创建游标
self.cur = self.db.cursor()
def get_count(self,sql):
""" 获取 sql 的条数, 表示执行后的结果:条数 """
count = self.cur.execute(sql)
return count
def get_one_data(self,sql):
""" 获取第一个结果。返回是一个字典。 """
self.cur.execute(sql)
return self.cur.fetchone()
def get_many_data(self,sql, size=None):
self.cur.execute(sql)
if size:
""" 获取多少行,可以指定获取多少行。 """
return self.cur.fetchmany(size)
else:
""" 获取所有的结果 """
return self.cur.fetchall()
def close_conn(self):
""" 关闭游标、关闭数据库连接 """
self.cur.close()
self.db.close()
""" 调式代码:执行当前的模块。"""
if __name__ == '__main__':
conn = My_mysql()
sql = "select * from member where mobile_phone='13560745669';"
count = conn.get_count(sql)
print(count)
conn.close_conn()
=================================================
获取手机号码处理
– 手机号码生成。faker生成,用mysql去确认是否已注册。
from faker import Faker
from common.mysql_handler import MysqlHandler
def get_new_phone():
"""
# 得到没有注册过的手机号码。
# 1、使用faker生成手机号码
# 2、调用mysql数据库操作,去判断是否在数据中存在。如果不在,表示没有注册
:return:
"""
while True:
phone = Faker("zh_CN").phone_number()
sql = "select id from member where mobile_phone='{}';".format(phone)
res = MysqlHandler().get_count(sql)
if res == 0:
return phone
===========================================================
#phone# 占位符替换
如 {“mobile_phone”: “#phone#”,“pwd”: “wtg444444”, “reg_name”: “白糖”,“tepy”:0}
import os
import json
import pytest
from common.py_log import LoggerHandler
from common.my_assert import MyAssert
from common.My_excel import MyExcel
from common.my_requests import MyRequests
from common.handele_phone import get_new_phone
from common.my_path import testdata_dir
log_info = LoggerHandler()
# 第一步:读取注册接口的测试数据 - 是个列表,列表中的每个成员,都是一个接口用例的数据。
excel_path = os.path.join(testdata_dir,"注册接口用例.xlsx")
me = MyExcel(excel_path, "注册")
cases = me.read_data()
# 第二步:遍历测试数据,每一组数据,发起一个http的接口请求
# 实例化请求对象
mq = MyRequests()
massert = MyAssert()
class TestRegister:
@pytest.mark.parametrize("case", cases)
def test_regiser(self,case):
logger.info("=========== 注册接口测试 ===============")
new_phone = get_new_phone() # 设置属性,自动生成手机号码。
if case["req_data"] and case["req_data"].find('#phone#') != -1: # 如果 case["req_data"] 和 case["req_data"] .里面的(#手机号码#) != -1: (-1)在这里是没有。
# 替换掉 req_data 里面的占位符 - 请求数据和断言里面替换掉#phone#,替换成未注册手机号码
logger.info("新生成的手机号码是:{}".format(new_phone))
case["req_data"] = case["req_data"].replace('#phone#', new_phone) # case["req_data"] = case["req_data"].替换掉(#手机号码#,new_phone:新生成的手机号码)
# 替换掉占位符 - 请求数据和断言里面替换掉#phone#,替换成未注册手机号码
if case["assert_list"] and case["assert_list"].find('#phone#') != -1: # 如果 case["assert_list"] 和 case["assert_list"].里面的(#手机号码#) != -1: (-1)在这里是没有。
case["assert_list"] = case["assert_list"].replace('#phone#', new_phone) # case["assert_list"] = case["assert_list"].替换成(#手机号码#, new_phone:新生成的手机号码)
# 把json格式的字符串,转换成一个字典
req_dict = json.loads(case["req_data"])
resp = mq.send_requests(case["url"], case["method"], req_dict)
# print(resp.json())
# 要断言
if case["assert_list"]:
massert.assert_response_value(case["assert_list"], resp.json())