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

  • 2019 年 12 月 11 日
  • 笔记

接口测试

1)测试用例

表3-2为用户信息显示模块的测试用例。测试程序测试产品代码是否能够将当前登录用户的用户信息正确地被显示出来。

表3-2 用户信息显示模块测试用例

编号

描述

期望结果

1

显示当前登录用户的信息

用户信息正确地被显示

2)测试代码及优化

在这里将对测试代码进行进一步地封装及优化,这样可以使得以后的测试代码维护变得更加的简单和灵活。在这个系统的所有测试用例中,均要先在数据库里建立一个新用户,然后用这个建立的用户进行操作,最后在测试结束的时候,删除这个用户。所以这个用户的信息专门建立一个XML文件,命名为initInfo.xml,内容如下。

<?xml version="1.0" encoding="UTF-8"?><node> <case> <!— 初始化用户信息 –> <id>0</id><!— 用户id –> <username>Johnson</username><!— 用户名称 –> <password>000000</password><!— 用户密码 –> <email>[email protected]</email><!— Email地址 –> </case></node>

其中。

(1)<id>与</id>间的数字为建立用户的id,由于Django后台主键自增变量默认是从1开始的,所以在这里赋值为0,以避免冲突。

(2)<username>与</username>间的字符串是建立用户的用户名。

(3)<password>与</password>间的字符串是建立用户的密码。

(4)<email>与</email>间的字符串是建立用户的Email地址。

建立测试项目中的interface/util.py。在interface/util.py中,GetXML类及getxmldata()方法改造为。

#!/usr/bin/env python#coding:utf-8import sqlite3,requestsfrom xml.dom import minidom class GetXML: #获取xml中的数据 def getxmldata(self,myXmlFile): dom = minidom.parse(myXmlFile) self.root = dom.documentElement #从XML中读取数据 TestIds = self.root.getElementsByTagName('TestId')…

然后重新来定义getUserInitInfo()方法,如下。

#获取initInfo中的初始化用户初始化数据 def getUserInitInfo(self): dom = minidom.parse("initInfo.xml") self.root = dom.documentElement #从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供插入数据库表goos_user中使用

userInfoConfig.xml中的内容为。

<? xml version="1.0" encoding="UTF-8"?><node> <case> <login>1</login> </case> <!— 显示用户信息 –> <case> <TestId>userInfo-testcase001</TestId> <Title>用户的显示</Title> <Method>get</Method> <Desc>显示用户信息</Desc> <Url>http://127.0.0.1:8000/user_info/</Url> <InptArg></InptArg> <Result>200</Result> <CheckWord>Johnson</CheckWord><!— 初始化文件中的用户名 –> </case> </node>

其中<login>1</login>中的1表示需要登录后再操作,0表示不需要登录后再操作,所以如果表示不需要登录后再操作(比如用户注册和登录),可以使用<login>0</login>来表示。在用户信息显示中,程序必须先登录,才能够查看登录用户的信息,根据views.py中控制,页面将会自动跳转到login页面,并且系统会给出“请登录后再进入”的错误提示信息。

…util = Util() username = util.check_user(request) if username=="": uf = LoginForm() return render(request,"index.html",{'uf':uf,"error":"请登录后再进入"}) else:…

然后在interface/util.py中建立一个名为getIsLogin()的方法,作用是获取测试XML文件中是否需要登录的信息,内容如下。

…#获取测试XML文件中是否需要登录的信息 def getIsLogin(self,myXmlFile): dom = minidom.parse(myXmlFile) self.root = dom.documentElement #从XML中读取数据 login = self.root.getElementsByTagName('login') login = (str(login[0].firstChild.data)).strip() return login…

现在建立测试代码loginTest.py,首先来介绍setUp()方法。

