前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Django的电子商务网站开发(连载11)

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

作者头像
顾翔
发布2019-12-11 15:20:25
7850
发布2019-12-11 15:20:25
举报
4.接口测试

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

1)测试用例

表3-1为注册模块的测试用例,这里共设计了两个。

(1)注册一个数据库中已经存在的用户,系统应该提示“用户名已经存在!”。

(2)注册一个数据库中不存在的用户,系统应该注册成功,然后进入登录页面。

表3-1 注册模块的测试用例

编号

描述

期望结果

1

注册的用户名已经存在

有提示信息“用户名已经存在!”

2

注册的用户名不存在

注册成功,进入登录页面

2)XML数据文件

loginRegConfig.xml

<node> <case> <username>Johnson</username> <password>12345</password> <email>Johnson@126.com</eamil> </case> <case> <TestId>loginReg-testcase001</TestId> <Title>用户注册</Title> <Method>post</Method> <Desc>注册用户名已经存在</Desc> <Url>http://127.0.0.1:8000/register/</Url> <InptArg>{"username":"Johnson","password":"12345","email":"Johnson5@126.com"}</InptArg> <Result>200</Result> <CheckWord>用户名已经存在!</CheckWord><!--- 通过“注册用户名不存在”测试完毕删除数据库记录 --> </case> <case> <TestId>loginReg-testcase002</TestId> <Title>用户注册</Title> <Method>post</Method> <Desc>注册用户名不存在</Desc> <Url>http://127.0.0.1:8000/register/</Url> <InptArg>{"username":"smith","password":"12345","email":"smith@126.com"}</InptArg> <Result>200</Result> <CheckWord>登录</CheckWord> </case></node>

第一个<case >...</case>为测试代码所用的初始化信息。将通过测试程序中的setUp()中由Python语言的基础类sqlite3(注意,在这里不是通过Django提供的数据库操作模块)向数据库中插入记录,然后运行程序来进行测试,最后测试结束,需要在tearDown()方法中将这些记录进行删除。在后面所有模块测试代码中都采用这样的方法。

3)测试代码

为了今后方便,首先对一些方法进行封装。把本书第2.10.5节中getXML.py中的类GetXML封装在一个名为util.py的文件中,并且把头部的两行建立在这个类的构造方法中。

def __init__(self,myXmlFile): dom = minidom.parse(myXmlFile) self.root = dom.documentElement

这样,原先的getxmldata()方法就改造为

def getxmldata(self): #从XML中读取数据 TestIds = self.root.getElementsByTagName('TestId') Titles = self.root.getElementsByTagName('Title') Methods = self.root.getElementsByTagName('Method') Descs = self.root.getElementsByTagName('Desc') Urls = self.root.getElementsByTagName('Url') InptArgs = self.root.getElementsByTagName('InptArg') Results = self.root.getElementsByTagName('Result') CheckWords = self.root.getElementsByTagName('CheckWord') i = 0 mylists=[] for TestId in TestIds: mydicts={} #获取每一个数据,形成字典 mydicts["TestId"] = (TestIds[i].firstChild.data).strip() mydicts["Title"] = (Titles[i].firstChild.data).strip() mydicts["Method"] = (Methods[i].firstChild.data).strip() mydicts["Desc"] = (Descs[i].firstChild.data).strip() mydicts["Url"] = (Urls[i].firstChild.data).strip() mydicts["InptArg"] = (InptArgs[i].firstChild.data).strip() mydicts["Result"] = (Results[i].firstChild.data).strip() mydicts["CheckWord"] = (CheckWords[i].firstChild.data).strip() mylists.append(mydicts) i = i+1 return mylists

然后在这个类中获得User测试初始化信息的方法getUserInitInfo(),具体实现如下。

def getUserInitInfo(self):#从XML中读取数据 id = self.root.getElementsByTagName('id') id = (str(id[0].firstChild.data)).strip() username = self.root.getElementsByTagName('username') username = "\""+(str(username[0].firstChild.data)).strip()+"\"" password = self.root.getElementsByTagName('password') password = "\""+(str(password[0].firstChild.data)).strip()+"\"" email = self.root.getElementsByTagName('email') email = "\""+(str(email[0].firstChild.data)).strip()+"\"" values = id +","+username+","+password+","+email return values #返回的字符串values供插入数据库表good_user中使用

