专栏首页用户6517667的专栏基于Django的电子商务网站开发(连载33)

基于Django的电子商务网站开发(连载33)

新年加入啄木鸟公众号,好运滚滚來!

顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,

主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

3. 模板

{% extends "base.html" %}{% block content %} </ul> <ul class="nav navbar-nav navbar-right"> <li><a href="/user_info/">{{user}}</a></li> <li><a href="/logout/">退出</a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div class="container theme-showcase" role="main"> <div> <div id="navbar" class="navbar-collapse collapse"> </div><!--/.navbar-collapse --> </div> <p>生成时间:{{orders.create_time}} 配货地址:{{address}}总价钱:¥{{prices}}</p> <div> <div> <table class="table table-striped"> <thead> <tr> <th>编号</th> <th>商品名称</th> <th>商品价钱</th> <th>个数</th> <th>删除</th> </tr> </thead> <tbody> {% for key in order %} <tr> <td><a href="/view_goods/{{key.good_id}}/">{{ key.id }}</a></td> <td>{{ key.name }}</td> <td>¥{{ key.price }}</td> <td>{{ key.count }}</td> <td><a href="/delete_orders/{{key.id}}/3/">删除</a></td> </tr> {% endfor %} </tbody> </table> <input type="submit" value="支付"> </div> </div>{% endblock %}

总订单信息通过<p>生成时间:{{orders.create_time}} 配货地址:{{address}} 总价钱:¥{{prices}}</p>显示订单信息,通过{%for key in order %}遍历显示。如图3-19所示。

图3-19 显示当前生成的订单

4. 接口测试

1)测试用例

表3-15为生成订单的测试用例,这个订单仅包含一个订单。测试程序通过初始化一个订单数据和对应的总订单数据,形成一个订单和对应的总订单,验证是否可以正确地被显示出来。

表3-15 生成一个订单的测试用例

编号

描述

期望结果

1

生成并且显示当前用户的一个订单

生成并且正确地被显示

2)XML数据文件

首先在initInfo.xml建立订单信息。

<!--- 初始化总订单信息 --> <case> <ordersid>0</ordersid><!--- 总订单id --> <createtime>Sept. 8, 2017, 6:29 a.m.</createtime><!--- 总订单产生日期 --> <status>1</status><!--- 这里必须设置为1,表示已支付,与测试代码区别 --> <ordersaddressid>0</ordersaddressid><!--- 地址id,与初始化地址id保持一致 --> </case><!--- 初始化单个订单信息 --> <case> <orderid>0</orderid><!--- 单个订单id --> <count>9999</count><!--- 单个订单数量,这里必填9999 ,与测试代码区别--> <ordergoodid>0</ordergoodid><!--- 商品id,与初始化商品id保持一致 --> <orderorderid>0</orderorderid><!--- 总订单id,与初始化总订单id保持一致 --> <orderuserid>0</orderuserid><!--- 用户id,与初始化用户id保持一致 --> </case></node>

由于在这里要使用到cookie,所以在测试程序开始要通过程序代码来向购物车中添加一个商品。这里的测试用例与购物车的测试用例第一条是一样的。建立测试配置文件orderConfig.xml。

<?xml version="1.0" encoding="UTF-8"?><node> <case> <login>1</login> </case> <!--- 添加进购物车,查看显示购物车内商品数量的变化 --> <case> <TestId>order-testcase001</TestId> <Title>购物车</Title> <Method>get</Method> <Desc>添加进购物车</Desc> <Url>http://127.0.0.1:8000/add_chart/0/1/</Url> <InptArg></InptArg> <Result>200</Result> <CheckWord>查看购物车&lt;font color=&quot;#FF0000&quot;&gt;1&lt;/font&gt;&lt;/a&gt;</CheckWord><!--- 显示添加成功 --> </case> <!--- 生成并且显示当前用户的一个订单 --> <case> <TestId>order-testcase002</TestId> <Title>订单信息</Title> <Method>post</Method> <Desc>生成并且显示当前用户的一个订单</Desc> <Url>http://127.0.0.1:8000/create_order/</Url> <InptArg>{"address":"0"}</InptArg> <Result>200</Result> <CheckWord>1234.56</CheckWord><!--- 检查单个订单中的价格信息是否正确显示,order-testcase002必须为建立订单 --> </case>

3)测试代码

orderTest.py

