自动化测试
  bzUvzvVq9oY1 2023年11月02日 28 0

接口自动化测试整体步骤

接口需求分析

确定接口测试范围和目标

  • 测试范围
  • 登录接口
  • 注册接口
  • 测试目标
  • 接口功能测试

阅读文档,需求分析要点

  • 获取需求规格说明书《apitest接口需求.pdf》,设计说明书等接口文档
  • 分析接口的功能要求(实现何种业务)
  • 接口地址(协议、服务器IP、端口号、接口名、/是否可以省略)
  • 请求方法
  • 参数(有无参数、参数名、参数含义、参数长度、参数必须还是可选、约束<主键、唯一、是否运行为空、外键、默认值>)
  • 返回值(响应码、响应正文类型、响应正文内容)
  • 对数据库是否有影响

接口自动化测试能做什么?

  • 自动准备初始化数据
  • 自动执行测试用例
  • 自动验证接口返回结果的正确性
  • 自动验证数据库数据的正确性
  • 自动生成测试报告

Requests库

  • requests是一个第三方库,需要下载安装
  • requests的作用是发送请求获得响应
  • 在网络爬虫,接口自动化测试时,使用requests较多
  • 安装Requests库
pip install requests
#验证是否安装成功
pip list

requests.get()

  • 作用:用于实现使用Get方法发送HTTP请求
  • GET:方法主要用于获取资源

语法格式:

#导入requests库
import requests
#调用requests对象中的get()方法,根据要求指定接口地址、请求参数等、发送请求、获取响应
#将响应结果赋值给result变量
result = requests.get(url,params,headers,auth,cookies,timeout,verify)
"""
	url:接口地址,,,必填参数(其余可以根据实际情况去填写)
	params:请求数据
	headers:请求头
	auth:用户认证
	cookies:cookie管理器,用于保持会话
	timeout:超时等待时间,超时(多少秒后提醒超时)
	verify:根据https请求的参数
	result:自定义对象名,其中存储着响应头和响应体
"""

查看响应结果

# 响应状态码: result.status_code
例如:200、401、404、500、301等
# 响应正文: result.text
python将响应正文统一转为字符串类型
查看任意响应类型的响应正文,一般用于text/html类型的响应正文
# 响应类型:result.headers['content-type']
headers 是响应头
content-type 是内容类型,其中响应类型是开发设定的
响应正文的类型:text/html、JSON、XML等
print(f'响应状态码是:{result.status_code}')
# python将响应正文统一为字符串类型,可用于查看任意响应类型的响应正文
# 一般用于text/html类型的响应正文
print(f'响应体_text是:{result.text}数据类型是:{type(result.text)}') # 字符串类型
print(f'响应类型是:{result.headers["Content-Type"]}')
print(f'请求头是:{result.request.headers}')
print(f'请求体是:{result.request.body}')
print(f'实际请求url是:{result.url}')
print(f'响应体_json是:{result.json()},数据类型是:{type(result.json())}') # 字典类型

练习1

'''
使用get访问无参接口,查看响应状态码、响应体、响应类型、请求头、请求体
需求:
地址:http://接口服务器IP/apitest/ui-login
参数:无
响应类型:text/html
预期包含文本:<td align=right>用户名<td><input type='text' name='usename' size=20 maxlength=18>
'''
# 导入requests
import requests
# 指定接口地址
address = 'http://39.104.25.201/apitest/ui-login/'
# 发送Get请求,获得响应结果
result = requests.get(url=address)
# 查看响应结果
print(f'响应状态码是:{result.status_code}')
print(f'响应体是:{result.text}')
print(f'响应类型是:{result.headers["Content-Type"]}')
print(f'请求头是:{result.request.headers}')
print(f'请求体是:{result.request.body}')

练习2

'''
get访问无参接口,分别使用text和json查看响应正文和响应类型
地址:http://www.httpbin.org/get
方法:get
参数:无
响应类型:json
预期包含json对象,形如{"key1":"value1", "key2":"value1", ...}
'''
 #导入requests
