rf用例~~~系統中已經有班級
阿新 • • 發佈:2018-12-01
完成用例3:
程式碼:
*** Settings ***
Library pylib.SchoolClassLib
Suite Setup add_school_class 1 1班 60
程式碼:
*** Settings *** Library pylib.SchoolClassLib *** Test Cases *** 新增班級2 - tc000002 ${ret1}= add school class 1 2班 60 should be true $ret1['retcode']==0 #列出班級,和新增的班級檢驗一下,id一致,邀請碼一致 ${ret2}= list school class 1 should be true {'name': '2班', 'grade__name': '七年級', 'invitecode': $ret1['invitecode'], 'studentlimit': 60, 'studentnumber': 0, 'id': $ret1['id'], 'teacherlist': []}in $ret2['retlist'] #列出班級的響應是這樣的:(見圖文件規定) #rf的寫法實在不是容易的事情,rf不擅長處理複雜的資料,不能換行。 #最好是通過其他的方法來實現 [Teardown] delete_school_class &{ret1}[id] #&{ret1}是新增課程產生的字典,取出id刪掉 #第二種簡單,方便,基於py的寫法,用關鍵字實現。 新增班級2 - tc000002 ${ret1}= add school class 1 2班 60 should be true $ret1['retcode']==0 ${ret2}= list school class 1 ${retlist}= evaluate $ret2['retlist'] #把響應裡面的retlist取出來,賦值到變數裡面 classlist should contain ${retlist} ... 2班 七年級 &{ret1}[invitecode] 60 0 &{ret1}[id] #...是換行,後面傳的都是引數,$ret1['invitecode']不是py表示式,所以裡面不能加引號,從字典裡面取資料用& #實現一個關鍵字,判斷${retlist}裡面是否包含2班,七年級。。。這些內容。 [Teardown] delete_school_class &{ret1}[id] #&{ret1}是新增課程產生的字典,取出id刪掉
程式碼:
import requests from cfg import g_vcode from pprint import pprint class SchoolClassLib: #通常用類實現關鍵字型檔,類名和檔名相同 URL = "http://ci.ytesting.com/api/3school/school_classes" #可以寫在類的靜態屬性裡面,也可以寫在cfg的變數檔案裡面 def __init__(self): #定義一個初始化方法 self.vcode = g_vcode #也可以直接用全域性的變數g_vcode def set_vcode(self,vcode): self.vcode = vcode def delete_school_class(self,classid): #刪除班級 payload = { 'vcode' : self.vcode, } url = '{}/{}'.format(self.URL,classid) #url加上id,這裡是這樣構建一下 response = requests.delete(url,data=payload) return response.json() def list_school_class(self,gradeid=None): #列出班級 if gradeid != None: #gradeid是可填可不填的,預設是none params = { #如果傳gradeid 'vcode':self.vcode, 'action':'list_classes_by_schoolgrade', 'gradeid':int(gradeid) } else: params = { 'vcode':self.vcode, #如果不傳 'action':'list_classes_by_schoolgrade' } response = requests.get(self.URL,params=params) #params就是url請求的引數 bodyDict = response.json() #文件裡規定響應是json格式的訊息體。.json可以把json字串轉化為py中的物件。得到的是一個字典 pprint (bodyDict,indent=2) #indent引數就是指定pprint打印出來的引數是兩個 return bodyDict def add_school_class(self,gradeid,name,studentlimit): #新增班級 payload = { 'vcode' : self.vcode, 'action' : 'add', 'grade' : int(gradeid), 'name' : name, 'studentlimit' : int(studentlimit), } response = requests.post(self.URL,data=payload) bodyDict = response.json() pprint (bodyDict,indent=2) return bodyDict def delete_all_school_classes(self): #初始化清除,要刪除所有的用例 # 先列出所有班級 rd = self.list_school_class() pprint(rd, indent=2) # 刪除列出的所有班級 for one in rd['retlist']: #文件裡面“retlist”:[{},{}] {}裡面是一個個班級,id也在裡面 self.delete_school_class(one['id']) #獲取到id,傳給delete #再列出所有班級 rd = self.list_school_class() pprint (rd,indent=2) # 如果沒有刪除乾淨,通過異常報錯給RF # 參考http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#reporting-keyword-status if rd['retlist'] != []: raise Exception("cannot delete all school classes!!") def classlist_should_contain(self, classlist, classname, gradename, invitecode, studentlimit, studentnumber, classid): item = { "name":classname, "grade__name":gradename, "invitecode":invitecode, "studentlimit":int(studentlimit), "studentnumber":int(studentnumber), "id":classid, "teacherlist":[] } if item not in classlist: #在rf裡面如果要實現一個檢查點關鍵字,怎麼表示檢查點不通過???就是丟擲異常。 raise Exception("class list dose not contain your class info") #裡面的東西隨便寫的 if __name__ == '__main__': #除錯用 scm = SchoolClassLib() #ret = scm.list_school_class(2) # ret = scm.add_school_class(1,'新測試',77) # print(json.dumps(ret, indent=2)) # #ret = scm.delete_school_class(63630) # pprint(ret) # print(json.dumps(ret, indent=2)) # # ret = scm.list_school_class(1) # print(json.dumps(ret, indent=2)) # # #scm.delete_all_school_classes() #scm.classlist_should_contain() """ 實現3個關鍵字 """
解釋: