前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >相对复杂的接口测试

相对复杂的接口测试

作者头像
顾翔
发布2020-06-01 16:20:27
6460
发布2020-06-01 16:20:27
举报
文章被收录于专栏:啄木鸟软件测试

下面来看一下如何测试建立订单。先来看一下与订单相关的两个数据库,

•goods_orders。

一个用户下的所有的订单。包含创建时间、支付状态和送货地址编号。一个goods_orders包括多条goods_order记录。

•goods_order。

一个商品对应的单条订单。包含数量,商品编号,用户编号和表goods_orders的外键。

可见,建立一个订单与用户、商品和配货地址有关。在excel的第二sheet中建立商品信息(包括商品名、单价、图片名以及描述),在第三sheet中建立配货地址信息(包括配货地址和电话)。同样建立方法check_condition_for_order(),在这个方法中验证商品信息,地址信息是否在产品数据库中存在,如果不存在就用excel表中的数据建立。在这里建立一个购买三个商品的订单,商品的订单主键分别为1、2、3。

案例:生成订单的接口测试。

代码语言:javascript
复制
# 订单测试的数据准备
def check_condition_for_order(self):
# 获取Excel信息
username =self.get_user_data()[0]  # 创建订单的用户名
password =self.get_user_data()[1]  # 创建订单的用户名对应的密码
goods_name = self.get_goods_data()[0]  # 获取订单商品名称
goods_price = self.get_goods_data()[1]  # 获取订单商品单
goods_pic = self.get_goods_data()[2]  # 获取订单商品图片
goods_desc = self.get_goods_data()[3]  # 获取订单商品描述
address_name =self.get_address_data()[0]  # 获取订单地址信息
phone = self.get_address_data()[1]  # 获取订单地址对应的电话
# 检查订单用户是否存在
self.check_user_existence(username,password,1)
# 获取用户名对应的id
user_id = self.get_user_id(username)
# 查看id=1、id=2、id=3的商品信息是否存在,不存在自动建立
self.check_goods_for_order(goods_name,goods_price,goods_pic,goods_desc)
# 获取登录用户的一个配货地址id
address_id = self.get_user_addess_id(user_id,address_name,phone)
return{"username":username,"password":password,"address_id":address_id,"user_id":user_id}

其中get_user_id(username)获取当前和用户的id号。

代码语言:javascript
复制
# 获取当前用户的id号
def get_user_id(self,username):
db =DB()
db.connect()
condition = "username='"+username+"'"
results =db.searchByCondition("goods_user",condition)
for result in results:
user_id = result[0]
break
db.close()
return user_id

check_goods_for_order(goods_name,goods_price,goods_pic,goods_desc),检查是否存在id为1、2、3的商品信息,如果没有,就用excel表中的数据(goods_price,goods_pic,goods_desc来自excel表)。

代码语言:javascript
复制
# 查看id=1、id=2、id=3的商品信息是否存在
defcheck_goods_for_order(self,goods_name,price,picture,dec):
db =DB()
db.connect()
for i in range(3):
result =db.searchById("goods_goods",str(i+1))
if len(list(result))==0:
value =(str(i+1)+",'"+goods_name+"','"+price+"','upload/"+picture+"','"+dec+"'")
print("商品信息'"+goods_name+"'由于数据问题由测试程序自动生成的数据")
db.insert("goods_goods",value)
db.close()

get_user_addess_id获得用户的配货地址信息,如果这个用户没有配货信息,用excel里的地址信息建立(address_name,phone来自excel表)。

代码语言:javascript
复制
# 获取当前用户有没有送货地址id
defget_user_addess_id(self,user_id,address_name,phone):
db =DB()
db.connect()
address_id=""
condition = "user_id ="+str(user_id)
results =db.searchByCondition("goods_address",condition)
if len(list(results))==0:
value ="'"+address_name+"','"+phone+"',"+str(user_id)
db.insert("goods_address(address,phone,user_id)",value)
print("地址信息'"+address_name+"'由于数据问题由测试程序自动生成的数据")
condition = "user_id ="+str(user_id)
results =db.searchByCondition("goods_address",condition)
else:
results =db.searchByCondition("goods_address",condition)
for result in results:
address_id = result[0]
break
db.close()
return address_id

特别提醒,如果是测试程序建立的数据,应该通过print语句输出提示信息。方法check_condition_for_order(self)返回用户名、密码、用户编号和配送地址编号给测试程序。