import requests
# 指定接口地址
address = 'http://www.httpbin.org/get'
# 发送Get请求,获得响应结果
result = requests.get(url=address)
# 查看响应结果
print(f'响应体_text是:{result.text}数据类型是:{type(result.text)}') # 字符串类型
print(f'响应体_json是:{result.json()},数据类型是:{type(result.json())}') # 字典类型
print(f'响应类型是:{result.headers["Content-Type"]}')

test与json()区别

# 如果响应类型是text/html,只能使用res.text查看响应正文(如果使用res.json()
会报错)
# res.text看到的内容是开发人员写的代码的原始样式(接口中汉字会显示为unicode
编码,这种属于json字符串)
# res.json()会对json字符串进行格式化(统一格式),所有键用单引号定界,冒号后面
加一个空格,逗号后面加一个空格
# 如果响应类型是application/json(简称json),使用res.text或res.json()都可
以,但是常用res.json()
# res.text的结果是字符串格式,res.json()的结果是字典格式
# r.text 获得响应文本,字符串格式,空为null,真为true
# r.json()获得响应文本,字典格式 ,空为None,真为True
将来测试时:比对实际结果和预期结果时,使用true还是True,或者使用null还是None,取决于用的
是text还是json()

result.text 与 result.json()**区别**

  • 如果响应类型是text/html,只能使用result.text查看响应正文
  • 如果响应类型是application/json,使用result.text和result.json()都可以
  • result.text是字符串类型,result.json()是字典类型

requests.get(url,params)

  • params表示发送给接口地址的参数,代表需要接口处理的数据
  • params多数情况下是一个字典格式,其中参数名为键,参数作为值
{"username":"admin","password":123456}
  • 可以将参数写在接口地址末尾,不推荐使用
address = 'http://39.104.25.201/apitest/one-param/?id=1'

练习3

'''
get访问接口,查看响应正文、响应类型、实际请求url、请求头、请求体
接口功能:根据用户id查询用户名
接口地址:http://接口服务器IP/C
请求方法:get
参数:id(含义:用户编号,整数类型)
数据库和表:用户信息存储在wa_test数据库的users表中
响应类型:text/html
预期返回:显示用户名或用户信息不存在
'''
# 导入requests
import requests
# 指定接口地址
address = 'http://39.104.25.201/apitest/one-param/'
# 指定请求参数
params = {"id":1}
# 发送Get请求,获得响应结果
result = requests.get(url=address,params=params)
# 查看响应结果
print(f'响应正文_text是:{result.text}数据类型是:{type(result.text)}')
print(f'响应类型是:{result.headers["Content-Type"]}')
print(f'实际请求url是:{result.url}')
print(f'请求头是:{result.request.headers}')
print(f'请求体是:{result.request.body}')

requests.post()

  • 实现使用post方法发送HTTP请求,用于向服务器提交资源

Post发送数据类型

  • 表单数据类型:application/x-www-form-urlencoded,默认使用的类型
  • JSON类型:application/json
  • form-data类型:multipart/form-data,一般用于上传文件

post语法格式

result = requests.posst()
#导入requests库
import requests
#调用requests对象中的get()方法,根据要求指定接口地址、请求参数等、发送请求、获取响应
#将响应结果赋值给result变量
result = requests.get(url,data,json,files,headers,auth,cookies,timeout,verify)

"""
	url:接口地址,,,必填参数(其余可以根据实际情况去填写)
	data:表单类型请求数据
	json:json类型请求数据
	files:form-data上传文件请求数据
	headers:请求头
	auth:用户认证
	cookies:cookie管理器,用于保持会话
	timeout:超时等待时间,超时(多少秒后提醒超时)
	verify:根据https请求的参数
	result:自定义对象名,其中存储着响应头和响应体
"""

