接口测试数据引发的接口测试代码改进(二)

发表于:2019-5-22 10:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:顾翔    来源:51Testing软件测试网原创

  第五阶段:进一步优化
  第四阶段代码进行进一步的优化并且把测试代码对数据校验的代码在util.py中建立方法check_condition_for_user,代码如下。
   #用户测试的数据准备
  def check_condition_for_user(self,flag):
  #初始化变量
  username =""
  password =""
  #根据flag标签提供不同的测试数据
  if flag==0:
  username =self.get_user_data()[2]
  password =self.get_user_data()[1]
  elif flag==1:
  username =self.get_user_data()[0]
  password =self.get_user_data()[3]
  elif flag==2:
  username =self.get_user_data()[2]
  password =self.get_user_data()[3]
  elif flag==3:
  username =self.get_user_data()[0]
  password =self.get_user_data()[1]
  else:
  print ("方法check_condition_for_user的flag输入参数为0、1、2、3")
  return ""#flag参数不对返回空字符串
  #检查用户是否存在
  if flag==3:
  self.check_user_existence(username,password,1)
  else:
  self.check_user_existence(username,password,0)
  return {"username":username,"password":password}#把用户名,密码返回
  测试代码简化为。
   #正确的用户名,错误的密码
  #登录之前,确保数据库中没有这条数据
  def test_correctusername_discorrectpassword(self):
  info = self.myutil.check_condition_for_user(0)
  if not info=="":
  payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
  data = requests.post(self.url_product,data=payload,cookies=self.cookie)
  #验证返回码
  self.assertEqual("200",str(data.status_code))
  #验证返回内容
  self.assertIn("用户名或者密码错误",str(data.text))
  #错误的用户名,正确的密码
  def test_discorrectusername_correctpassword(self):
  info = self.myutil.check_condition_for_user(1)
  if not info=="":
  payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
  data = requests.post(self.url_product,data=payload,cookies=self.cookie)
  #验证返回码
  self.assertEqual("200",str(data.status_code))
  #验证返回内容
  self.assertIn("用户名或者密码错误" ,str(data.text))
  def test_discorrectusername_discorrectpassword(self):
  #错误的用户名,错误的密码
  info = self.myutil.check_condition_for_user(2)
  if not info=="":
  payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
  data = requests.post(self.url_product,data=payload,cookies=self.cookie)
  #验证返回码
  self.assertEqual("200",str(data.status_code))
  #验证返回内容
  self.assertIn("用户名或者密码错误",str(data.text))
  #正确的用户名,正确的密码
  def test_correctusername_correctpassword(self):
  info = self.myutil.check_condition_for_user(3)
  if not info=="":
  payload={"username":info["username"],"password":info["password"],"csrfmiddlewaretoken":self.token}
  data = requests.post(self.url_product,data=payload,cookies=self.cookie)
  #验证返回码
  self.assertEqual("200",str(data.status_code))
  #验证返回内容
  self.assertIn("电子商务系统" ,str(data.text))
  下面来看一下如何测试建立订单。先来看一下订单相关的数据库表。
  ●goods_orders:一个用户下的所有的订单。包含创建时间、支付状态和送货地址编号。
  ●goods_order:一个商品对应的订单。包含数量,商品编号,用户编号和表goods_orders的外键。
  可见,建立一个订单与用户、商品、配货地址有关。在excel的第二sheet中建立商品信息(包括商品名、单价、图片名以及描述)、在第二sheet中建立配货地址信息(包括配货地址和电话)。同样建立方法check_condition_for_order(),验证商品信息,地址信息是否在产品数据库中存在,如果不存在就用excel表中的数据建立。在这里建立一个购买三个商品的订单,订单编号分别为1、2、3。
   #订单测试的数据准备
  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号。
   #获取当前用户的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表)。
  #查看id=1、id=2、id=3的商品信息是否存在
  def check_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表)。
   #获取当前用户有没有送货地址id
  def get_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)返回用户名、密码、用户编号、和配送地址编号给测试程序。
   #检查创建订单
  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}#创建订单参数
  self.cookie.update({"1":"1","2":"2","3":"3"})#创建产品id,分别为id=1、id=2、id=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。最后注意,由于这个订单式测试程序创建的,所以验证完毕,注意删除,不要在产品数据库中留下垃圾数据。
   #删除订单
  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()
  书写完了建立订单的操作,看看删除订单的测试代码。删除订单首先要建立订单,建立订单之前仍旧需要检查订单数据的有效性,有了前面测试用例的封装,有些代码就可以复用了。在这里先展示测试代码。
   #检查删除订单
  def test_delete_order(self):
  #初始化订单测试数据
  info = self.myutil.check_condition_for_order()
  #建立订单
  orders_id = self.myutil.create_order(info["address_id"],info["user_id"])
  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}#创建订单参数
  self.cookie.update({"1":"1","2":"2","3":"3"})#创建产品id,分别为id=1、id=2、id=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()仍旧可以使用,然后使用数据库建立订单数据。
   #生成订单
  def create_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)
  #获取刚建ordes的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)
  最后测试删除url代码。

       版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号