#!/usr/bin/env python#coding:utf-8import unittest,requestsfrom util import GetXML,DB,Util class orderTest(unittest.TestCase): def setUp(self): print("--------测试开始--------") xmlfile = "orderConfig.xml" #建立GetXML对象变量 xmlInfo = GetXML() #获得是否需要登录的信息 self.sign = xmlInfo.getIsLogin(xmlfile) #获得所有测试数据 self.mylists = xmlInfo.getxmldata(xmlfile) #建立DB变量 self.dataBase = DB() #建立util变量 self.util =Util() #初始化用户记录 self.userTable = "goods_user" self.userValues = self.util.inivalue(self.dataBase,self.userTable,"0") #初始化商品记录 self.goodTable = "goods_goods" self.goodValues = self.util.inivalue(self.dataBase,self.goodTable,"1") #初始化地址记录 self.addressTable = "goods_address" self.addressValues = self.util.inivalue(self.dataBase,self.addressTable,"2") #初始化总订单记录 self.ordersTable = "goods_orders" self.ordersValues = self.util.inivalue(self.dataBase,self.ordersTable,"3") #初始化订单记录 self.orderTable = "goods_order" self.orderValues = self.util.inivalue(self.dataBase,self.orderTable,"4") #开始测试 def test_order_info(self): for mylist in self.mylists: data = self.util.run_test(mylist,self.userValues,self.sign) #验证返回码 self.assertEqual(mylist["Result"],str(data.status_code)) #验证返回文本 #如果mylist["CheckWord"]标签中存在"NOT"字符串,调用断言方法assertNotIn() if "NOT" in mylist["CheckWord"]: self.assertNotIn((mylist["CheckWord"]).split(",")[1],str(data.text)) #建立单独订单记录self.util.insertTable(self.dataBase,self.ordersTable,self.ordersValues) #建立总订单记录self.util.insertTable(self.dataBase,self.orderTable,self.orderValues) #否则调用断言方法assertIn() else: self.assertIn(mylist["CheckWord"],str(data.text)) #如果是验证查看全部订单,测试完毕把测试数据删除if "view_all_order" in mylist["Url"]: self.dataBase.delete(self.ordersTable,"status='0'") self.dataBase.delete(self.orderTable,"count=1") print (mylist["TestId"]+" is passsing!") def tearDown(self): #删除setup建立的单个订单 self.util.tearDown(self.dataBase,self.orderTable,self.orderValues) #删除setup建立的总订单 self.util.tearDown(self.dataBase,self.ordersTable,self.ordersValues) #删除setup建立的地址 self.util.tearDown(self.dataBase,self.addressTable,self.addressValues) #删除setup建立的商品 self.util.tearDown(self.dataBase,self.goodTable,self.goodValues) #删除setup建立的用户 self.util.tearDown(self.dataBase,self.userTable,self.userValues) #关闭数据库连接 self.dataBase.close() print("--------测试结束--------") if __name__=='__main__': #构造测试集 suite=unittest.TestSuite() suite.addTest(orderTest("test_order_info")) #运行测试集合 runner=unittest.TextTestRunner() runner.run(suite)

由于在这里用户、商品、收货地址、单个订单和总订单信息都要用到,所以在Setup()方法中都要进行初始化。由于测试用例order-testcase003必须要用到order-testcase002建立的测试记录,所以在order-testcase003后删除order-testcase002建立的测试数据。(读者也可以考虑如何将这两个测试用例分开,使得互相独立。)

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

本文分享自微信公众号 - 软件测试培训(iTestTrain),作者:顾翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Django的电子商务网站开发(连载16)

    (1)通过循环语句formylist in self.mylists:遍历所有测试用例。

    小老鼠
  • 基于Django的电子商务网站开发(连载17)

    接下来再对测试程序以及配置文件进行优化,把loginConfig.xml和registerConfig.xml这两个文件进行合并,形成loginRegConfi...

    小老鼠
  • 基于Django的电子商务网站开发(连载11)

    在这里就测试方法上对本书第2.10节的基础上进行了一些优化,优化的方法主要是通过利用Python对数据库的访问以及接口测试相结合的方法来进行相应的测试。

    小老鼠
  • python实现队列

    队列是一种先进先出的数据类型,它的跟踪原理类似于在超市收银处排队,队列里的的第一个人首先接受服务,新的元素通过入队的方式添加到队列的末尾,而出队就是将队列的头元...

    一墨编程学习
  • PyQt5 非模态对话框(live 型)

    本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动...

    用户6021899
  • Pyqt 主窗口(QMainWindow)简介

    下面我写了一个简单的例子,只实现了极少数的功能,仅供参考。后续会详细介绍主窗口(QMainWindow)程序各个部分的写法。推荐在浏览器中打开并横屏查看代码。

    用户6021899
  • PyQt 中心窗口、停靠窗口和状态栏

    self.setCentralWidget(widget)#self是主窗口子类的实例

    用户6021899
  • 支持python语法高亮的文本编辑器

    本例中创建的窗口部件支持Rich文本的编辑,并且支持语法高亮(基于QSyntaxHighlighter)。

    用户6021899
  • 基于图形项的弹性节点程序

    本例原是PyQt4版本的官方demo 程序,现已改成了PyQt5版本。程序可响应用户的键盘操作,如方向键,“+”,“-”键和空格键,以及鼠标拖放和滚轮操作。其功...

    用户6021899
  • 基于图形项的复杂形状和动画--千足虫

    在本篇中,会看到利用图形项来绘制复杂形状和动画,模拟“千足虫”的运动和消亡过程。程序有一个内部的定时器,在没段时间间隙中,这些千足虫都在不停的移动。如果它们的头...

    用户6021899

扫码关注云+社区

领取腾讯云代金券