基於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