…class userTest(unittest.TestCase): def setUp(self): print("——–测试开始——–") xmlfile = "userInfoConfig.xml" #建立GetXML对象变量 xmlInfo = GetXML() #获得是否需要登录的信息 self.sign = xmlInfo.getIsLogin(xmlfile) #获得所有测试数据 self.mylists = xmlInfo.getxmldata(xmlfile) #定义数据库表名 self.userTable = "goods_user" #获得初始化信息 self.userValues = xmlInfo.getUserInitInfo() #建立DB对象变量 self.dataBase = DB() #连接数据库 self.dataBase.connect() #插入测试所需要的用户 self.dataBase.insert(self.userTable, self.userValues)…

(1)通过语句xmlfile= "userInfoConfig.xml"定义数据驱动所读取的测试初始化信息所在的XML文件名。

(2)通过语句xmlInfo= GetXML()从XML文件中获取测试初始化信息。

(3)通过语句self.sign= xmlInfo.getIsLogin(xmlfile)用于获取测试是否需要登录操作,把它赋值给变量self.sign(0为不用登录,1为需要登录)。

(4)通过语句self.mylists= xmlInfo.getxmldata(xmlfile) 用于获取所有测试数据,把它赋值给变量self.mylists,在测试方法中使用。

(5)通过语句self.userTable= "goods_user"定义用户数据库表名。

(6)通过语句self.userValues= xmlInfo.getUserInitInfo()获得初始化数据库信息。

(7)建立数据库,把用户信息插入到数据库中。

在这里把数据库的操作进行封装,interface/util.py中的Util类中定义一个名为insertTable()的方法。

#插入数据#dataBase为数据库#table为数据库 #values为值 def insertTable(dataBase,table,values): #连接数据库 dataBase.connect() #插入测试所需要的数据 dataBase.insert(table,values)

接下来优化通过requests来执行接口测试的方法。在interface/util.py中的Util类中定义一个run_test()方法,代码如下。

#运行测试接口 # mylist测试数据 # values登录数据 def run_test(mylist,values,sign): #初始化requests.Session变量 s = requests.Session() #获取登录数据 username = values.split(',')[1].strip(""") password = values.split(',')[2].strip(""") #获取测试URL Login_url = "http://127.0.0.1:8000/login_action/" #login_Url为登录的URL run_url = mylist["Url"] #run_url为运行测试用例所需的URL #判断当前测试是否需要登录 if sign: #使用当前用户登录系统 payload ={"username":username,"password":password} try: data = s.post(Login_url,data=payload) except Exception as e: print(e) #运行测试接口 try: #为POST请求,由于POST请求参数是肯定存在的,所以在这里不判断有无参数 if mylist["Method"] == "post": payload = eval(mylist["InptArg"]) data = s.post(run_url,data=payload) #为GET请求,需要判断有无参数 elif mylist["Method"] == "get": if mylist["InptArg"].strip()=="": #没有请求参数 data = s.get(run_url) else: #有请求参数 payload = eval(mylist["InptArg"]) data = s.get(run_url,params=payload) except Exception as e: print(e) else: return data

(1)通过语句s =requests.Session()初始化requests.Session变量。

(2)获取接口测试如果需要登录,在初始化设置中设置的登录用户名和密码,对应代码为username = values.split(',')[1].strip(""")和password =values.split(',')[2].strip(""")。

(3)设置运行路径run_url= mylist["Url"]和登录路径Login_url = "http://127.0.0.1:8000/login_action/"。

(4)通过标记sign来判断是否需要登录,如果需要登录,调用payload={"username":username,"password":password}以及data =s.post(Login_url,data=payload)语句,然后正式进入接口测试环节。

(5)通过判断语句ifmylist["Method"] == "post":来判断请求为POST方法,调用payload= eval(mylist["InptArg"])与data =s.post(run_url,data=payload)语句。

(6)否则,请求方式为GET,分别来处理有参数与没有参数两种情形。

①当有参数的时候调用 payload= eval(mylist["InptArg"])和data =s.get(run_url,params=payload)语句,

②当有没有参数的时候调用data = s.get(run_url)语句。

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net