相对复杂的接口测试

2020-06-01 16:20:27 浏览数 (1)

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

•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:实时使用数据,适合于一些相对动态的数据,比如订单。

0 人点赞