代码语言:javascript
复制
# 检查创建订单
def test_create_order(self):
# 初始化订单测试数据
info =self.myutil.check_condition_for_order()
mysession = requests.Session()  # 关联session对象建立
#用户登录参数
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
# 模拟用户登录
data =mysession.post(self.url_product,data=payload,cookies=self.cookie)
# 创建订单参数
payload={"address":info["address_id"],"csrfmiddlewaretoken":self.token}
# 创建产品id,分别为id=1、id=2、id=3号
self.cookie.update({"1":"1","2":"2","3":"3"})
# 创建订单
data =mysession.post(self.url_craete_order,data=payload,cookies=self.cookie) 
# 验证返回码
self.assertEqual("200",str(data.status_code))
# 验证返回内容
self.assertIn("生成时间",str(data.text))
# 验证完毕删除订单
self.myutil.delete_order(info["user_id"])

建立订单首先要登录系统,requests类通过Session()方法来建立会话状态信息,定义之后,必须先建立一个对登录url的接口访问,即语句data = mysession.post(self.url_product,data=payload,cookies=self.cookie)。建立订单post参数里面包括配货地址号以及csrf token;cookies中除了有cserftoken,还有订单的商品id,{"1":"1","2":"2","3":"3"}表示订单中第一条商品id为1、第二条商品id为2以及第三条商品id为3。最后注意:由于这个订单是测试程序创建的,所以验证完毕后,必须删除,不要在产品数据库中留下垃圾数据。

案例:删除订单的接口测试。

代码语言:javascript
复制
# 删除订单
def delete_order(self,user_id):
db =DB()
db.connect()
# 通过user_id,good_id查询order
results =db.searchByCondition("goods_order","user_id="+str(user_id)+"and goods_id=1")
for result in results:
order_id = result[4]
break
# 删除分订单
db.deleteByCondition("goods_order","order_id="+str(order_id))
# 删除总订单
db.deleteById("goods_orders",str(order_id))
db.close()

书写完了建立订单的测试代码,再来看看删除订单的测试代码。删除订单首先要建立订单,建立订单之前仍旧需要检查订单数据的有效性,有了前面测试用例的封装,有些代码就可以复用了。在这里先来展示测试代码。

代码语言:javascript
复制
# 检查删除订单
def test_delete_order(self):
# 初始化订单测试数据
info =self.myutil.check_condition_for_order()
# 建立订单
orders_id =self.myutil.create_order(info["address_id"],info["user_id"])
# 关联session对象建立
mysession = requests.Session()
# 用户登录参数
payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
# 模拟用户登录
data =mysession.post(self.url_product,data=payload,cookies=self.cookie)
# 创建订单参数
payload={"address":info["address_id"],"csrfmiddlewaretoken":self.token}
# 创建产品id,分别为id=1、id=2、id=3号
self.cookie.update({"1":"1","2":"2","3":"3"})
# 创建订单
data =mysession.post(self.url_deleted_order+str(orders_id)+"/3/",data=payload,cookies=self.cookie)
# 验证返回码
self.assertEqual("200",str(data.status_code))
# 验证返回内容
self.assertNotIn("删除",str(data.text))

check_condition_for_order()仍旧可以使用,然后使用数据库建立订单数据。

代码语言:javascript
复制
# 生成订单
defcreate_order(self,address_id,user_id):
db =DB()
db.connect()
# 建立orders
field="(create_time,status,address_id)"
values = "'"+time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))+"','0',"+str(address_id)
db.insert("goods_orders"+field,values)
# 获取刚建立订单的id号
results =db.searchByCondition("goods_orders","address_id="+str(address_id))
for result in results:
orders_id = result[0]
break
# 建立order
field="(count,goods_id,user_id,order_id)"
values ="1,1,"+str(user_id)+","+str(orders_id)
db.insert("goods_order"+field,values)
# 获取刚建orders的id号
results =db.searchByCondition("goods_order","order_id="+str(orders_id))
for result in results:
orders_id = result[0]
break
db.close()
return(orders_id)

最后就可以测试订单删除功能了。

由此可见测试数据可以通过类似于Excel、XML或者测试数据的数据库来维护,也可以调用API来实时创建。对于Excel、XML或者测试数据数据库为in-of-box:开箱即用数据,需要实现准备,适合于一些静态的数据,比如用户、产品、配货地址;而对于调用API来实时创建为on-the-fly:实时使用数据,适合于一些相对动态的数据,比如订单。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档