练习1

'''
post发送表单数据到apitest登录接口,测试成功登录,查看响应正文、响应类型、请求类型、请求体
接口功能:根据用户名和密码验证登录是否成功
接口地址:http://接口服务器IP/apitest/login/
请求方法:post
请求类型:表单类型
参数:username、password
数据库表:wa_test.users
响应类型:json
预期包含文本:登录验证成功
'''
# 导入requests
import requests
# 指定接口地址
address = 'http://39.104.25.201/apitest/login/'
# 指定请求参数
data = {"username":"admin","password":"123456"}
# 发送Post请求,获得响应结果
result = requests.post(url=address,data=data)
# 查看响应结果
print(f'响应正文_text是:{result.text},数据类型是:{type(result.text)}')
print(f'响应类型是:{result.headers["Content-Type"]}')
print(f'实际请求url是:{result.url}')
print(f'请求头是:{result.request.headers}')
print(f'请求体是:{result.request.body}')

requests.post(url,json)

  • 向服务器提交的请求正文是JSON字符串形式
  • 三种编写方式
  • json=字典
  • 传输数据时自动转换为json字符串格式,数据以字节形式发送
data='json字符串',headers={"content-type":"application/json"}
  • dumps表示序列化(将字典转化为json字符串)
  • 需要导入json库

练习2

'''
post发送json数据给apitest注册接口,测试用户名被占用的情况,查看响应正文、响应类型、请求类型、
请求体
接口功能:将用户信息记录到数据库的表中
接口地址:http://接口服务器IP/apitest/signup/
请求方法:post
post数据类型:json字符串
参数:username(要求用户名不能重复)、password、confirm(确认密码,与password要相同)、
name(姓名,给值即可)
数据库表:wa_test.users
响应类型:json类型
预期包含文本:用户名已被占用
'''
# 导入requests
import requests
# 指定接口地址
address = 'http://39.104.25.201/apitest/signup/'
# 指定请求参数
data = {
"username":"test100",
"password":"123456",
"confirm":"123456",
"name":"重复注册"
}
# 发送Post请求,获得响应结果
result = requests.post(url=address,json=data)
# 查看响应结果
print(f'响应正文_text是:{result.text},数据类型是:{type(result.text)}')
print(f'响应类型是:{result.headers["Content-Type"]}')
print(f'请求体是:{result.request.body}')

requests.post(url,files)

  • files用于指定上传一个或多个文件
  • files属于字典格式
  • files=不能省略
requests.post(url,files={"参数名1":open("文件名1.扩展名1":"rb"),"参数名2":open("文件名2.扩展名2","rb")})

练习3

"""
上传多个文件,查看请求类型、请求体、响应正文
接口功能:将多个文件上传到服务器指定目录中
接口地址:http://接口服务器IP/apitest/upload-file/upfiles/
请求方法:post
参数:名称自定义
响应类型:text/html
预期包含文本:上传成功
"""
#导入requests
import requests
# 指定接口地址
address = 'http://39.104.25.201/apitest/upload-file/upfiles/'
# 指定请求参数
data = {"file01":open("Demo01.py","rb") ,"file02":open("Demo02.py","rb") }
# 发送Post请求,获得响应结果
result = requests.post(url=address,files=data)
# 查看响应结果
print(f'响应正文_text是:{result.text},数据类型是:{type(result.text)}')
print(f'请求类型是:{result.request.headers["Content-Type"]}')
print(f'请求体是:{result.request.body}')

关联

接口关联

  • 在实际业务接口这种,完成一个业务功能时,有时候一个接口可能不满足业务的整个流程逻辑,需要多个接口配合使用
  • 一个接口需要另一个接口提供数据
  • 在实际工作中常用cookie或token实现与登陆接口相关联

Cookie

  • 也称cookies,是存在客户端上的一个小型文本文件,用于存储和记录登录成功的信息,在客户端发送请求时,会附带在请求头中,表示已经成功登录

cookies的使用机制

  • 从响应中获得cookies
  • 客户端登录成功后,cookies会存储在服务器发送给客户端的HTTP响应头中,cookies的键名时Set-Cookie
  • 携带cookies发送请求
  • 客户端把需要的cookies附在HTTP请求头中发送给服务器
  • 服务器收到cookies后,会验证收到的cookies是否与之前发送的cookies相同,如果相同则认为是统一用户在访问接口

获取cookie

#从响应头中获取cookie,字符串类型
result.headers["Set-Cookie"]
#用户获取服务器发来的cookies,是RequestsCookieJar对象
#如果响应头中没有cookie,则result.cookies为空
result.cookies

发送cookies

#发送请求时指定cookie值
requests.post(url,headers={"Cookie":Cookie字符串})
requests.post(url,cookies=result.cookies)

练习1

"""
访问关联接口
被测接口:http://39.104.25.201/apitest/refer/info/
功能:查询信息接口
方法:get方法
参数:无参接口
关联接口:http://39.104.25.201/apitest/refer/login/
功能:登录接口
方法:post
参数:username、password
数据库表:wa_test.users
"""
# 方法一
# 导入requests
import requests
# 指定登录接口地址
address = 'http://39.104.25.201/apitest/refer/login/'
# 指定请求参数
data = {"username":"admin","password":"123456"}
# 发送Post请求,获得响应结果
result = requests.post(url=address,data=data)
# 查看响应结果
print(f'响应正文_text是:{result.text},数据类型是:{type(result.text)}')
# 获取cookie
ck = result.cookies
# 指定信息查询接口地址
address = 'http://39.104.25.201/apitest/refer/info/'
result = requests.get(url=address,cookies=ck)
print(f'响应体是:{result.text}')

# 方法二
# 导入requests
import requests
# 指定登录接口地址
address = 'http://39.104.25.201/apitest/refer/login/'
# 指定请求参数
data = {"username":"admin","password":"123456"}
# 发送Post请求,获得响应结果
result = requests.post(url=address,data=data)
# 获取cookie
ck = result.headers['Set-cookie']
# 指定信息查询接口地址
address = 'http://39.104.25.201/apitest/refer/info/'
result = requests.get(url=address,headers={"Cookie":ck})
print(f'响应体是:{result.text}')

requests.session()

  • session会话,用于保持该session为全局变量,其他接口都使用该session发送请求
  • session用于实现自动关联
  • 使用方法
