完成用例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个关键字
"""
解释: