1. 程式人生 > >rf用例~~~系統中已經有班級

rf用例~~~系統中已經有班級

在這裡插入圖片描述
完成用例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個關鍵字

"""

解釋:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述