s = requests.session()
s.get(...)
s.post(...)
#s.get(...)与s.post(...)保持同一会话
"""
访问关联接口
被测接口:http://接口服务器IP/apitest/refer/info/
功能:查询信息接口
请求方法:get方法
无参
关联接口:http://接口服务器IP/apitest/refer/login/
功能:登录接口
请求方法:post方法
参数:username、password
数据库表:wa_test.users
'''
# 方法三
# 导入requests
import requests
# 指定登录接口地址
address = 'http://39.104.25.201/apitest/refer/login/'
# 指定请求参数
data = {"username":"admin","password":"123456"}
# 发送Post请求,获得响应结果
s = requests.session()
result = s.post(url=address,data=data)
# 指定信息查询接口地址
address = 'http://39.104.25.201/apitest/refer/info/'
result = s.get(url=address)
print(f'响应体是:{result.text}')

接口自动化测试的具体编码步骤

  • 数据库初始化
  • 是对前置条件的落实、
  • 准备测试数据。设计数据库的增删改查操作
  • 执行测试用例
  • 执行接口测试用例就是发送请求
  • 比对测试结果
  • 判断接口返回的响应结果的正确性
  • 落库检查
  • 判断数据库数据的正确性,涉及到数据库的检查操作

初始化数据库

pymysql简介

  • pymysql是连接和操作MySQL数据库的python库

安装pymysql

  • win+R键启动运行窗口输入cmd,启动dos命令行
  • 在命令行中,输入命令
pip install pymysql
  • 查看是否安装成功
pip list

自动化测试_数据库

pymysql使用步骤

  • 导入pymysql
import pymysql
  • 连接mysql数据库
conn = pymysql.connect(host='数据库服务器地址',db='数据库名',user='数据库用户名',passwd='数据库密码')
  • 连接数据库相当于把远程数据库上的某个数据库复制到本地内存对象中
  • 如果运行时没有任何错误提示,表示连接成功
  • 创建游标
cursor = conn.cursor()
  • 创建游标相当于在本地内存的数据库对象中创建一张将来储存数据的空表
  • 游标用于一行一行的处理结果接种的行数据
  • 指定sql语句
#  sql = 'sql删除外键主键约束的语句'
delete from info where id=4
cursor.execute(sql)
delete from users where id=4
cursor.execute(sql)
sql = "insert into users(id,username,password) values(4,'test333',md5('123456'))"#向主键表中插入数据
cursor.execute(sql)
sql = "insert into info(id,name) value(4,'成功登录用户')"#向主键表中插入数据
cursor.execute(sql)
  • sql语句必须是字符串类型,而且必须符合数据库的语法要求
  • sql语句末尾分号不是必须的
  • sql语句内部通常包含英文单引号,所以sql语句使用英文双引号定界
  • 执行sql语句
cursor.execute(sql)
  • 将sql语句的执行结果存入到游标中
  • execute()用于执行sql语句,pymysql不支持一次执行多个sql语句,可以一个sql后跟一句cursor.execute(sql)
  • 提交数据
conn.commit
  • 用于提交数据即保存数据到数据库服务器中
  • 若执行多个语句,只需要最后执行commit一次
  • 关闭数据库连接
conn.close()
  • 断开数据库连接,释放本机内存资源

练习1

'''
成功登录的用例是(test01、123456、成功登录用户).完成初始化数据库的代码人工检查数据库中的数据是否正确
'''
#导入pymysql
import pymysql
#连接MySQL数据库并定义变量接受连接对象
conn = pymysql.connect(host='39.106.148.204',user='root',password='123456',database='wa_test')
#创建游标
cursor = conn.cursor()
#指定sql语句
sql = 'delete from info where id=4'  #删除外键表数据
cursor.execute(sql)
sql = 'delete from users where id=4'  #删除主键数据
cursor.execute(sql)
sql = "insert into users(id,username,password) values(4,'test333',md5('123456'))"#向主键表中插入数据
cursor.execute(sql)
sql = "insert into info(id,name) value(4,'成功登录用户')"#向主键表中插入数据
cursor.execute(sql)
#提交数据
conn.commit()
# 断开数据库连接
conn.close()

执行一条测试用例

  • 对于接口测试
  • 执行接口测试用例等价于发送一个请求

发送请求的要点或步骤

  • 导入requests库
  • 选择请求方法
  • 指定接口地址
  • 指定请求参数
  • 发送请求,获取响应
  • 查看响应结果
  • 比对响应结果
  • 接口返回的值是实际结果,用例中有预期结果
  • 比对结果就是看实际结果和预期结果是否匹配

练习2

'''
执行成功注册的用例,输出响应结果,人工检查测试是否通过、数据库数据是否正确(执行多次)
接口地址:http://接口服务器IP地址/apitest/signup/
方法:POST
请求类型:Json字符串
参数:username、password、confirm、name
返回类型:json字符串
预期响应正文:{'Status':1000,'Result':'Success','Message':'注册成功'}
'''
import requests
import pymysql
#连接数据库
conn=pymysql.connect(host='39.106.148.204',user='root',password='123456',database='wa_test')
#创建游标
cursor=conn.cursor()
# 指定sql语句
sqls=["delete from info where id=4",
      "delete from users where id=4"
      # "insert into user(id,username,password) values(4,'test111',md5('123456')",
      # "insert into info(id,name) value(4,'成功注册用户')"
      ]
for sql in sqls:
    cursor.execute(sql)
#提交数据
conn.commit()
#关闭数据
conn.close()
# 指定接口地址
url='http://39.106.148.204/apitest/signup/'
# 指定请求数据
params={"username":"admin","password":"123456","confirm":"123456","name":"注册成功"}
# 发送请求
result = requests.post(url,json=params)
# 查看响应结果
print(result.json())
  • 执行接口测试用例就是发送请求
  • 发送请求时,接口地址、请求类型、参数、预期结果等都来源于测试用例
  • 测试用例是一句接口需求所写的,所有的工作都应该与需求保持一致
  • 执行用例之前,应该先做数据库初始化

比对响应结果

  • 比对响应结果就是判断接口返回值即响应结果的正确性
  • 使用==比对整个字典
  • 实际字典==预期字典
  • python支持使用==比较字典内容是否相等
  • 会忽略
  1. 键值对之间的空格
  2. 键与值之间的空格
  3. 键值对顺序
  4. 字符串的定界符(单引号、双引号、三引号)
  • 使用in判断实际结果中是否包含预期结果
  • 一般用于JSON和Text文本
  • 预期结果in实际结果

使用 == 进行断言

  • 一般使用 == 对字典进行比对
  • 借助if处理测试通过和失败的不同情况
  • 测试失败时,应该给出失败原因
  • 时刻注意,必须保证遵循测试的整体流程
  • 初始化数据库
  • 发送请求/执行测试用例
  • 获得实际结果和预期结果,比对测试结果
actual = result.json()
ecpect = {"Status":1000,"Result":"Usercheck ok","Mesage":"登录验证成功}
case_info = 'login001'+'__'+'测试登陆成功'
if actual = = expect:
	print(f'{case_info}==响应结果比对通过')
else:
	print(f"{case_info}==响应结果比对失败==预期结果:{expect},实际结果:{actual}")

例1

"""
执行成功注册的用例,输出响应结果,使用==检查是否通过
接口地址:http://接口服务器IP地址/apitest/signup/
方法:POST
请求类型:Json字符串
参数:username、password、confirm、name
返回类型:json字符串
预期响应正文:{'Status':1002,'Result':'Password is null','Message':'密码为空'}
"""
# 导入requests,pymysql
import requests
import pymysql
# 连接MySQL数据库并定义变量接收连接对象
conn =
pymysql.connect(host='39.104.25.201',user='root',password='123456',database='wa_
test')
# 创建游标
cursor = conn.cursor()
# 指定SQL语句
sqls = [
"delete from info where name='成功注册用户'",
"delete from users where username='test06'",
]
for sql in sqls:
cursor.execute(sql)
# 提交数据
conn.commit()
# 断开数据库连接
conn.close()
# 指定接口地址
url = 'http://39.104.25.201/apitest/signup/'
# 指定请求数据
args = {"username":"test06","password":"123456","confirm":"123456","name":"成功注
册用户"}
# 发送请求
result = requests.post(url=url,json=args)
# 方法1 : 使用 == 进行断言
actual = result.json() # 实际结果,dict 字典类型
expect = {"Status": 1000, "Result": "Success", "Message": "注册成功"}
case_info = 'signup001'+'__'+'测试注册成功' # 用例信息
if actual == expect:
print(f'{case_info}==响应结果比对通过')
else:
print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")
# 方法2: 使用in进行断言
expect = '注册成功'
actual = result.text # 实际结果
if expect in actual:
print(f'{case_info}==响应结果比对通过')
else:
print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")

落库检查

  • 也称为验库
  • 验库用于检查数据库数据的正确性
  • 用于增加、修改、删除数据库数据时

落库检查的步骤

  • 连接数据库
  • 创建游标
  • 指定查询实际结果的SQL语句
  • 获得SQL语句
  • 获取实际结果
db_actual = cursor.fetchone()
#获取游标中的第一行数据,存到元素db_actual中
  • 结果比对
  • 关闭数据库
'''
执行确认密码为空的用例,检查数据库数据是否正确
地址:http://接口服务器IP/apitest/signup/
方法:POST
请求类型:json字符串
参数:username、password、confirm、name
响应类型:json字符串
预期响应正文:{'Status': 1003, 'Result': 'Confirm password is null', 'Message': '注册失败,确认密码不能为空'}
'''
# 导入requests,pymysql
import requests
import pymysql
# 连接MySQL数据库并定义变量接收连接对象
conn = pymysql.connect(host='39.104.25.201',user='root',password='123456',database='wa_test')
# 创建游标
cursor = conn.cursor()
# 指定SQL语句
sqls = [
    "delete from info where name='确认密码为空'",
    "delete from users where username='test07'",
]
for sql in sqls:
    cursor.execute(sql)
# 提交数据
conn.commit()
# 断开数据库连接
conn.close()
# 指定接口地址
url = 'http://39.104.25.201/apitest/signup/'
# 指定请求数据
args = {"username":"test07","password":"123456","confirm":"","name":"确认密码为空"}
# 发送请求
result = requests.post(url=url,json=args)
# 方法1 : 使用 == 进行断言
actual = result.json() # 实际结果,dict 字典类型
expect = {'Status': 1003, 'Result': 'Confirm password is null', 'Message': '注册失败,确认密码不能为空'}
case_info = 'signup002'+'__'+'确认密码为空' # 用例信息
if actual == expect:
    print(f'{case_info}==响应结果比对通过')
else:
    print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")
# 方法2: 使用in进行断言
expect = '确认密码不能为空'
actual = result.text # 实际结果
if expect in actual:
    print(f'{case_info}==响应结果比对通过')
else:
    print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")
# 落库检查
# 连接MySQL数据库并定义变量接收连接对象
conn = pymysql.connect(host='39.104.25.201',user='root',password='123456',database='wa_test')
# 创建游标
cursor = conn.cursor()
# 指定SQL语句
sql = "select count(*),(select count(*) from info where name='确认密码为空') from users where username='test07' and password=md5('123456')"
cursor.execute(sql) # 执行落库SQL语句
db_actual = cursor.fetchone() # 获取数据库中实际结果
db_expect = (0,0)
tables = '(users,info)'
# 比对数据库数据结果
if db_actual==db_expect:
    print(f'{case_info}==验库通过')
else:
    print(f'{case_info}==验库失败==检查表{tables}中的数据{args},预期行数:{db_expect},实际行数:{db_actual}')
# 断开数据库连接
conn.close()

综合练习

创建apitest_linear_v1.py

版本1:线性测试模型,线性编码,执行一条登录成功用例,执行一条注册成功测试用例

  • 初始化数据库(实现这两条测试用例的初始化)
  • 把成功登录用例中的用例编号、用力标题、接口路径、参数、预期结果赋值存入一个列表中
  • 执行成功登录接口用例,比对测试结果
  • 把成功注册用例中的用例编号、用力标题、接口路径、参数、预期结果、验库表名、验库SQL、数据库预期行数赋值存入一个列表中
  • 执行成功注册接口用例,比对测试结果、验库
# 导入requests,pymysql
import requests, pymysql

# 数据初始化,造数
# 连接MySQL数据库
conn = pymysql.connect(host='39.104.25.201', user='root', password='123456', database='wa_test')
# 创建游标
cursor = conn.cursor()
# 指定SQL语句
sqls = [
    "delete from info where id=4",
    "delete from users where id=4",
    "insert into users(id,username,password) values(4,'test01',md5('123456'))",
    "insert into info(id,name) values(4,'成功登录用户')",
    "delete from info where name='成功注册用户'",
    "delete from users where username='test06'"
]
for sql in sqls:
    cursor.execute(sql)
# 提交数据
conn.commit()
# 断开数据库连接
conn.close()

# 协议、服务器地址、端口号
host = 'http://39.104.25.201'
# 编写接口测试用例
login_cases = ['login_001', '登录成功', '/apitest/login/', {"username": "test01", "password": "123456"},
         {"Status": 1000, "Result": "Usercheck ok", "Message": "登录验证成功"}]
case_id, case_title, path, args, expect = login_cases
# 接口地址:协议://服务器IP:端口号 + 接口路径
url = host + path
# 发送请求
result = requests.post(url=url, data=args)
# 获取实际结果,字典类型
actual = result.json()
# 用例信息: 用例编号:用例标题
case_info = case_id + ":" + case_title
# 比对测试结果
if actual == expect:
    print(f'{case_info}==响应结果比对通过')
else:
    print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")

# 注册接口测试用例
signup_cases = [
    'signup_01',
    '测试成功注册',
    '/apitest/signup/',
    {'username': 'test06', 'password': '123456', 'confirm': '123456', 'name': '成功注册用户'},
    {'Status': 1000, 'Result': 'Success', 'Message': '注册成功'},
    '(users, info)',
    "select count(*),(select count(*) from info where name='成功注册用户') from users where username='test06' and password=md5('123456')",
    (1, 1)
]
# 获取用例信息
case_id, case_title, path, args, expect, tables, check_sql, db_expect = signup_cases
# 用例信息: 用例编号:用例标题
case_info = case_id + ':' + case_title
# 接口地址
url = host + path
# 发送请求
result = requests.post(url=url, json=args)
# 获取实际响应结果
actual = result.json()
# 比对结果,实际结果与预期结果相比较
if actual == expect:
    print(f'{case_info}==响应结果比对通过')
else:
    print(f"{case_info}==响应结果比对失败==\n预期结果:{expect},\n实际结果:{actual}")

# 落库检查
# 连接MySQL数据库
conn = pymysql.connect(host='39.104.25.201', user='root', password='123456', database='wa_test')
# 创建游标
cursor = conn.cursor()
# 执行落库SQL语句 
cursor.execute(check_sql)
# 获取落库语句返回的实际结果
db_actual = cursor.fetchone()
# 比对数据库数据结果
if db_actual == db_expect:
    print(f'{case_info}==验库通过')
else:
    print(f'{case_info}==验库失败==检查表{tables}中的数据{args},预期行数:{db_expect},实际行数:{db_actual}')
# 断开数据库连接
conn.close()

读取文件

  • 读取文本文件
  • 打开文件读取数据
自定义文件名 = open("文件名","r","encoding='utf-8'")

此处对象是一个TextlOWrapper对象

open表示打开文件,文件名如果不存在当前目录下,需要指定路径

r表示读取数据(字符格式,换行符也是一个字符),r可省略

encoding用于设置文件字符编码格式,如果未报错,可省略

  • 用for循环从文件对象中遍历行
  • 关闭文件
自定义对象名.close()

练习1

'''
创建一个txt文件,手动写入多行,编写代码读文件并查看文件内容
文件内容如下
	python是一门编程语言
	python既可以用于开发,也可以用于自动化测试
	python可用于自动化单元测试、功能测试、接口测试等方向
'''
#创建。py文件编写代码读取文本文件内容
#读取text文件内容
file = open("wxx.text","r","encoding=utf-8")
#循环遍历file对象中的每一行
for row in file:
    #打印每一行的内容
    print(row,end='')
    #关闭文件
file.close()











【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  bzUvzvVq9oY1   2023年11月02日   29   0   0 数据类型json数据库
  20xfzlOvosRH   2023年12月05日   13   0   0 mysql数据库
  ltERVYe6WHLK   2023年11月02日   22   0   0 数据类型C#初始化
bzUvzvVq9oY1
最新推荐 更多