这里最后形成的字符串values为插入User表中SQL语句values后的内容。然后在这个文件中建立一个DB类,主要用于封装实现对数据库的操作,现在先来建立以下几个方法。

class DB: #构造方法,获得sqlite3数据库文件的位置 def __init__(self): self.url = "C:\\Python35\\Scripts\\ebusiness\\db.sqlite3" #连接数据库连接 def connect(self): self.con = con = sqlite3.connect(self.url) self.cur = self.con.cursor() #关闭数据库连接 def close(self): self.cur.close() self.con.close() #向tablename表中插入数据values def insert(self,tablename,values): sql = "insert into "+tablename+" values ("+values+")" self.con.execute(sql) self.con.commit() #在tablename表,删除满足condtion条件的记录 def delete(self,tablename,condition): sql = "delete from "+tablename+" where ("+condition+")" self.con.execute(sql) self.con.commit()

(1)方法__init__()用于初始化数据库。

(2)方法connect()用于连接数据库。

(3)方法close()用于关闭数据库的连接。

(4)方法insert()用于向数据库表中插入数据。

(5)方法delete()用于向数据库表中删除满足条件的数据。

最后来介绍用户注册模块的测试代码。

#!/usr/bin/env python#coding:utf-8import unittest,requestsfrom util import GetXML,DB class myregister(unittest.TestCase): def setUp(self): print("--------测试开始--------") #定义数据库表名 self.userTable = "goods_user" #建立GetXML对象变量 xmlInfo = GetXML("registerConfig.xml") #获得初始化信息 self.userValues = xmlInfo.getUserInitInfo() #建立DB对象变量 self.dataBase= DB() #连接数据库 self.dataBase.connect() #插入初始化数据库 self.dataBase.insert(self.userTable,self.userValues) #获得所有测试数据 self.mylists = xmlInfo.getxmldata() def test_register(self): for mylist in self.mylists: #获取传输参数 payload = eval(mylist["InptArg"]) #获取测试URL url=mylist["Url"] #发送请求 try: if mylist["Method"] == "post": data = requests.post(url,data=payload) elif mylist["Method"] == "get": data = requests.get(url,params=payload) else: print ("Method 参数获取错误") except Exception as e: self.assertEqual(mylist["Result"],"404") else: #验证返回码 self.assertEqual(mylist["Result"],str(data.status_code)) #验证返回文本 self.assertIn(mylist["CheckWord"],str(data.text)) def tearDown(self): #获取初始化数据库中的记录主码 id = self.userValues.split(',')[0] #删除这条记录 self.dataBase.delete(self.userTable,"id="+id) #关闭数据库连接 self.dataBase.close() print("--------测试结束--------") if __name__=='__main__': #构造测试集 suite=unittest.TestSuite() suite.addTest(myregister ("test_register")) #运行测试集合 runner=unittest.TextTestRunner() runner.run(suite)

(1)在setUp方法中。

① 先定义在这里用到的数据库表名为goods_user。

② 通过语句xmlInfo =GetXML("registerConfig.xml")从XML文件中读入测试初始化数据并且通过self.userValues = xmlInfo.getUserInitInfo()把它放到变量self.userValues中。

③ 建立数据库连接,通过语句self.dataBase.insert(self.userTable,self.userValues)向数据库中插入设置测试需要的初始化信息。

④ 通过语句self.mylists =xmlInfo.getxmldata()获得测试数据。

(2)在测试程序中。

①通过循环语句for mylist in self.mylists遍历所有的测试数据。

②通过语句payload = eval(mylist["InptArg"])获取测试参数以及url=mylist["Url"]获取测试执行路径。

③通过判断语句mylist["Method"]是post还是ge来调用data =requests.post(url,data=payload)或者data=requests.get(url,params=payload)。

④通过断言语句self.assertEqual(mylist["Result"],str(data.status_code))验证返回码是否正确。

⑤通过断言语句self.assertIn(mylist["CheckWord"],str(data.text))判断验证的字符串是否在返回的文本中。

(3)在tearDown方法中。

①通过语句id = self.userValues.split(',')[0]初始化数据库用户数据的主键。

②通过语句self.dataBase.delete(self.userTable,"id="+id)来删除这条测试数据。

③断开数据库连接,结束测试。

星云测试

http://www.threadingtest.com/

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

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

本文分享自 软件测试培训 微信公众号,前往查看

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

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

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