Commit decaafb23a13d7a6d798851ca7eb925bfbcbe3e0

Authored by 175930106
Committed by liujiqiang
1 parent 8bf92269

初始化地利集团接口测试框架

Too many changes to show.

To preserve performance only 42 of 128 files are displayed.

src/commons/.gitignore 0 → 100644
  1 +/Logging.pyc
  2 +/SendEmail.pyc
  3 +/__init__.pyc
  4 +/common.pyc
src/commons/ConfigDB.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import MySQLdb
  4 +import commons.common as ca
  5 +import json
  6 +from commons.Logging import Logger
  7 +# import chardet
  8 +log=Logger()
  9 +
  10 +
  11 +dbhost=ca.get_global_config('global_data','Database','dbhost')
  12 +dbport=ca.get_global_config('global_data','Database','dbport')
  13 +dbname=ca.get_global_config('global_data','Database','dbname')
  14 +dbuser=ca.get_global_config('global_data','Database','dbuser')
  15 +dbpassword=ca.get_global_config('global_data','Database','dbpassword')
  16 +#dbcharset=get_global_config('Database','dbcharset')
  17 +
  18 +def mysql_selectOne(select_action):
  19 + action=select_action
  20 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  21 + cursor = db.cursor()
  22 + # 使用cursor()方法获取操作游标
  23 + try:
  24 + # 使用execute方法执行SQL语句
  25 + cursor.execute(action)
  26 + # 使用 fetchone() 方法获取一条数据
  27 + data = cursor.fetchone()
  28 +# print data
  29 + return data
  30 + except Exception as e:
  31 + print("数据库操作异常:%s" % str(e))
  32 + log.error("数据库操作异常:%s" % str(e))
  33 + assert False
  34 + finally:
  35 + # 关闭数据库连接
  36 + db.close()
  37 +
  38 +def mysql_selectAll(select_action):
  39 + action=select_action
  40 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  41 + #游标加上cursorclass=MySQLdb.cursors.DictCursor后,返回值会变成字典,不加时返回数据格式如:(("001","test"),)加了后变成({'name': test, 'id': 001L,})
  42 + #cursor = db.cursor(cursorclass=MySQLdb.cursors.DictCursor)
  43 + cursor = db.cursor()
  44 + # 使用cursor()方法获取操作游标
  45 + try:
  46 + # 使用execute方法执行SQL语句
  47 + cursor.execute(action)
  48 + # 使用 fetchall() 方法获取所有数据
  49 + data = cursor.fetchall()
  50 +# print data
  51 + return data
  52 + except Exception as e:
  53 + print("数据库操作异常:%s" % str(e))
  54 + log.error("数据库操作异常:%s" % str(e))
  55 + assert False
  56 + finally:
  57 + # 关闭数据库连接
  58 + db.close()
  59 +
  60 +def mysql_delete(delete_action):
  61 + action=delete_action
  62 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  63 + cursor = db.cursor()
  64 + # 使用cursor()方法获取操作游标
  65 + try:
  66 + # 使用execute方法执行SQL语句
  67 + cursor.execute(action)
  68 + # 提交
  69 + db.commit()
  70 + except Exception as e:
  71 + print("数据库操作异常:%s" % str(e))
  72 + log.error("数据库操作异常:%s" % str(e))
  73 + # 错误回滚
  74 + db.rollback()
  75 + finally:
  76 + # 关闭数据库连接
  77 + db.close()
  78 +
  79 +def mysql_update(update_action):
  80 + action=update_action
  81 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  82 + cursor = db.cursor()
  83 + # 使用cursor()方法获取操作游标
  84 + try:
  85 + # 使用execute方法执行SQL语句
  86 + cursor.execute(action)
  87 + # 提交
  88 + db.commit()
  89 + except Exception as e:
  90 + print("数据库操作异常:%s" % str(e))
  91 + log.error("数据库操作异常:%s" % str(e))
  92 + # 错误回滚
  93 + db.rollback()
  94 + finally:
  95 + # 关闭数据库连接
  96 + db.close()
  97 +
  98 +def mysql_insert(insert_action):
  99 + action=insert_action
  100 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  101 + cursor = db.cursor()
  102 + # 使用cursor()方法获取操作游标
  103 + try:
  104 + # 使用execute方法执行SQL语句
  105 + cursor.execute(action)
  106 + # 提交
  107 + db.commit()
  108 + except Exception as e:
  109 + print("数据库操作异常:%s" % str(e))
  110 + log.error("数据库操作异常:%s" % str(e))
  111 + # 错误回滚
  112 + db.rollback()
  113 + finally:
  114 + # 关闭数据库连接
  115 + db.close()
  116 +
  117 +def mysql_check_insert(api,section,check_sql,delete_sql,insert_sql):
  118 + log.info(u"======测试数据准备======")
  119 + check=ca.get_api_config(api, section, check_sql)
  120 + delete=ca.get_api_config(api, section, delete_sql)
  121 + insert=ca.get_api_config(api, section, insert_sql)
  122 +# print check
  123 +# print delete
  124 +# print insert
  125 + try:
  126 + db = MySQLdb.connect(dbhost, dbuser, dbpassword, dbname, charset='utf8' )
  127 + cursor = db.cursor()
  128 + # 使用cursor()方法获取操作游标
  129 + # 使用execute方法执行SQL语句
  130 + cursor.execute(check)
  131 + result=cursor.fetchall()
  132 + # 提交
  133 + db.commit()
  134 + if result:
  135 + log.info(u"检查到数据库有重复数据%r"%str(result))
  136 + log.info(u"删除查询到的重复数据%r"%str(delete))
  137 + cursor.execute(delete)
  138 + log.info(u"删除数据完成")
  139 + log.info(u"向数据库中插入测试数据%r"%str(insert))
  140 + cursor.execute(insert)
  141 + log.info(u"插入数据完成")
  142 + result=cursor.fetchall()
  143 + db.commit()
  144 + return result
  145 + else:
  146 + log.info(u"数据库没有重复数据直接插入自定义数据%r"%str(insert))
  147 + result=cursor.execute(insert)
  148 + log.info(u"插入数据完成,返回结果为为%r"%str(result))
  149 +# cursor.fetchall()
  150 + db.commit()
  151 + return result
  152 +
  153 + except Exception as e:
  154 + print(u"数据库操作异常:%r" % str(e))
  155 + log.error(u"数据库操作异常:%r" % str(e))
  156 + # 错误回滚
  157 + db.rollback()
  158 + assert False
  159 + finally:
  160 + # 关闭数据库连接
  161 + db.close()
  162 +
  163 +
  164 +
  165 +def mysql_select_order(orderNum):
  166 + return mysql_selectOne("SELECT * FROM `order`.orders WHERE code = '%s';"%orderNum)
  167 +
  168 +def mysql_delete_order(orderNum):
  169 + mysql_delete("DELETE FROM `order`.orders WHERE code = '%s';"%orderNum)
  170 +
  171 +def mysql_select_coupon(couponNum):
  172 + return mysql_selectOne("SELECT * FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum)
  173 +
  174 +def mysql_delete_coupon(couponNum):
  175 + mysql_delete("DELETE FROM `customer`.customer_coupon WHERE id = '%s';"%couponNum)
  176 +
  177 +
  178 +def Check_in_Mysql(in_data,sql_spm):
  179 + log.info(u"======从数据库中查询传入数据======")
  180 + result=mysql_selectAll(sql_spm)
  181 + log.info(u"传入in_data为: %s"%in_data)
  182 + log.info(u"数据库查询到的结果为 %s"%result)
  183 +
  184 + result=str(result)
  185 +# print "1111111",result.decode("utf-8")
  186 + if len(str(in_data)) == 0 and len(result)!=0:
  187 + log.error(u"传入数据为空!!\n")
  188 + assert False
  189 + return
  190 + elif len(str(in_data)) == 0 and len(result)==0:
  191 + log.error(u"传入数据与数据库查询结果都为空!!\n")
  192 + assert False
  193 + return
  194 + elif len(str(in_data)) != 0 and len(result)==0:
  195 + log.error(u"数据库查询结果为空\n")
  196 + assert False
  197 + return
  198 + elif isinstance(in_data,(list)):
  199 + log.info(u'检查的数据格式 为list类型')
  200 + for i in range(0,len(in_data)):
  201 + #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode
  202 + in_data[i]=str(in_data[i]).decode("utf-8").encode("unicode-escape")
  203 +# log.info(u"正在检查输入数据:%s"%in_data[i])
  204 + if in_data[i] in result:
  205 + assert True
  206 + log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,in_data[i]))
  207 + else:
  208 + log.error(u"#########ERROR#########:\n in_data与数据库查询结果不一致%r"%in_data[i])
  209 + assert False
  210 + return True
  211 +
  212 + elif str(in_data).decode("utf-8").encode("unicode-escape") in result:
  213 + assert True
  214 + log.info(u"in_data与数据库查询结果一致!!%r"%in_data)
  215 + return True
  216 + else:
  217 + log.info(u"#########ERROR#########:\n in_data与数据库查询结果不一致!!%r"%in_data)
  218 + assert False
  219 +
  220 +def Check_in_Response(check_data,src_data):
  221 + #check_data必须为列表形式,src_data必须为r.json()的数据类型
  222 + log.info(u"======从响应Body中查询传入数据======")
  223 + src_data=json.dumps(src_data)
  224 + src_data=src_data.replace(" ","")
  225 + log.info(u"传入check_data为: %s"%check_data)
  226 + log.info(u"对比的响应数据为 %s"%src_data)
  227 + if len(check_data) == 0 or len(src_data)==0:
  228 + log.error(u"传入数据为空!!\n")
  229 + assert False
  230 + return
  231 + elif isinstance (check_data,str) :
  232 + check_data=check_data.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",")
  233 + for i in range(0,len(check_data)):
  234 + #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode
  235 + check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape")
  236 +# print type(check_data),check_data[i]
  237 + if check_data[i] in src_data:
  238 + assert True
  239 + log.info(u"遍历list第%d次,字段%s在请求响应结果中"%((i+1),check_data[i].decode("unicode-escape")))
  240 + else:
  241 + log.error(u"#########ERROR#########:\n check_data不在请求响应结果中%s"%check_data[i].decode("unicode-escape"))
  242 + assert False
  243 + return True
  244 + elif isinstance (check_data,list) and len(check_data) > 0:
  245 + for i in range(0,len(check_data)):
  246 + #由于数据库查询的数据中,中文的格式为unicode-escape,所以传入的数据需要进行encode
  247 + check_data[i]=check_data[i].decode("utf-8").encode("unicode-escape")
  248 + print(type(check_data),check_data[i],str(check_data[i]))
  249 + print(type(src_data),src_data)
  250 + if check_data[i] in src_data:
  251 + assert True
  252 + log.info(u"遍历list第%d次,插入数据%r与数据库查询结果一致"%(i,check_data[i]))
  253 + else:
  254 + log.error(u"#########ERROR#########:\n check_data数据库查询结果不一致%r"%check_data[i])
  255 + assert False
  256 + return True
  257 + else:
  258 + log.info(u"#########ERROR#########:\n 检查数据有问题,请检查!!!!!%r")
  259 + assert False
  260 +
  261 +
  262 +# test=ca.get_api_config('listCoupon', 'RequstHeader', 'testlist')
  263 +# print type(test),test
  264 +# print test.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",")
  265 +# test1=test.replace(" ","").replace("[","").replace("]","").decode("utf-8").split(",")
  266 +#
  267 +# a='couponBizType'
  268 +# b='code'
  269 +# data1=[a,b:"200"]
  270 +# data2={"code":"200","data":{"code":u"你好","data":[{"couponBizType":1,"couponCode":"004","couponCode123":"004"}],"result":"OK","success":2},"result":"OK","success":2}
  271 +#
  272 +# print Check_in_Response(data1, data2)
  273 +
  274 +# d=mysql_selectAll("select id as ddd,created_id,name from `product`.tag where id =1")
  275 +# d1=mysql_selectOne("select id,created_id,name from `product`.tag where id =1111")
  276 +# print d
  277 +# print d1
  278 +# print d[0][0]
  279 +# print chardet.detect(str(d))
  280 +# print chardet.detect(str(d[0][2]))
  281 +# mysql_insert(ca.get_api_config('submitOrder', 'coupon', 'insert'))
  282 +# d=ca.get_api_config('submitOrder', 'coupon', 'insert')
  283 +# d=d.decode("utf-8")
  284 +# print d
  285 +# mysql_insert(d)
  286 +
  287 +# c={"couponBizType":1,"couponCode":"004"}
  288 +# a={"code":"200","data":{"code":"200","data":[],"result":"OK","success":1},"result":"OK","success":2}
  289 +# b={"code":"200","data":{"code":"200","data":[{"couponBizType":1,"couponCode":"004","couponCode123":"004"}],"result":"OK","success":2},"result":"OK","success":2}
  290 +# # print json_cmp(a, b)
  291 +# print json_cmp(a, b)
  292 +# print 123
  293 +# mysql_check_insert('listCoupon', 'listCoupon01',1,2,3)
  294 +# a=mysql_selectAll("select * from `order`.orders where id =271")
  295 +# print a
  296 +# if a:
  297 +# print 111
  298 +
  299 +# def string(str1):
  300 +# a=[]
  301 +# b=[]
  302 +# str1= list(str1)
  303 +# print type(str1[0]),type(str1[1]),len(str1)
  304 +# for i in range(len(str1)):
  305 +# if str1[i] in '0123456789':
  306 +# b.append(str1[i])
  307 +# else:
  308 +# a.append(str1[i])
  309 +# a= "".join(a)
  310 +# b= "".join(b)
  311 +# c=a+b
  312 +# return c
  313 +#
  314 +# print string("A1B2c3")
  315 +#
  316 +# assert None, "add assert message"
0 \ No newline at end of file 317 \ No newline at end of file
src/commons/ExcelAction.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import xlrd
  4 +import xlwt
  5 +
  6 +
  7 +file="E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_ConfigData\\API\\submitOrder.xlsx"
  8 +
  9 +data=xlrd.open_workbook(file)
  10 +
  11 +sheet=data.sheets()[0]
  12 +print(sheet)
  13 +print(sheet.cell(0,0).value)
0 \ No newline at end of file 14 \ No newline at end of file
src/commons/Faker.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +from faker import Factory
  4 +
  5 +
  6 +
  7 +class random_data():
  8 +
  9 + def __init__(self, type='zh_CN'):
  10 + self.type = type
  11 + self.fake = Factory().create(self.type)
  12 +
  13 + def name(self):
  14 + """随机姓名"""
  15 + return self.fake.name()
  16 +
  17 + def address(self):
  18 + """随机姓名"""
  19 + return self.fake.address()
  20 +
  21 + def phone_number(self):
  22 + """随机姓名"""
  23 + return self.fake.phone_number()
  24 +
  25 + def email(self):
  26 + """随机姓名"""
  27 + return self.fake.email()
  28 +
  29 + def longitude(self):
  30 + """随机姓名"""
  31 + return self.fake.longitude()
  32 +
  33 + def latitude (self):
  34 + """随机姓名"""
  35 + return self.fake.latitude ()
  36 +
  37 + def credit_card_number (self):
  38 + """随机姓名"""
  39 + return self.fake.credit_card_number ()
  40 +
  41 +
  42 +
  43 +# 带参数装饰器
  44 +def log1(function):
  45 + def aa(*args,**kwargs):
  46 + print("test 111")
  47 + return function(*args,**kwargs)
  48 + return aa
  49 +
  50 +
  51 +def log2(parameter):
  52 + def log22(function):
  53 + def aa(*args,**kwargs):
  54 + if parameter:
  55 + print("test 222")
  56 + else:
  57 + print("test 333")
  58 + return function(*args,**kwargs)
  59 + return aa
  60 + return log22
  61 +
  62 +@log1
  63 +def test1(a):
  64 + print("test one%s"%a)
  65 +
  66 +@log1
  67 +@log2(parameter=False)
  68 +def test2(a):
  69 + print("test one%s"%a)
  70 +
  71 +test2(666)
  72 +
  73 +
  74 +# a=random_data()
  75 +#
  76 +# print a.credit_card_number()
  77 +
src/commons/JsonClass.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import json
  4 +import operator
  5 +
  6 +
  7 +def dict_diff(a1,b1):
  8 + #提取出dict与str或list的异常对比场景
  9 + if type(a1)!= type(b1):
  10 + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
  11 + return False
  12 + d1=list(set(a1.keys()).difference(set(b1.keys())))
  13 + d2=list(set(b1.keys()).difference(set(a1.keys())))
  14 + if len(d1)==0 and len(d2)==0:
  15 + return True
  16 + else:
  17 + print("实际json比期望json多了键值",d1)
  18 + print("实际json比期望json少了键值",d2)
  19 + return False
  20 +
  21 +def list_diff(a1,b1):
  22 + #提取出list与str或dict的异常对比场景
  23 + if type(a1)!= type(b1):
  24 + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
  25 + return False
  26 + elif len(a1)!=len(b1):
  27 + print("实际响应json列表长度{}和期望响应json列表长度{}不一致".format(a1,b1))
  28 + return False
  29 + else:
  30 + return True
  31 +
  32 +#无法判断[[1],[2]]和[[1],[1]]的区别,只能判断列表长度和字典键值是否一致
  33 +#a为实际对比的json数据,b为期望的json数据
  34 +def compare_json(a,b):
  35 + #判断检查数据是否为列表格式的数据
  36 + if isinstance(a,list):
  37 + if list_diff(a,b)==True:
  38 + #为列表时必须进行排序,否则可能出现列表对比的位置不一致
  39 + a.sort()
  40 + b.sort()
  41 + for i in range(len(a)):
  42 + #判断列表中的指定的元素是否为字典格式
  43 + if compare_json(a[i],b[i]) == False:
  44 + return False
  45 + else:
  46 + return False
  47 + #判断检查数据是否为字典格式的数据
  48 + elif isinstance(a,dict):
  49 + if dict_diff(a,b)==True:
  50 + #如果第一层键值相同时,遍历检查内层所有键值
  51 + for key in a.keys():
  52 + #内层键值为列表数据类型时
  53 + if compare_json(a[key],b[key]) == False:
  54 + return False
  55 + else:
  56 + return False
  57 + #期望数据非dict和list类型时,直接进行对比
  58 + elif operator.eq(a, b)==False:
  59 + print("实际数据的{}和期望数据的{}不一致".format(a,b))
  60 + return False
  61 +
  62 +#字典嵌套字典,完全相同
  63 +a1={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
  64 +b1={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
  65 +#字典嵌套字典,实际数据多了键值key33,实际少了键值key333
  66 +a2={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key33":0}}}
  67 +b2={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
  68 +#列表嵌套列,完全相同但顺序不一致
  69 +a3=["key11","key22",["key11","key22",["key111",{"key1111":1}]]]
  70 +b3=[["key11","key22",["key111",{"key1111":1}]],"key11","key22"]
  71 +#列表嵌套列,顺序不一致,实际数据多了键值key111,实际少了键值key1111
  72 +a4=["key11","key22",["key11","key22",["key111",{"key111":1}]]]
  73 +b4=[["key11","key22",["key111",{"key1111":1}]],"key11","key22"]
  74 +#列表嵌套列表,顺序不一致,列表值不一致
  75 +a5=["key","key22",["key11","key22",["key111"]]]
  76 +b5=["key11","key22",["key11","key22",["key111"]]]
  77 +#列表嵌套列表,顺序一致,但是列表长度不一致
  78 +a6=["key","key22",["key11","key22",["key111"]]]
  79 +b6=["key11","key22",["key11","key22",["key111",{"key1111":1}]]]
  80 +#字典和列表相互嵌套,实际数据多了键值key2,实际少了键值key22
  81 +a7={"key1":0,"key2": ["key11",{"key2": {"key111":0,"key222": ["key111","key222"]}}]}
  82 +b7={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
  83 +#字典和列表相互嵌套,实际数据某一个列表长度大于期望数据
  84 +a8={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111"]}}]}
  85 +b8={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
  86 +#字典和列表相互嵌套,实际数据某一个列表的值和期望数据的值不一致
  87 +a9={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key22211"]}}]}
  88 +b9={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
  89 +"""exception"""
  90 +#字典和字符串对比
  91 +a10=[{"key11": 0},{"key11": 0}]
  92 +b10=["key11","key33"]
  93 +#字典和list对比
  94 +a11=[{"key11": 0},{"key11": 0}]
  95 +b11=[["key11"],["key33"]]
  96 +#列表与字典对比
  97 +a12=[["key11"],["key33"]]
  98 +b12=[{"key11": 0},{"key11": 0}]
  99 +#列表与字符串对比
  100 +a13=[["key11"],["key33"]]
  101 +b13=["key11","key11"]
  102 +#字符串与列表对比
  103 +a14=["key11","key11"]
  104 +b14=[["key11"],["key33"]]
  105 +#字符串与字典对比
  106 +a15=["key11","key33"]
  107 +b15=[{"key11": 0},{"key11": 0}]
  108 +
  109 +print(compare_json(a9,b9))
0 \ No newline at end of file 110 \ No newline at end of file
src/commons/Logging.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import logging,os
  4 +
  5 +class Logger():
  6 +
  7 + def __init__(self, path=__name__,clevel = logging.ERROR,Flevel = logging.DEBUG,test = 'w'):
  8 + #test = 'w'时每次日志文件都重新写入,test = 'a'时为追加模式,在原来日志文件上追加日志
  9 + #重写模式的时,发送test.log没有信息,用追加模式可以(注意如果为a时日志可能出现重复,为w时没有这个现象)
  10 + #设置日志路径
  11 + current_path=os.path.dirname(os.path.dirname(__file__))
  12 + path=current_path+"/report"+"/test.log"
  13 +
  14 + self.logger = logging.getLogger(path)
  15 +
  16 + self.logger.setLevel(logging.DEBUG)
  17 +
  18 + fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] : %(message)s', '%Y-%m-%d %H:%M:%S')
  19 +# fmt = logging.Formatter('[%(asctime)s] %(levelname)s [%(name)s,%(funcName)s: %(filename)s, %(lineno)d] %(message)s', '%Y-%m-%d %H:%M:%S')
  20 + #设置CMD日志
  21 +
  22 + sh = logging.StreamHandler()
  23 +
  24 + sh.setFormatter(fmt)
  25 +
  26 + sh.setLevel(clevel)
  27 +
  28 + #设置文件日志
  29 +
  30 + fh = logging.FileHandler(path,mode=test,encoding="utf-8")
  31 +
  32 + fh.setFormatter(fmt)
  33 +
  34 + fh.setLevel(Flevel)
  35 +
  36 + self.logger.addHandler(sh)
  37 +
  38 + self.logger.addHandler(fh)
  39 +
  40 +
  41 + def debug(self,message):
  42 + #初始化得时候self.logger = logging.getLogger(path)
  43 + self.logger.debug(message)
  44 +
  45 + def info(self,message):
  46 +
  47 + self.logger.info(message)
  48 +
  49 +
  50 + def warn(self,message):
  51 +
  52 + self.logger.warn(message)
  53 +
  54 +
  55 + def error(self,message):
  56 +
  57 + self.logger.error(message)
  58 +
  59 +
  60 + def critical(self,message):
  61 +
  62 + self.logger.critical(message)
  63 +
  64 +
  65 +
  66 +
  67 +# a=Logger()
  68 +# a.info("123")
  69 +# from Case_Method.Logging import *
  70 +
  71 +# logcommonsonfig(level=logging.DEBUG, # log level
  72 +# format='[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s', # log格式
  73 +# datefmt='%Y-%m-%d %H:%M:%S', # 日期格式
  74 +# filename='test.log', # 日志输出文件
  75 +# filemode='a') # 追加模式
0 \ No newline at end of file 76 \ No newline at end of file
src/commons/MyRequest.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import requests
  4 +import json
  5 +from commons import common as com
  6 +from commons.Logging import Logger
  7 +# from requests.adapters import HTTPAdapter HTTPAdapter(max_retries=3)
  8 +import urllib3
  9 +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
  10 +log=Logger()
  11 +
  12 +class myrequest(object):
  13 +
  14 + def __init__(self):
  15 + self.timeout = 60
  16 + self.max_retries = 3
  17 + self.keep_alive = False
  18 + self.ssl_verify=False
  19 + self.proxies=None
  20 + self.allow_redirects=False
  21 +
  22 + def getSession(self,proxies=None):
  23 + if proxies:
  24 + self.proxies={'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}
  25 + se=requests.session()
  26 + url=com.get_api_config('login', 'login01', 'url')
  27 + header=json.loads(com.get_api_config('login', 'login01', 'header'))
  28 + body=com.get_api_config('login', 'login01', 'body')
  29 + r=se.post(url,data=body,headers=header,allow_redirects=False,proxies=self.proxies)
  30 +# assert r.status_code==200,"请检查登录信息"
  31 + print(r.status_code)
  32 + self.se=se
  33 + return self.se
  34 +
  35 + def get(self,url,**kwargs):
  36 + log.info('{0:=^80}'.format('进行GET请求'))
  37 + log.info('请求地址为{};\n'.format(url))
  38 + res = self.se.get(url, proxies=self.proxies,**kwargs)
  39 + log.info('响应body为{};'.format(res.json()))
  40 + return res
  41 +
  42 + def post(self,url, data=None, json=None, **kwargs):
  43 + log.info('{0:=^80}'.format('进行POST请求'))
  44 + log.info('请求地址为{};\n 请求body为{};\n'.format(url,data))
  45 + res = self.se.post(url, data=data, json=json,proxies=self.proxies,**kwargs)
  46 + log.info('响应body为{};'.format(res.json()))
  47 + return res
  48 +
  49 + def put(self,url, data=None, **kwargs):
  50 + res = self.se.put(url, data=data, **kwargs)
  51 + return res
  52 +
  53 + def delete(self,url, **kwargs):
  54 + res = self.se.delete(url, **kwargs)
  55 + return res
  56 +
  57 + def patch(self,url, data=None, **kwargs):
  58 + res = self.se.patch(url,data=data, **kwargs)
  59 + return res
  60 +
  61 + def head(self, url, **kwargs):
  62 + res = self.se.patch(url,data=None, **kwargs)
  63 + return res
  64 +
  65 + def close_session(self):
  66 + self.se.close()
  67 +
  68 +# def to_request(self,method,url,data=None,is_json=False,**kwargs): #最后加入**kwargs使可以传headers
  69 +# method = method.upper()
  70 +# if isinstance(data,str):
  71 +# try:
  72 +# data = json.load(data) #'{"mobilephone": "18911114444", "pwd": "123456", "regname": "youxiu"}'
  73 +# except Exception as e:
  74 +# # print("异常为{}".format(e))
  75 +# Logger.error("异常为{}".format(e))
  76 +# data = eval(data) #'{"mobilephone": '18911114444',1:"4545"}' 非json的字符串
  77 +# if method == 'GET':
  78 +# res = self.one_session.request(method,url,params=data,**kwargs)
  79 +# elif method == 'POST':
  80 +# if is_json:
  81 +# res = self.one_session.request(method, url, json=data,**kwargs)
  82 +# else:
  83 +# res = self.one_session.request(method, url, data=data,**kwargs)
  84 +# else:
  85 +# res = None
  86 +# # print("405 METHOD NOT ALLOWED")
  87 +# Logger.error("METHOD NOT ALLOWED".format(method))
  88 +# return res
  89 +
  90 +# test=myrequest()
  91 +# re=test.getSession(True)
  92 +# print(re.headers)
0 \ No newline at end of file 93 \ No newline at end of file
src/commons/SendEmail.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import os
  4 +import smtplib # 用于建立smtp连接
  5 +from email.mime.multipart import MIMEMultipart # 混合MIME格式,支持上传附件
  6 +from email.header import Header # 用于使用中文邮件主题
  7 +from email.mime.text import MIMEText # 邮件需要专门的MIME格式
  8 +from email.mime.image import MIMEImage
  9 +from email.mime.application import MIMEApplication
  10 +from commons.Logging import Logger
  11 +log=Logger()
  12 +
  13 +def send_email_text():
  14 + # 1. 编写邮件内容(Email邮件需要专门的MIME格式)
  15 + msg = MIMEText('this is a test email', 'plain', 'utf-8') # plain指普通文本格式邮件内容
  16 +
  17 + # 2. 组装Email头(发件人,收件人,主题)
  18 + msg['From'] = '328351418@qq.com' # 发件人
  19 + msg['To'] = '328351418@qq.com' # 收件人
  20 + msg['Subject'] = 'Api Test Report' # 邮件主题
  21 +
  22 + # 3. 连接smtp服务器并发送邮件
  23 + smtp = smtplib.SMTP_SSL('smtp.qq.com') # smtp服务器地址 使用SSL模式
  24 + smtp.login('328351418@qq.com', 'apebatdwkggkbiee') # 用户名和密码
  25 + smtp.sendmail("328351418@qq.com", "328351418@qq.com", msg.as_string())
  26 + smtp.quit()
  27 +
  28 +
  29 +def send_email(send_file,send_to=["lixi@diligrp.com","328351418@qq.com"]):
  30 +
  31 + log_path=os.path.dirname(os.path.dirname(__file__))
  32 + log_path=log_path+"/report/test.log"
  33 + msg = MIMEMultipart() # 混合MIME格式
  34 + msg['From'] = '328351418@qq.com' # 发件人
  35 + msg['To'] = '175930106@qq.com' # 收件人
  36 + msg['Subject'] = Header('接口测试报告', 'utf-8') # 中文邮件主题,指定utf-8编码
  37 +
  38 + text = MIMEText('this is a test email', 'plain', 'utf-8')
  39 + msg.attach(MIMEText(open(send_file,'rb' ).read(), 'html', 'utf-8')) # 邮件正文添加html格式内容(会丢失css格式)
  40 +
  41 + att1 = MIMEText(open(send_file, 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件
  42 + att1["Content-Type"] = 'application/octet-stream'
  43 + att1["Content-Disposition"] = 'attachment; filename="report.html"' # filename为邮件中附件显示的名字
  44 +
  45 +# att2 = MIMEText(open("../Case_Report/test.log", 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件
  46 + att2 = MIMEText(open(log_path, 'rb').read(), 'base64', 'utf-8') # 二进制格式打开需要添加的附件
  47 + att2["Content-Type"] = 'application/octet-stream'
  48 + att2["Content-Disposition"] = 'attachment; filename="test.log"' # filename为邮件中附件显示的名字
  49 + msg.attach(text)
  50 + msg.attach(att1)
  51 + msg.attach(att2)
  52 +
  53 + #一下发送日志不会在test.log上,因为提前msg.attach了
  54 + log.info("发送邮件")
  55 + try:
  56 + smtp = smtplib.SMTP_SSL('smtp.qq.com') # smtp服务器地址 使用SSL模式
  57 + re=smtp.login('328351418@qq.com', 'wveicahctcizbghh') # 用户名和密码
  58 + smtp.sendmail("328351418@qq.com", send_to, msg.as_string())
  59 + print(re)
  60 +# smtp.sendmail("328351418@qq.com", "328351418@qq.com", msg.as_string()) # 发送给另一个邮箱
  61 +# logging.info("邮件发送完成!")
  62 + except Exception as e:
  63 + log.error(str(e))
  64 + print(e)
  65 + finally:
  66 + smtp.quit()
  67 + log.info("邮件发送完毕")
  68 +
  69 +
  70 +#
  71 +# f='E:\\EclipseWorkspace\\\WorksapceDemo\\Request-demo\\src\\report\\2019-11-28 15_39_01_result.html'
  72 +# send_email(send_file=f)
  73 +# fromaddr = '328351418@qq.com'
  74 +# password = 'apebatdwkggkbiee'
  75 +# toaddrs = ['328351418@qq.com', '328351418@qq.com']
  76 +#
  77 +# content = 'hello, this is email content.'
  78 +# textApart = MIMEText(content)
  79 +#
  80 +# imageFile = 'E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_Report\\report.html'
  81 +# imageApart = MIMEApplication(open(imageFile, 'rb').read())
  82 +# imageApart.add_header('Content-Disposition', 'attachment', filename='report.html')
  83 +#
  84 +# # pdfFile = '算法设计与分析基础第3版PDF.pdf'
  85 +# # pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
  86 +# # pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfFile)
  87 +# #
  88 +# #
  89 +# # zipFile = '算法设计与分析基础第3版PDF.zip'
  90 +# # zipApart = MIMEApplication(open(zipFile, 'rb').read())
  91 +# # zipApart.add_header('Content-Disposition', 'attachment', filename=zipFile)
  92 +#
  93 +# m = MIMEMultipart()
  94 +# m.attach(textApart)
  95 +# m.attach(imageApart)
  96 +# # m.attach(pdfApart)
  97 +# # m.attach(zipApart)
  98 +# m['Subject'] = 'TEST REPORT'
  99 +# m['From'] = '328351418@qq.com'
  100 +# m['to'] = '175930106@qq.com'
  101 +#
  102 +# try:
  103 +# server = smtplib.SMTP('smtp.qq.com')
  104 +# server.login(fromaddr,password)
  105 +# server.sendmail(fromaddr, toaddrs, m.as_string())
  106 +# print('success')
  107 +# server.quit()
  108 +# except smtplib.SMTPException as e:
  109 +# print('error:',e) #打印错误
  110 +#
  111 +#
  112 +# # file='E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_Report\\2019-01-28 17_54_18_result.html'
  113 +# #
  114 +# # email(file)
0 \ No newline at end of file 115 \ No newline at end of file
src/commons/__init__.py 0 → 100644
  1 +# -*- coding:utf-8 -*-
  2 +# import rsa
  3 +# import binascii
  4 +# import base64
  5 +# import requests,json
  6 +# import time
  7 +# import sys
  8 +# reload(sys)
  9 +# sys.setdefaultencoding('utf8')
0 \ No newline at end of file 10 \ No newline at end of file
src/commons/__pycache__/ConfigDB.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/__pycache__/Logging.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/__pycache__/MyRequest.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/__pycache__/SendEmail.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/__pycache__/__init__.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/__pycache__/common.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/api/__init__.py 0 → 100644
  1 +# -*- coding:utf-8 -*-
  2 +import rsa
  3 +import binascii
  4 +import base64
  5 +import requests,json
  6 +import time
  7 +# import sys
  8 +# reload(sys)
  9 +# sys.setdefaultencoding('utf8')
0 \ No newline at end of file 10 \ No newline at end of file
src/commons/api/__pycache__/__init__.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/api/__pycache__/mock_demo.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/api/__pycache__/mock_demo_class.cpython-36.pyc 0 → 100644
No preview for this file type
src/commons/api/class_listCoupon.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import ConfigParser
  4 +import os
  5 +import requests,json
  6 +import commons.common as ca
  7 +import commons.ConfigDB as db
  8 +
  9 +
  10 +def post_request(api,caseNum,requestBody):
  11 + #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败
  12 + notes=ca.get_api_config(api,'RequstHeader', 'header')
  13 + url=ca.get_api_config(api,'RequstURL', 'url')
  14 + header=ca.get_api_config(api,'RequstHeader', 'header')
  15 + body=ca.get_api_config(api,caseNum,requestBody)
  16 + notes=ca.get_api_config(api,caseNum,'notes')
  17 + print notes
  18 + test_headers=json.loads(header)
  19 + r = requests.post(url, data=body, headers=test_headers)
  20 +
  21 + return r
0 \ No newline at end of file 22 \ No newline at end of file
src/commons/api/class_submitOrder.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import ConfigParser
  4 +import os
  5 +import requests,json
  6 +import commons.common as ca
  7 +import commons.ConfigDB as db
  8 +
  9 +
  10 +def post_request(api,caseNum,requestBody):
  11 + #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败
  12 + notes=ca.get_api_config(api,'RequstHeader', 'header')
  13 + url=ca.get_api_config(api,'RequstURL', 'url')
  14 + header=ca.get_api_config(api,'RequstHeader', 'header')
  15 + body=ca.get_api_config(api,caseNum,requestBody)
  16 + notes=ca.get_api_config(api,caseNum,'notes')
  17 + print notes
  18 + test_headers=json.loads(header)
  19 + r = requests.post(url, data=body, headers=test_headers)
  20 +
  21 + return r
0 \ No newline at end of file 22 \ No newline at end of file
src/commons/api/mock_demo.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +
  4 +def zhifu():
  5 + '''假设这里是一个支付的功能,未开发完
  6 + 支付成功返回:{"result": "success", "reason":"null"}
  7 + 支付失败返回:{"result": "fail", "reason":"余额不足"}
  8 + reason返回失败原因
  9 + '''
  10 + pass
  11 +
  12 +def zhifu_status():
  13 + '''根据支付的结果success or fail,判断跳转到对应页面'''
  14 + result = zhifu()
  15 + print(result)
  16 + try:
  17 + if result["result"] == "success":
  18 + return "支付成功"
  19 + elif result["result"] == "fail":
  20 + print("失败原因:%s" % result["reason"])
  21 + return "支付失败"
  22 + elif result["result"] == "error":
  23 + print("失败原因:%s" % result["reason"])
  24 + return "支付错误"
  25 + else:
  26 + print("未知异常")
  27 + return "未知异常"
  28 + except:
  29 + return "Error, 服务端返回异常!"
0 \ No newline at end of file 30 \ No newline at end of file
src/commons/api/mock_demo_class.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +
  4 +class Zhifu():
  5 + def zhifu(self):
  6 + '''假设这里是一个支付的功能,未开发完
  7 + 支付成功返回:{"result": "success", "reason":"null"}
  8 + 支付失败返回:{"result": "fail", "reason":"余额不足"}
  9 + reason返回失败原因
  10 + '''
  11 + pass
  12 +
  13 +class Statues():
  14 + def zhifu_statues(self):
  15 + '''根据支付的结果success or fail,判断跳转到对应页面'''
  16 + result = Zhifu().zhifu()
  17 + print(result)
  18 + try:
  19 + if result["result"] == "success":
  20 + return "支付成功"
  21 + elif result["result"] == "fail":
  22 + print("失败原因:%s" % result["reason"])
  23 + return "支付失败"
  24 + else:
  25 + return "未知错误异常"
  26 + except:
  27 + return "Error, 服务端返回异常!"
0 \ No newline at end of file 28 \ No newline at end of file
src/commons/common.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import os
  4 +import operator
  5 +import configparser
  6 +import requests
  7 +import json
  8 +from commons.Logging import Logger
  9 +import urllib3
  10 +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
  11 +log=Logger()
  12 +
  13 +
  14 +def get_global_config(file,section, key):
  15 +
  16 + current_path=os.path.dirname(__file__)
  17 + src_path=os.path.dirname(current_path)
  18 +# global_setting_path=src_path+'/config/global_data.conf'
  19 + global_setting_path=src_path+'/config/'+file+".conf"
  20 + #验证文件是否存在
  21 + file_path = os.path.exists(global_setting_path)
  22 + if file_path:
  23 + #获取文件的数据
  24 + if isinstance(key,int):
  25 + log.error("key of section cannot be int Type :<%r> "%str(key))
  26 + raise Exception("key of section cannot be int Type :<%r> "%str(key))
  27 + else:
  28 + config = configparser.ConfigParser()
  29 + config.read(global_setting_path,encoding="utf-8")
  30 + return config.get(section, key)
  31 + else:
  32 + log.error("File Not Exist :<%r> "%str(global_setting_path))
  33 + raise Exception("File Not Exist :<%r> "%str(global_setting_path))
  34 +
  35 +
  36 +def get_api_config(api,section,key):
  37 + current_path=os.path.dirname(__file__)
  38 + src_path=os.path.dirname(current_path)
  39 + api_path=src_path+"/config/api/"
  40 + api_config_path=api_path+api+".conf"
  41 + #验证文件是否存在
  42 + file_path = os.path.exists(api_config_path)
  43 + if file_path:
  44 + #获取文件的数据
  45 + if isinstance(key,int):
  46 + log.error("key of section cannot be int Type :<%r> "%str(key))
  47 + raise Exception("key of section cannot be int Type :<%r> "%str(key))
  48 + else:
  49 + config = configparser.ConfigParser()
  50 + config.read(api_config_path,encoding="utf-8")
  51 + return config.get(section, key)
  52 + else:
  53 + log.error("File Not Exist :<%r> "%str(api_config_path))
  54 + raise Exception("File Not Exist :<%r> "%str(api_config_path))
  55 +
  56 +def set_global_config(file,section, key,value):
  57 + current_path=os.path.dirname(__file__)
  58 + src_path=os.path.dirname(current_path)
  59 +# global_setting_path=src_path+'/config/global_data.conf'
  60 + global_setting_path=src_path+'/config/'+file+".conf"
  61 + #验证文件是否存在
  62 + file_path = os.path.exists(global_setting_path)
  63 + if file_path:
  64 + #获取文件的数据
  65 + if isinstance(key,int):
  66 + log.error("key of section cannot be int Type :<%r> "%str(key))
  67 + raise Exception("key of section cannot be int Type :<%r> "%str(key))
  68 + else:
  69 + config = configparser.ConfigParser()
  70 + config.read(global_setting_path,encoding="utf-8")
  71 + config.set(section, key, value)
  72 + config.write(open(global_setting_path, "w"))
  73 +
  74 + return config.get(section, key)
  75 + else:
  76 + log.error("File Not Exist :<%r> "%str(global_setting_path))
  77 + raise Exception("File Not Exist :<%r> "%str(global_setting_path))
  78 +
  79 +def set_priority(priority_list):
  80 + #用户自定义优先级方法,设定有需要运行的用例优先级
  81 + #方法内定义global全局变量可以真正通过这个方法设置一个全局的值,如果global放在外面,方法内的变量都是临时的,
  82 + #接上面:即使名称和外面的全局变量相同,方法内的变量和外面的全局变量完全是两码事,外面的全局变量不会受干扰
  83 + global _global_priority
  84 + if priority_list:
  85 + _global_priority=priority_list
  86 + return _global_priority
  87 + else:
  88 + _global_priority=[1,2,3]
  89 + return _global_priority
  90 +
  91 +def set_mark(case_mark):
  92 + #用户自定义优先级方法,设定有需要运行的用例优先级
  93 + global _global_mark
  94 + if case_mark:
  95 + _global_mark=case_mark
  96 + return _global_mark
  97 + else:
  98 + _global_mark=False
  99 + return _global_mark
  100 +
  101 +def read_priority_list():
  102 + #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错
  103 + #如果直接再py文件中加入类似p=set_priority_list()的代码,之前用户自定义的优先级配置将会失效
  104 + priority_list=[1,2,3]
  105 + try:
  106 + return _global_priority
  107 + except Exception as e:
  108 + return priority_list
  109 +
  110 +def read_case_mark():
  111 + #需要重新设定一个方法来读取配置的全局优先级变量,且必须在全局变量初始化后使用,不然会报错
  112 + #如果直接再py文件中加入类似p=set_priority_list()的代码,之前用户自定义的优先级配置将会失效
  113 + casemark=False
  114 + try:
  115 + return _global_mark
  116 + except Exception as e:
  117 + return casemark
  118 +
  119 +def mark(tag=None,p=None):
  120 + #此处的try主要用于,当用户需要直接运行单个用例文件时,没提前_global_priority和_global_mark初始化
  121 + #如果不加try处理,那么_global_priority和_global_mark没有初始化时,单独运行一个引用了mark方法的用例文件会报错
  122 + try:
  123 + #用户没有输入任何值
  124 + if _global_priority == [1,2,3] and _global_mark == False :
  125 + return True
  126 + #只指定用例标签
  127 + elif _global_priority == [1,2,3] and _global_mark != False:
  128 + if tag == _global_mark:
  129 + return True
  130 + else:
  131 + return False
  132 + #只指定用例优先级
  133 + elif _global_priority != [1,2,3] and _global_mark == False:
  134 + if p in _global_priority:
  135 + return True
  136 + else:
  137 + return False
  138 + #同时指定优先级和标签
  139 + elif _global_priority != [1,2,3] and _global_mark != False:
  140 + if p in _global_priority and tag == _global_mark:
  141 + return True
  142 + else:
  143 + return False
  144 + #若直接在用例文件中运行那么_global_mark和_global_priority都不会被定义,会导致异常
  145 + #这里的try用来当上述两个变量未定义时,默认跑当前文件的用例
  146 + except Exception as e:
  147 + return True
  148 +
  149 +
  150 +def get_session(name,password):
  151 + pass
  152 + return "header"
  153 +
  154 +def get_token(name,password):
  155 + pass
  156 + return "token"
  157 +
  158 +def get_request_Url(api):
  159 + return get_api_config(api,'RequestUrl', 'url')
  160 +
  161 +def get_request_Json(api):
  162 + return get_api_config(api,'JsonStructrue', 'requestJson')
  163 +
  164 +# def post_request(api_url, argu, headers):
  165 +# #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败
  166 +# test_headers=json.loads(headers)
  167 +# r = requests.post(api_url, data=argu, headers=test_headers)
  168 +# return r
  169 +
  170 +def dict_diff(a1,b1):
  171 + #提取出dict与str或list的异常对比场景
  172 + if type(a1)!= type(b1):
  173 + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
  174 + return False
  175 + d1=list(set(a1.keys()).difference(set(b1.keys())))
  176 + d2=list(set(b1.keys()).difference(set(a1.keys())))
  177 + if len(d1)==0 and len(d2)==0:
  178 + return True
  179 + else:
  180 + print("实际json比期望json多了键值",d1)
  181 + print("实际json比期望json少了键值",d2)
  182 + return False
  183 +
  184 +def list_diff(a1,b1):
  185 + #提取出list与str或dict的异常对比场景
  186 + if type(a1)!= type(b1):
  187 + print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
  188 + return False
  189 + elif len(a1)!=len(b1):
  190 + print("实际响应json列表长度{}和期望响应json列表长度{}不一致".format(a1,b1))
  191 + return False
  192 + else:
  193 + return True
  194 +
  195 +#无法判断[[1],[2]]和[[1],[1]]的区别,只能判断列表长度和字典键值是否一致
  196 +#a为实际对比的json数据,b为期望的json数据
  197 +def compare_json(a,b):
  198 + #判断检查数据是否为列表格式的数据
  199 + if isinstance(a,list):
  200 + if list_diff(a,b)==True:
  201 + #为列表时必须进行排序,否则可能出现列表对比的位置不一致
  202 + a.sort()
  203 + b.sort()
  204 + for i in range(len(a)):
  205 + #判断列表中的指定的元素是否为字典格式
  206 + if compare_json(a[i],b[i]) == False:
  207 + return False
  208 + else:
  209 + return False
  210 + #判断检查数据是否为字典格式的数据
  211 + elif isinstance(a,dict):
  212 + if dict_diff(a,b)==True:
  213 + #如果第一层键值相同时,遍历检查内层所有键值
  214 + for key in a.keys():
  215 + #内层键值为列表数据类型时
  216 + if compare_json(a[key],b[key]) == False:
  217 + return False
  218 + else:
  219 + return False
  220 + #期望数据非dict和list类型时,直接进行对比,可能会导致{"code":"200"},{"code":"201"}出现不同的情况,所以注释下面的结果
  221 +# elif operator.eq(a, b)==False:
  222 +# print("实际数据的{}和期望数据的{}不一致".format(a,b))
  223 +# return False
  224 +
  225 +#接口返回值是可控的情况可以用下面这个方法
  226 +def cmp_json(actual_data,expect_data):
  227 + log.info("======对比期望和实际响应Json格式======")
  228 + try:
  229 + if len(expect_data)!=0 and len(actual_data)!=0:
  230 + expect_data=json.loads(expect_data)
  231 + result=compare_json(actual_data,expect_data)
  232 + if result==None:
  233 + log.info("响应数据和期望数据的Json格式一致")
  234 + return True
  235 + else:
  236 + log.error("66响应数据和期望数据的Json格式不一致")
  237 + return False
  238 + elif len(expect_data)!=0 and len(actual_data)==0:
  239 + log.error("对比数据中,实际响应数据为空")
  240 + assert False
  241 + elif len(expect_data)==0 and len(actual_data)!=0:
  242 + log.error("对比数据中,期望响应数据为空,请检查配置文件")
  243 + assert False
  244 + elif len(expect_data)==0 and len(actual_data)==0:
  245 + log.error("对比数据都为空")
  246 + assert False
  247 + except Exception as e:
  248 + log.error("对比响应数据和期望数据的Json格式 ERROR == %s"%e)
  249 + return False
  250 +
  251 +def get_to_post(data):
  252 + #需要传入get格式的请求,如:id=638&driver=好司机&licensePlate=车辆信息,返回字典类型数据
  253 + if isinstance(data, str):
  254 + test={i.split("=",1)[0]:i.split("=")[1] for i in data.split("&")}
  255 + return test
  256 + else:
  257 + raise Exception("transformation data must be str type")
  258 +
  259 +def post_to_get(data):
  260 + if isinstance(data, dict):
  261 + #字典类型,格式如{'id':'668','driver':'好司机'}或者{"id":"668","driver":"好司机"}
  262 + test=json.dumps(data)
  263 + test=test.replace(" ","").replace('":"', '=').replace('","', "&").replace('"', '').replace("{", "").replace("}", "")
  264 + return test.encode('utf_8').decode("unicode_escape")
  265 + elif isinstance(data, str):
  266 + if '"' in data:
  267 + #字符串类型,格式如str({'id':'668','driver':'好司机'})
  268 + test=data.replace(" ","").replace('":"', '=').replace('","', "&").replace('"', '').replace("{", "").replace("}", "")
  269 + return test
  270 + elif "'" in data:
  271 + #json字符串类型,格式如str({"id":"668","driver":"好司机"})
  272 + test=data.replace(" ","").replace("':'", "=").replace("','", "&").replace("'", "").replace("{", "").replace("}", "")
  273 + return test
  274 + else:
  275 + raise Exception("pls check your transformation data")
  276 +
  277 +def get_request(api,caseNum):
  278 + #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败
  279 + if 'http' in api.replace(' ',''):
  280 + log.info(u"======直接调用GET请求%s======"%api)
  281 + r = requests.post(api, headers=caseNum,verify=False)
  282 + else:
  283 + URL=get_api_config(api,'RequstURL', 'url')
  284 + #获取header
  285 + headers=get_api_config(api,'RequstHeader', 'header')
  286 + if 'none' == headers:
  287 + #header=str(获取有session和token的header)
  288 + pass
  289 + headers=json.loads(headers)
  290 + #获取URI
  291 + params=get_api_config(api,caseNum, 'URL_params')
  292 + params=params.replace("[","").replace("]","")
  293 + URI=URL+params
  294 + #进行get请求
  295 + r = requests.get(URI,headers=headers)
  296 + if r.status_code == 200:
  297 + # 关闭请求 释放内存
  298 + r.close()
  299 + return r
  300 + else:
  301 + r.close()
  302 + log.error(u"Request code==%s ! Response Code is not 200,Pls Check Your Request Datas"%(r.status_code))
  303 + raise Exception(u"Request Fail! Response Code is not 200,Pls Check Your Request Datas")
  304 + return r
  305 +
  306 +
  307 +def post_request(api,caseNum,requestBody):
  308 + #设置重连次数
  309 + requests.adapters.DEFAULT_RETRIES = 5
  310 + # 设置连接活跃状态为False
  311 + s = requests.session()
  312 + s.keep_alive = False
  313 + #判断post方法使用方式
  314 + if 'http' in api.replace(' ',''):
  315 + log.info(u"======直接调用POST请求%s======"%api)
  316 + r = requests.post(api, headers=caseNum,data=requestBody,verify=False)
  317 + else:
  318 + log.info(u"======配置相关参数,调用POST请求%s======"%caseNum)
  319 + #传值前最好要进行一个类型判断,以免数据类型没有转换正确,或者重复转换,导致调用接口时失败
  320 + #获取请求地址数据
  321 + url=get_api_config(api,'RequstURL', 'url')
  322 + #获取请求header数据
  323 + header=get_api_config(api,'RequstHeader', 'header')
  324 + if 'none' == header:
  325 + #header=str(获取有session和token的header)
  326 + pass
  327 + #获取请求body数据
  328 + body=get_api_config(api,caseNum,requestBody)
  329 + #获取请求备注内容
  330 + notes=get_api_config(api,caseNum,'notes')
  331 + #获取请求期望json格式
  332 + expect_Response=get_api_config(api,caseNum,'expect_Response')
  333 + #把转换header类型
  334 + test_headers=json.loads(header)
  335 + #避免日志中的中文乱码,进行编码转换
  336 + test_body=json.dumps(json.loads(body)).decode('unicode_escape')
  337 + #调用post请求
  338 + r = requests.post(url, data=body, headers=test_headers,verify=False)
  339 + #进行日志记录
  340 + log.info(u"NUM:%s | 请求备注 ==%s"%(caseNum,notes))
  341 + log.info(u"NUM:%s | 请求URL==%s"%(caseNum,url))
  342 + log.info(u"NUM:%s | 请求body==%s"%(caseNum,test_body))
  343 + log.info(u"NUM:%s | 请求实际响应格式 ==%s"%(caseNum,r.content))
  344 + log.info(u"NUM:%s | 请求期望响应格式 ==%s"%(caseNum,expect_Response))
  345 + #判断请求是否成功
  346 + if r.status_code == 200:
  347 + # 关闭请求 释放内存
  348 + r.close()
  349 + return r
  350 + else:
  351 + r.close()
  352 + log.error(u"Request code==%s ! Response Code is not 200,Pls Check Your Request Datas"%(r.status_code))
  353 + raise Exception(u"Request Fail! Response Code is not 200,Pls Check Your Request Datas")
  354 +
  355 +
  356 +# a='https://gateway.fresh.nong12.com/getCityByPosition?lat=30.661286&lng=104.067624'
  357 +# b={
  358 +# "Host": "gateway.fresh.nong12.com",
  359 +# "Content-Type": "application/json",
  360 +# "referer": "https://servicewechat.com/wxd1405e5c40ff05db/0/page-frame.html",
  361 +# "apiusertoken": "dili-fresh-token",
  362 +# "charset": "utf-8",
  363 +# "Accept-Encoding": "gzip",
  364 +# "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x2607033D) NetType/WIFI Language/zh_CN Process/appbrand2"
  365 +# }
  366 +# print get_request('getCityByPosition','getCityByPosition01').json()
  367 +# a= get_api_config('submitOrder', 'RequstHeader', 'header')
  368 +# b= get_global_config('basic_data_prepare', 'instert_customer')
  369 +# print(a)
  370 +# print(b)
  371 +# print type(a)
  372 +# a=json.loads(a)
  373 +# print a
  374 +# a=json.dumps(a)
  375 +# print a
  376 +# print a
  377 +# a=post_request('nearBy', 'nearBy01', 'requestBody')
  378 +# # b=get_api_config('listCoupon', 'listCoupon01', 'expect_Response')
  379 +# print a.json()
  380 +# print json_compare(b, a.json())
  381 +# a=['code', 'data', 'result', 'success']
  382 +# b=['code', 'data', 'result', 'success']
  383 +# print str(b)
  384 +# print json_compare(str(b), a)
  385 +
  386 +# print a.content
  387 +# a=post_request('www.baidu.com/',"" ,"" )
  388 +# print a.headers
  389 +# print type(a)
  390 +# b=json.loads(a)
  391 +# c=json.dumps(json.loads(a)).decode('unicode_escape')
  392 +# print c
  393 +# a={"code":"200","data":{"code":"200","data":[],"result":"OK","success":1},"result":"OK","success":2}
  394 +# b={"code":"200","data":{"code":"200","data":[{"couponBizType":1,"couponCode":"004","couponConditionValue":0,"couponDescription":"auto","couponDiscount":1000,"couponDuration":10,"couponName":"成勇测试01","couponTimeEnd":"2025-01-26 23:59:59","couponTimeSt":"2019-01-17 00:00:00","couponType":2,"created":"2019-01-17 15:14:15","customerCode":"00010966","id":10000,"isUsable":2,"state":1,"version":1}],"result":"OK","success":2},"result":"OK","success":2}
  395 +# print type(a),type(b)
  396 +# prjson_cmp(a, b)
0 \ No newline at end of file 397 \ No newline at end of file
src/config/__init__.py 0 → 100644
src/config/api/arrivalUnderTakeOrder.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[arrivalUnderTakeOrder01]
  4 +url=http://oms.tms.nong12.com/transportOrder/arrivalUnderTakeOrder.action?code=UO20191202000003&arrivalNum=5&arrivalWeight=5.0&stevedore=卸货人&loadingPlaceId=10&arrivalTime=2019-12-02&attachments=
  5 +
  6 +body=""
  7 +
  8 +expect_response={"code":"200","message":"OK","result":"OK","success":true}
  9 +
  10 +
src/config/api/customerOrderSubmit.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[customerOrderSubmit01]
  4 +url=http://oms.tms.nong12.com/undertakeDemandCenter/customerOrderSubmit.action
  5 +
  6 +update_header01={"Content-Type":"application/json;charset=UTF-8","Referer":"http://oms.tms.nong12.com/undertakeDemandCenter/orderSplit.html"}
  7 +
  8 +
  9 +body=[{"code":"CO20191126000037","splitMap":{"SC201905210001":5}},{"code":"CO20191126000037","splitMap":{"SC201905210001":5}}]
  10 +
  11 +expect_response={"code":"200","data":["UO20191202000001","UO20191202000002"],"message":"新增成功","result":"新增成功","success":true}
  12 +
  13 +
src/config/api/departTransportOrder.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[departTransportOrder01]
  4 +url=http://oms.tms.nong12.com/transportOrder/departTransportOrder.action
  5 +
  6 +body={"id":"666"}
  7 +
  8 +expect_response={"code":"200","message":"OK","result":"OK","success":true}
  9 +
  10 +
src/config/api/login.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[login01]
  4 +url=http://tms.nong12.com/login/login.action
  5 +
  6 +header={"Host":"tms.nong12.com",
  7 + "Connection":"keep-alive",
  8 + "Content-Length":"48",
  9 + "Cache-Control":"max-age=0",
  10 + "Origin":"http://tms.nong12.com",
  11 + "Upgrade-Insecure-Requests":"1",
  12 + "Content-Type":"application/json",
  13 + "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3493.3 Safari/537.36",
  14 + "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
  15 + "Referer":"http://tms.nong12.com/login/login.action",
  16 + "Accept-Encoding":"gzip, deflate",
  17 + "Accept-Language":"zh-CN,zh-TW;q=0.9,zh;q=0.8",
  18 + "Cookie":"u=424; n=wenze; loginPath=http://tms.nong12.com/login/login.action; TMS_userId=69; TMS_username=wenze; TMS_SessionId="}
  19 +
  20 +body={"userName": "wenze", "password": "666666"}
  21 +
  22 +
  23 +
  24 +
  25 +
  26 +
  27 +
  28 +[basic_data_prepare]
  29 +#商品
  30 +instert_product=INSERT INTO product.product VALUES ('301', '16', '猕猴桃', 'PD2019021000000001', '猕猴桃', 'dili-fresh/groupbuy/7f9fc034c2ec41e18b7560fc42a25abd', '2019-01-29 08:00:00', '2020-12-12 00:00:00', '2019-02-02 10:00:00', '2019-12-11 20:00:00', '600', '<p>预售商品,次日取货。</p><p>预计到店时间:2月3日14点之后。</p><p>到货后群内通知。</p><p><img style=\"max-width:100%;\" src=\"http://img10.nong12.com/dili-fresh/groupbuy/c4aa09d06af948f09269cd0d367fa623\"><br></p><p><br></p>', '2019-01-29 15:48:19', '1', '2019-02-02 10:13:33', '39', '4', '0', '400', '0');
  31 +#商品
  32 +instert_product_tag=INSERT INTO product.product_tag VALUES ('500', '1', '300', null, null, '2019-02-10 10:13:34', '2019-02-10 10:13:33');
  33 +instert_tag=INSERT INTO `tag` VALUES ('1', '年货爆款', '26', '2019-01-14 11:24:48', '26', '2019-03-05 14:13:46', '27');
  34 +instert_product_stock1=INSERT INTO product.area_stock VALUES ('500', '300', '600', '1000', '0', '1000', '1', '510100', '2019-02-02 10:13:33', '999', null, '2019-01-29 15:48:19', null, '6', '0', '3.00', '1000');
  35 +instert_product_stock2=INSERT INTO product.area_stock VALUES ('501', '300', '600', '1000', '0', '1000', '1', '210100', '2019-02-02 16:40:49', '999', null, '2019-01-29 15:48:19', null, '78', '0', '3.00', '1000');
  36 +instert_shop=INSERT INTO `shop` VALUES ('116', '成都SAC新店0001', 'S001953', 'W000101', '00010953', '四川省成都市青羊区天府广场', null, '510100', null, '30.663420320381004', '104.07219216758062', null, '李老板', '15111888983', null, null, '天府广场', '3', null, '1', '1', '2019-02-11 14:12:01', null, null, null);
  37 +instert_wallet=INSERT INTO `wallet` VALUES ('11845', '00010953', '0', '0', '0', '1', '0', '2019-02-11 12:08:50', '2019-02-11 12:08:50', null, null);
  38 +
  39 +[data_clean]
  40 +delete_product=DELETE FROM product.product WHERE id = 300;
  41 +delete_product_tag=DELETE FROM product.product_tag WHERE product_tag.product_id = 300;
  42 +delete_product_stock=DELETE FROM product.area_stock WHERE area_stock.product_id = 300;
  43 +
  44 +
  45 +[submitOrder01]
  46 +notes="下单成功:优惠券为空,其他参数传入有效值"
  47 +delete_order=DELETE FROM `customer_coupon` WHERE code = 10000;
  48 +requestBody={
  49 + "payCredential": "1548316340046",
  50 + "customerCode": "00010966",
  51 + "amount": 0,
  52 + "source": "wechatApplet",
  53 + "deliveryMethod": "homeDelivery",
  54 + "cityId": "510100",
  55 + "cityName": "成都市",
  56 + "shopCode": "S001953",
  57 + "shopName": "成都SAC新店0001",
  58 + "useFreeAmount": 0,
  59 + "items": [{
  60 + "areaId": "510100",
  61 + "productId": 301,
  62 + "productCode": "PD2019021100000001",
  63 + "productName": "猕猴桃",
  64 + "price": 0,
  65 + "quantity": 1
  66 + }]
  67 + }
  68 +expect_Response={"code":"200","data":{"nonceStr":"APm6DY1wlK7cGkVbOAqe","orderCode":"O2019021400000009","pacKage":"prepay_id=1550137322575","payEnable":2,"paySign":"470D0E4BD0A2F13F8772DF29A6B7B206","signType":"MD5","timeStamp":"1550137323166"},"result":"OK","success":1}
  69 +
  70 +
  71 +[submitOrder02]
  72 +notes="下单失败:商品为空时,优惠券为空,其他参数填入有效值"
  73 +requestBody={
  74 + "payCredential": "1548316340046",
  75 + "customerCode": "00010966",
  76 + "amount": 0,
  77 + "source": "wechatApplet",
  78 + "deliveryMethod": "homeDelivery",
  79 + "cityId": "510100",
  80 + "cityName": "成都市",
  81 + "shopCode": "S001953",
  82 + "shopName": "成都SAC新店0001",
  83 + "useFreeAmount": 0,
  84 + "items": []
  85 + }
  86 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  87 +
  88 +[submitOrder03]
  89 +notes="下单成功:使用有效优惠券,其他参数填入有效值"
  90 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  91 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010966', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-26 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  92 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  93 +requestBody={
  94 + "payCredential": "1548323014928",
  95 + "customerCode": "00010966",
  96 + "amount": 0,
  97 + "source": "wechatApplet",
  98 + "deliveryMethod": "homeDelivery",
  99 + "cityId": "510100",
  100 + "cityName": "成都市",
  101 + "shopCode": "S001953",
  102 + "shopName": "成都SAC新店0001",
  103 + "useFreeAmount": 0,
  104 + "items": [{
  105 + "areaId": "510100",
  106 + "productId": 301,
  107 + "productCode": "PD2019011700000052",
  108 + "productName": "猕猴桃",
  109 + "price": 0,
  110 + "quantity": 1
  111 + }],
  112 + "customerCouponId": 10000
  113 + }
  114 +expect_Response={"code":"200","data":{"nonceStr":"APm6DY1wlK7cGkVbOAqe","orderCode":"O2019021400000009","pacKage":"prepay_id=1550137322575","payEnable":2,"paySign":"470D0E4BD0A2F13F8772DF29A6B7B206","signType":"MD5","timeStamp":"1550137323166"},"result":"OK","success":1}
  115 +
  116 +
  117 +
  118 +[submitOrder04]
  119 +notes="下单失败:支付用已经使用过的优惠券"
  120 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  121 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '0', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-26 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  122 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  123 +requestBody={
  124 + "payCredential": "1548323014928",
  125 + "customerCode": "00010966",
  126 + "amount": 0,
  127 + "source": "wechatApplet",
  128 + "deliveryMethod": "homeDelivery",
  129 + "cityId": "510100",
  130 + "cityName": "成都市",
  131 + "shopCode": "S001953",
  132 + "shopName": "成都SAC新店0001",
  133 + "useFreeAmount": 0,
  134 + "items": [{
  135 + "areaId": "510100",
  136 + "productId": 301,
  137 + "productCode": "PD2019021100000001",
  138 + "productName": "猕猴桃",
  139 + "price": 0,
  140 + "quantity": 1
  141 + }],
  142 + "customerCouponId": 10000
  143 + }
  144 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  145 +
  146 +
  147 +[submitOrder05]
  148 +notes="下单失败:支付用过期的优惠券"
  149 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  150 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2019-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  151 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  152 +requestBody={
  153 + "payCredential": "1548323014928",
  154 + "customerCode": "00010966",
  155 + "amount": 0,
  156 + "source": "wechatApplet",
  157 + "deliveryMethod": "homeDelivery",
  158 + "cityId": "510100",
  159 + "cityName": "成都市",
  160 + "shopCode": "S001953",
  161 + "shopName": "成都SAC新店0001",
  162 + "useFreeAmount": 0,
  163 + "items": [{
  164 + "areaId": "510100",
  165 + "productId": 301,
  166 + "productCode": "PD2019021100000001",
  167 + "productName": "猕猴桃",
  168 + "price": 0,
  169 + "quantity": 1
  170 + }],
  171 + "customerCouponId": 10000
  172 + }
  173 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  174 +
  175 +[submitOrder06]
  176 +notes="下单失败:支付用别人的优惠券"
  177 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  178 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00001008', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  179 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  180 +requestBody={
  181 + "payCredential": "1548323014928",
  182 + "customerCode": "00010966",
  183 + "amount": 0,
  184 + "source": "wechatApplet",
  185 + "deliveryMethod": "homeDelivery",
  186 + "cityId": "510100",
  187 + "cityName": "成都市",
  188 + "shopCode": "S001953",
  189 + "shopName": "成都SAC新店0001",
  190 + "useFreeAmount": 0,
  191 + "items": [{
  192 + "areaId": "510100",
  193 + "productId": 301,
  194 + "productCode": "PD2019021100000001",
  195 + "productName": "猕猴桃",
  196 + "price": 0,
  197 + "quantity": 1
  198 + }],
  199 + "customerCouponId": 10000
  200 + }
  201 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  202 +
  203 +
  204 +[submitOrder07]
  205 +notes="下单失败:支付用未到期的优惠券"
  206 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  207 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2025-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  208 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  209 +requestBody={
  210 + "payCredential": "1548323014928",
  211 + "customerCode": "00010966",
  212 + "amount": 0,
  213 + "source": "wechatApplet",
  214 + "deliveryMethod": "homeDelivery",
  215 + "cityId": "510100",
  216 + "cityName": "成都市",
  217 + "shopCode": "S001953",
  218 + "shopName": "成都SAC新店0001",
  219 + "useFreeAmount": 0,
  220 + "items": [{
  221 + "areaId": "510100",
  222 + "productId": 301,
  223 + "productCode": "PD2019021100000001",
  224 + "productName": "猕猴桃",
  225 + "price": 0,
  226 + "quantity": 1
  227 + }],
  228 + "customerCouponId": 10000
  229 + }
  230 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  231 +
  232 +[submitOrder08]
  233 +notes="下单失败:支付用未满减条件的优惠券"
  234 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  235 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '1000', '2019-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  236 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  237 +requestBody={
  238 + "payCredential": "1548323014928",
  239 + "customerCode": "00010966",
  240 + "amount": 0,
  241 + "source": "wechatApplet",
  242 + "deliveryMethod": "homeDelivery",
  243 + "cityId": "510100",
  244 + "cityName": "成都市",
  245 + "shopCode": "S001953",
  246 + "shopName": "成都SAC新店0001",
  247 + "useFreeAmount": 0,
  248 + "items": [{
  249 + "areaId": "510100",
  250 + "productId": 301,
  251 + "productCode": "PD2019021100000001",
  252 + "productName": "猕猴桃",
  253 + "price": 0,
  254 + "quantity": 1
  255 + }],
  256 + "customerCouponId": 10000
  257 + }
  258 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  259 +
  260 +[submitOrder09]
  261 +notes="下单失败:使用被关闭的自提点"
  262 +shop_shutdown=UPDATE `fresh-uap`.shop SET state = 4 WHERE code = 'S001953' ;
  263 +shop_open=UPDATE `fresh-uap`.shop SET state = 3 WHERE code = 'S001953' ;
  264 +requestBody={
  265 + "payCredential": "1548323014928",
  266 + "customerCode": "00010966",
  267 + "amount": 0,
  268 + "source": "wechatApplet",
  269 + "deliveryMethod": "homeDelivery",
  270 + "cityId": "510100",
  271 + "cityName": "成都市",
  272 + "shopCode": "S001953",
  273 + "shopName": "成都SAC新店0001",
  274 + "useFreeAmount": 0,
  275 + "items": [{
  276 + "areaId": "510100",
  277 + "productId": 301,
  278 + "productCode": "PD2019021100000001",
  279 + "productName": "猕猴桃",
  280 + "price": 0,
  281 + "quantity": 1
  282 + }]
  283 + }
  284 +expect_Response={"code":"5000","result":"自提点异常","success":false}
  285 +
  286 +
  287 +[submitOrder10]
  288 +notes="下单失败:客户被禁用时下单"
  289 +customer_disable=UPDATE customer.customer SET enabled_state = 0 WHERE `code` = 00010966 ;
  290 +customer_enable=UPDATE customer.customer SET enabled_state = 1 WHERE `code` = 00010966 ;
  291 +requestBody={
  292 + "payCredential": "1548323014928",
  293 + "customerCode": "00010966",
  294 + "amount": 0,
  295 + "source": "wechatApplet",
  296 + "deliveryMethod": "homeDelivery",
  297 + "cityId": "510100",
  298 + "cityName": "成都市",
  299 + "shopCode": "S001953",
  300 + "shopName": "成都SAC新店0001",
  301 + "useFreeAmount": 0,
  302 + "items": [{
  303 + "areaId": "510100",
  304 + "productId": 301,
  305 + "productCode": "PD2019021100000001",
  306 + "productName": "猕猴桃",
  307 + "price": 0,
  308 + "quantity": 1
  309 + }]
  310 + }
  311 +expect_Response={"code":"5000","result":"账户被禁用","success":false}
  312 +
  313 +[submitOrder11]
  314 +notes="下单失败:购买其他地区的商品"
  315 +requestBody={
  316 + "payCredential": "1548316340046",
  317 + "customerCode": "00010966",
  318 + "amount": 0,
  319 + "source": "wechatApplet",
  320 + "deliveryMethod": "homeDelivery",
  321 + "cityId": "510100",
  322 + "cityName": "成都市",
  323 + "shopCode": "S001953",
  324 + "shopName": "成都SAC新店0001",
  325 + "useFreeAmount": 0,
  326 + "items": [{
  327 + "areaId": "110100",
  328 + "productId": 301,
  329 + "productCode": "PD2019021100000001",
  330 + "productName": "猕猴桃",
  331 + "price": 0,
  332 + "quantity": 1
  333 + }]
  334 + }
  335 +expect_Response={"code":"5000","result":"商品沈阳独立商品超过购买限制,限制购买总数为0","success":false}
0 \ No newline at end of file 336 \ No newline at end of file
src/config/api/saveOrUpdate.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[saveOrUpdate01]
  4 +url=http://oms.tms.nong12.com/customerOrder/saveOrUpdate.action
  5 +
  6 +update_header01={"X-Requested-With": "XMLHttpRequest","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","Origin":"http://tms.nong12.com","Referer":"http://oms.tms.nong12.com/customerOrder"}
  7 +
  8 +update_header02={"Accept": "application/json, text/javascript, */*; q=0.01","Host":"oms.tms.nong12.com","Connection":"keep-alive"}
  9 +
  10 +body={
  11 + "customerCellphone": "18628307268",
  12 + "customerCode": "CUSO201907220001",
  13 + "customerName": "火影",
  14 + "transportWay": "test",
  15 + "demandSources": "webChatApp",
  16 + "amount": "",
  17 + "demandDescription": "经济",
  18 + "shippingCustomer": "火影",
  19 + "shippingContactName": "火影",
  20 + "shippingContactNumber": "18628307268",
  21 + "shipping_city": "拉萨",
  22 + "shippingCityId": "14",
  23 + "shippingAddress": "刚刚",
  24 + "requestedShipDate": "2019-08-15",
  25 + "shippingDesc": "",
  26 + "receiptCustomer": "水星",
  27 + "receiptContactName": "水星",
  28 + "receiptContactNumber": "13111555555",
  29 + "receipt_city": "成都",
  30 + "receiptCityId": "9",
  31 + "receiptAddress": "哦哦哦",
  32 + "tradeId": "",
  33 + "tradeCard": "",
  34 + "requestedReceiptDate": "2019-08-15",
  35 + "receiptDesc": "",
  36 + "productName1": "国光苹果",
  37 + "categoryId1": "312",
  38 + "specificationCode1": "SC201905210001",
  39 + "total1": "10",
  40 + "singleWeight1": "1.0",
  41 + "weight1": "10",
  42 + "transportCondition1": "ordinary",
  43 + "transportDesc1": "经济",
  44 + "goodsList[0][categoryId]": "312",
  45 + "goodsList[0][specificationCode]": "SC201905210001",
  46 + "goodsList[0][total]": "10",
  47 + "goodsList[0][singleWeight]": "1.0",
  48 + "goodsList[0][weight]": "10",
  49 + "goodsList[0][transportCondition]": "ordinary",
  50 + "goodsList[0][transportDesc]": "经济",
  51 + "goodsList[0][ruleId]": "82",
  52 + "firmCode": "CC201905200058",
  53 + "settlementMethod": "arrived",
  54 + "expense": "1000",
  55 + "expenseMap[r_82]": "1000"}
  56 +
  57 +expect_response={"code":"200","data":951,"message":"创建客户订单成功","result":"创建客户订单成功","success":true}
  58 +
src/config/api/submitOrder.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[RequstURL]
  4 +URL=http://10.28.12.154:8085/submitOrder
  5 +
  6 +[RequstHeader]
  7 +header = {
  8 + "Host": "10.28.12.154:8085",
  9 + "Content-Type": "application/json",
  10 + "referer": "https://servicewechat.com/wxd1405e5c40ff05db/0/page-frame.html",
  11 + "apiusertoken": "dili-fresh-token",
  12 + "charset": "utf-8",
  13 + "Accept-Encoding": "gzip",
  14 + "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x2607033D) NetType/WIFI Language/zh_CN Process/appbrand2"
  15 + }
  16 +headers=none
  17 +headers1={"id":"你好","name": "test"}
  18 +headers2=["id":"你好","name": "test"]
  19 +
  20 +
  21 +
  22 +[RequstStructrue]
  23 +structrue={
  24 + "payCredential": "1548316340046",
  25 + "customerCode": "00010966",
  26 + "amount": 0,
  27 + "source": "wechatApplet",
  28 + "deliveryMethod": "homeDelivery",
  29 + "cityId": "510100",
  30 + "cityName": "成都市",
  31 + "shopCode": "S001953",
  32 + "shopName": "成都SAC新店0001","useFreeAmount": 0,
  33 + "items": [{
  34 + "areaId": "510100",
  35 + "productId": 301,
  36 + "productCode": "PD2019011700000052",
  37 + "productName": "猕猴桃",
  38 + "price": 0,
  39 + "quantity": 1
  40 + }]
  41 + }
  42 +
  43 +[basic_data_prepare]
  44 +#商品
  45 +instert_product=INSERT INTO product.product VALUES ('301', '16', '猕猴桃', 'PD2019021000000001', '猕猴桃', 'dili-fresh/groupbuy/7f9fc034c2ec41e18b7560fc42a25abd', '2019-01-29 08:00:00', '2020-12-12 00:00:00', '2019-02-02 10:00:00', '2019-12-11 20:00:00', '600', '<p>预售商品,次日取货。</p><p>预计到店时间:2月3日14点之后。</p><p>到货后群内通知。</p><p><img style=\"max-width:100%;\" src=\"http://img10.nong12.com/dili-fresh/groupbuy/c4aa09d06af948f09269cd0d367fa623\"><br></p><p><br></p>', '2019-01-29 15:48:19', '1', '2019-02-02 10:13:33', '39', '4', '0', '400', '0');
  46 +#商品
  47 +instert_product_tag=INSERT INTO product.product_tag VALUES ('500', '1', '300', null, null, '2019-02-10 10:13:34', '2019-02-10 10:13:33');
  48 +instert_tag=INSERT INTO `tag` VALUES ('1', '年货爆款', '26', '2019-01-14 11:24:48', '26', '2019-03-05 14:13:46', '27');
  49 +instert_product_stock1=INSERT INTO product.area_stock VALUES ('500', '300', '600', '1000', '0', '1000', '1', '510100', '2019-02-02 10:13:33', '999', null, '2019-01-29 15:48:19', null, '6', '0', '3.00', '1000');
  50 +instert_product_stock2=INSERT INTO product.area_stock VALUES ('501', '300', '600', '1000', '0', '1000', '1', '210100', '2019-02-02 16:40:49', '999', null, '2019-01-29 15:48:19', null, '78', '0', '3.00', '1000');
  51 +instert_shop=INSERT INTO `shop` VALUES ('116', '成都SAC新店0001', 'S001953', 'W000101', '00010953', '四川省成都市青羊区天府广场', null, '510100', null, '30.663420320381004', '104.07219216758062', null, '李老板', '15111888983', null, null, '天府广场', '3', null, '1', '1', '2019-02-11 14:12:01', null, null, null);
  52 +instert_wallet=INSERT INTO `wallet` VALUES ('11845', '00010953', '0', '0', '0', '1', '0', '2019-02-11 12:08:50', '2019-02-11 12:08:50', null, null);
  53 +
  54 +[data_clean]
  55 +delete_product=DELETE FROM product.product WHERE id = 300;
  56 +delete_product_tag=DELETE FROM product.product_tag WHERE product_tag.product_id = 300;
  57 +delete_product_stock=DELETE FROM product.area_stock WHERE area_stock.product_id = 300;
  58 +
  59 +
  60 +[submitOrder01]
  61 +notes="下单成功:优惠券为空,其他参数传入有效值"
  62 +delete_order=DELETE FROM `customer_coupon` WHERE code = 10000;
  63 +requestBody={
  64 + "payCredential": "1548316340046",
  65 + "customerCode": "00010966",
  66 + "amount": 0,
  67 + "source": "wechatApplet",
  68 + "deliveryMethod": "homeDelivery",
  69 + "cityId": "510100",
  70 + "cityName": "成都市",
  71 + "shopCode": "S001953",
  72 + "shopName": "成都SAC新店0001",
  73 + "useFreeAmount": 0,
  74 + "items": [{
  75 + "areaId": "510100",
  76 + "productId": 301,
  77 + "productCode": "PD2019021100000001",
  78 + "productName": "猕猴桃",
  79 + "price": 0,
  80 + "quantity": 1
  81 + }]
  82 + }
  83 +expect_Response={"code":"200","data":{"nonceStr":"APm6DY1wlK7cGkVbOAqe","orderCode":"O2019021400000009","pacKage":"prepay_id=1550137322575","payEnable":2,"paySign":"470D0E4BD0A2F13F8772DF29A6B7B206","signType":"MD5","timeStamp":"1550137323166"},"result":"OK","success":1}
  84 +
  85 +
  86 +[submitOrder02]
  87 +notes="下单失败:商品为空时,优惠券为空,其他参数填入有效值"
  88 +requestBody={
  89 + "payCredential": "1548316340046",
  90 + "customerCode": "00010966",
  91 + "amount": 0,
  92 + "source": "wechatApplet",
  93 + "deliveryMethod": "homeDelivery",
  94 + "cityId": "510100",
  95 + "cityName": "成都市",
  96 + "shopCode": "S001953",
  97 + "shopName": "成都SAC新店0001",
  98 + "useFreeAmount": 0,
  99 + "items": []
  100 + }
  101 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  102 +
  103 +[submitOrder03]
  104 +notes="下单成功:使用有效优惠券,其他参数填入有效值"
  105 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  106 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010966', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-26 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  107 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  108 +requestBody={
  109 + "payCredential": "1548323014928",
  110 + "customerCode": "00010966",
  111 + "amount": 0,
  112 + "source": "wechatApplet",
  113 + "deliveryMethod": "homeDelivery",
  114 + "cityId": "510100",
  115 + "cityName": "成都市",
  116 + "shopCode": "S001953",
  117 + "shopName": "成都SAC新店0001",
  118 + "useFreeAmount": 0,
  119 + "items": [{
  120 + "areaId": "510100",
  121 + "productId": 301,
  122 + "productCode": "PD2019011700000052",
  123 + "productName": "猕猴桃",
  124 + "price": 0,
  125 + "quantity": 1
  126 + }],
  127 + "customerCouponId": 10000
  128 + }
  129 +expect_Response={"code":"200","data":{"nonceStr":"APm6DY1wlK7cGkVbOAqe","orderCode":"O2019021400000009","pacKage":"prepay_id=1550137322575","payEnable":2,"paySign":"470D0E4BD0A2F13F8772DF29A6B7B206","signType":"MD5","timeStamp":"1550137323166"},"result":"OK","success":1}
  130 +
  131 +
  132 +
  133 +[submitOrder04]
  134 +notes="下单失败:支付用已经使用过的优惠券"
  135 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  136 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '0', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-26 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  137 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  138 +requestBody={
  139 + "payCredential": "1548323014928",
  140 + "customerCode": "00010966",
  141 + "amount": 0,
  142 + "source": "wechatApplet",
  143 + "deliveryMethod": "homeDelivery",
  144 + "cityId": "510100",
  145 + "cityName": "成都市",
  146 + "shopCode": "S001953",
  147 + "shopName": "成都SAC新店0001",
  148 + "useFreeAmount": 0,
  149 + "items": [{
  150 + "areaId": "510100",
  151 + "productId": 301,
  152 + "productCode": "PD2019021100000001",
  153 + "productName": "猕猴桃",
  154 + "price": 0,
  155 + "quantity": 1
  156 + }],
  157 + "customerCouponId": 10000
  158 + }
  159 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  160 +
  161 +
  162 +[submitOrder05]
  163 +notes="下单失败:支付用过期的优惠券"
  164 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  165 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2019-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  166 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  167 +requestBody={
  168 + "payCredential": "1548323014928",
  169 + "customerCode": "00010966",
  170 + "amount": 0,
  171 + "source": "wechatApplet",
  172 + "deliveryMethod": "homeDelivery",
  173 + "cityId": "510100",
  174 + "cityName": "成都市",
  175 + "shopCode": "S001953",
  176 + "shopName": "成都SAC新店0001",
  177 + "useFreeAmount": 0,
  178 + "items": [{
  179 + "areaId": "510100",
  180 + "productId": 301,
  181 + "productCode": "PD2019021100000001",
  182 + "productName": "猕猴桃",
  183 + "price": 0,
  184 + "quantity": 1
  185 + }],
  186 + "customerCouponId": 10000
  187 + }
  188 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  189 +
  190 +[submitOrder06]
  191 +notes="下单失败:支付用别人的优惠券"
  192 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  193 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00001008', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2019-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  194 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  195 +requestBody={
  196 + "payCredential": "1548323014928",
  197 + "customerCode": "00010966",
  198 + "amount": 0,
  199 + "source": "wechatApplet",
  200 + "deliveryMethod": "homeDelivery",
  201 + "cityId": "510100",
  202 + "cityName": "成都市",
  203 + "shopCode": "S001953",
  204 + "shopName": "成都SAC新店0001",
  205 + "useFreeAmount": 0,
  206 + "items": [{
  207 + "areaId": "510100",
  208 + "productId": 301,
  209 + "productCode": "PD2019021100000001",
  210 + "productName": "猕猴桃",
  211 + "price": 0,
  212 + "quantity": 1
  213 + }],
  214 + "customerCouponId": 10000
  215 + }
  216 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  217 +
  218 +
  219 +[submitOrder07]
  220 +notes="下单失败:支付用未到期的优惠券"
  221 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  222 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '0', '2025-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  223 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  224 +requestBody={
  225 + "payCredential": "1548323014928",
  226 + "customerCode": "00010966",
  227 + "amount": 0,
  228 + "source": "wechatApplet",
  229 + "deliveryMethod": "homeDelivery",
  230 + "cityId": "510100",
  231 + "cityName": "成都市",
  232 + "shopCode": "S001953",
  233 + "shopName": "成都SAC新店0001",
  234 + "useFreeAmount": 0,
  235 + "items": [{
  236 + "areaId": "510100",
  237 + "productId": 301,
  238 + "productCode": "PD2019021100000001",
  239 + "productName": "猕猴桃",
  240 + "price": 0,
  241 + "quantity": 1
  242 + }],
  243 + "customerCouponId": 10000
  244 + }
  245 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  246 +
  247 +[submitOrder08]
  248 +notes="下单失败:支付用未满减条件的优惠券"
  249 +coupon_check=SELECT * FROM customer.customer_coupon WHERE id = 10000;
  250 +coupon_insert=INSERT INTO `customer_coupon` VALUES ('10000', '1', '00010953', '004', '成勇测试01', 'auto', '2', '1', '1000', '1000', '2019-01-17 00:00:00', '2025-01-18 23:59:59', '10', '2019-01-17 15:14:15', null, '1');
  251 +coupon_delete=DELETE FROM `customer_coupon` WHERE id = 10000;
  252 +requestBody={
  253 + "payCredential": "1548323014928",
  254 + "customerCode": "00010966",
  255 + "amount": 0,
  256 + "source": "wechatApplet",
  257 + "deliveryMethod": "homeDelivery",
  258 + "cityId": "510100",
  259 + "cityName": "成都市",
  260 + "shopCode": "S001953",
  261 + "shopName": "成都SAC新店0001",
  262 + "useFreeAmount": 0,
  263 + "items": [{
  264 + "areaId": "510100",
  265 + "productId": 301,
  266 + "productCode": "PD2019021100000001",
  267 + "productName": "猕猴桃",
  268 + "price": 0,
  269 + "quantity": 1
  270 + }],
  271 + "customerCouponId": 10000
  272 + }
  273 +expect_Response={"code":"5000","result":"优惠券不可用","success":false}
  274 +
  275 +[submitOrder09]
  276 +notes="下单失败:使用被关闭的自提点"
  277 +shop_shutdown=UPDATE `fresh-uap`.shop SET state = 4 WHERE code = 'S001953' ;
  278 +shop_open=UPDATE `fresh-uap`.shop SET state = 3 WHERE code = 'S001953' ;
  279 +requestBody={
  280 + "payCredential": "1548323014928",
  281 + "customerCode": "00010966",
  282 + "amount": 0,
  283 + "source": "wechatApplet",
  284 + "deliveryMethod": "homeDelivery",
  285 + "cityId": "510100",
  286 + "cityName": "成都市",
  287 + "shopCode": "S001953",
  288 + "shopName": "成都SAC新店0001",
  289 + "useFreeAmount": 0,
  290 + "items": [{
  291 + "areaId": "510100",
  292 + "productId": 301,
  293 + "productCode": "PD2019021100000001",
  294 + "productName": "猕猴桃",
  295 + "price": 0,
  296 + "quantity": 1
  297 + }]
  298 + }
  299 +expect_Response={"code":"5000","result":"自提点异常","success":false}
  300 +
  301 +
  302 +[submitOrder10]
  303 +notes="下单失败:客户被禁用时下单"
  304 +customer_disable=UPDATE customer.customer SET enabled_state = 0 WHERE `code` = 00010966 ;
  305 +customer_enable=UPDATE customer.customer SET enabled_state = 1 WHERE `code` = 00010966 ;
  306 +requestBody={
  307 + "payCredential": "1548323014928",
  308 + "customerCode": "00010966",
  309 + "amount": 0,
  310 + "source": "wechatApplet",
  311 + "deliveryMethod": "homeDelivery",
  312 + "cityId": "510100",
  313 + "cityName": "成都市",
  314 + "shopCode": "S001953",
  315 + "shopName": "成都SAC新店0001",
  316 + "useFreeAmount": 0,
  317 + "items": [{
  318 + "areaId": "510100",
  319 + "productId": 301,
  320 + "productCode": "PD2019021100000001",
  321 + "productName": "猕猴桃",
  322 + "price": 0,
  323 + "quantity": 1
  324 + }]
  325 + }
  326 +expect_Response={"code":"5000","result":"账户被禁用","success":false}
  327 +
  328 +[submitOrder11]
  329 +notes="下单失败:购买其他地区的商品"
  330 +requestBody={
  331 + "payCredential": "1548316340046",
  332 + "customerCode": "00010966",
  333 + "amount": 0,
  334 + "source": "wechatApplet",
  335 + "deliveryMethod": "homeDelivery",
  336 + "cityId": "510100",
  337 + "cityName": "成都市",
  338 + "shopCode": "S001953",
  339 + "shopName": "成都SAC新店0001",
  340 + "useFreeAmount": 0,
  341 + "items": [{
  342 + "areaId": "110100",
  343 + "productId": 301,
  344 + "productCode": "PD2019021100000001",
  345 + "productName": "猕猴桃",
  346 + "price": 0,
  347 + "quantity": 1
  348 + }]
  349 + }
  350 +expect_Response={"code":"5000","result":"商品沈阳独立商品超过购买限制,限制购买总数为0","success":false}
0 \ No newline at end of file 351 \ No newline at end of file
src/config/api/submitOrder.xlsx 0 → 100644
No preview for this file type
src/config/api/undertaskOrderSubmit.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[undertaskOrderSubmit01]
  4 +url=http://oms.tms.nong12.com/undertakeOrder/undertaskOrderSubmit.action
  5 +
  6 +update_header01={"Content-Type":"application/json;charset=UTF-8","Referer":"http://oms.tms.nong12.com/undertakeOrder/preSubmit.html"}
  7 +
  8 +body={"ids":["0","1097","1098"],"vt":"0017","vehicleType":"0017","vehicleTypeText":"电动车","driver":"好司机"}
  9 +
  10 +expect_response={"code":"200","message":"OK","result":"OK","success":true}
  11 +
  12 +
  13 +
src/config/api/updateTransportOrderLoaded.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +[updateTransportOrderLoaded01]
  4 +url=http://oms.tms.nong12.com/transportOrder/updateTransportOrderLoaded.action
  5 +
  6 +update_header01={"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8","Referer":"http://oms.tms.nong12.com/transportOrder/add.html"}
  7 +
  8 +
  9 +body={
  10 + "id": "638",
  11 + "driver": "好司机",
  12 + "licensePlate": "车辆信息666",
  13 + "undertTakeOrderUpdateDtoList[0].underTakeOrderId": "1101",
  14 + "undertTakeOrderUpdateDtoList[0].origin": "四川省,成都市,锦江区",
  15 + "undertTakeOrderUpdateDtoList[0].originId": "510104",
  16 + "undertTakeOrderUpdateDtoList[0].certificateUrl": "",
  17 + "undertTakeOrderUpdateDtoList[0].brand": "",
  18 + "undertTakeOrderUpdateDtoList[1].underTakeOrderId": "1102",
  19 + "undertTakeOrderUpdateDtoList[1].origin": "四川省,成都市,锦江区",
  20 + "undertTakeOrderUpdateDtoList[1].originId": "510104",
  21 + "undertTakeOrderUpdateDtoList[1].certificateUrl": "",
  22 + "undertTakeOrderUpdateDtoList[1].brand": "",
  23 + "feeMap[zhuanxiefei]": "0",
  24 + "feeMap[dakuang]": "0",
  25 + "loader": "装货王菲",
  26 + "loadingPlaceId": "31",
  27 + "attachments": "group1/M00/00/57/ChwMf13c4ZaAJwgDAACC74HdADg141.jpg"}
  28 +
  29 +expect_response={"code":"200","message":"OK","result":"OK","success":true}
  30 +
  31 +
src/config/global_data.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +
  4 +[RequstHeader_fresh]
  5 +header = {
  6 + "Host": "10.28.12.154:8085",
  7 + "Content-Type": "application/json",
  8 + "referer": "https://servicewechat.com/wxd1405e5c40ff05db/0/page-frame.html",
  9 + "apiusertoken": "dili-fresh-token",
  10 + "charset": "utf-8",
  11 + "Accept-Encoding": "gzip",
  12 + "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x2607033D) NetType/WIFI Language/zh_CN Process/appbrand2"
  13 + }
  14 +
  15 +[basic_data_prepare]
  16 +#客户
  17 +instert_customer=INSERT INTO `customer` VALUES ('16', '00010966', null, '', '123456789012345678901234567890*a', '15111888983', 'wechat', null, 'oK0VK5HUZDfMbXw-1oMVr0--GZ4g', '1', '0', 'S002300', '00011000', 'unknown', ' ', null, '1', '2019-03-27 17:05:00', '2019-02-11 17:28:26', null);
  18 +#自提点
  19 +instert_shop=INSERT INTO `shop` VALUES ('116', '成都SAC新店0001', 'S001953', 'W000101', '00010953', '四川省成都市青羊区天府广场', null, '510100', null, '30.663420320381004', '104.07219216758062', null, '李老板', '15111888983', null, null, '天府广场', '3', null, '1', '1', '2019-02-11 14:12:01', null, null, null);
  20 +#商品
  21 +instert_product=INSERT INTO product.product VALUES ('301', '16', '猕猴桃', 'PD2019021000000001', '猕猴桃', 'dili-fresh/groupbuy/7f9fc034c2ec41e18b7560fc42a25abd', '2019-01-29 08:00:00', '2020-12-12 00:00:00', '2019-02-02 10:00:00', '2019-12-11 20:00:00', '600', '<p>预售商品,次日取货。</p><p>预计到店时间:2月3日14点之后。</p><p>到货后群内通知。</p><p><img style=\"max-width:100%;\" src=\"http://img10.nong12.com/dili-fresh/groupbuy/c4aa09d06af948f09269cd0d367fa623\"><br></p><p><br></p>', '2019-01-29 15:48:19', '1', '2019-02-02 10:13:33', '39', '4', '0', '400', '0');
  22 +#商品标签
  23 +instert_product_tag=INSERT INTO `product_tag` VALUES ('818', '1', '301', null, null, '2019-04-02 15:50:48', '2019-04-02 15:50:45');
  24 +#标签
  25 +instert_tag=INSERT INTO `tag` VALUES ('1', '年货爆款', '26', '2019-01-14 11:24:48', '26', '2019-03-05 14:13:46', '27');
  26 +#成都商品库存
  27 +instert_product_stock1=INSERT INTO `area_stock` VALUES ('502', '301', '0', '740', '185', '925', '1', '510100', '2019-04-01 17:11:28', '999', null, '2019-02-11 14:20:50', null, '490', '573', '3.00', '1', '0');
  28 +#沈阳商品库存
  29 +instert_product_stock2=INSERT INTO `area_stock` VALUES ('503', '301', '0', '998', '2', '1000', '1', '210100', '2019-04-01 17:11:28', '999', null, '2019-02-11 14:20:50', null, '9', '5', '3.00', '1', '0');
  30 +#钱包余额
  31 +instert_wallet=INSERT INTO `wallet` VALUES ('11845', '00010953', '1000', '0', '1000', '1', '0', '2019-02-11 12:08:50', '2019-02-11 12:08:50', null, null);
  32 +#优惠券
  33 +instert_coupon=INSERT INTO `customer_coupon` VALUES ('10014', '0', '00010966', 'C000452', '1', null, '1', '1', '600', '0', '2019-03-12 00:00:00', '2019-04-30 23:59:59', '2', '2019-03-12 11:02:08', null, '3');
  34 +
  35 +
  36 +
  37 +
  38 +[Database]
  39 +dbhost=10.28.10.169
  40 +dbport=3306
  41 +dbname=tms
  42 +dbuser=root
  43 +dbpassword=123456
  44 +dbcharset=utf8
  45 +
src/config/session.conf 0 → 100644
  1 +# -*- coding: UTF-8 -*-
  2 +
  3 +
  4 +[RequstHeader_fresh]
  5 +header = {
  6 + "Host": "10.28.12.154:8085",
  7 + "Content-Type": "application/json",
  8 + "referer": "https://servicewechat.com/wxd1405e5c40ff05db/0/page-frame.html",
  9 + "apiusertoken": "dili-fresh-token",
  10 + "charset": "utf-8",
  11 + "Accept-Encoding": "gzip",
  12 + "User-Agent": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI NXT-AL10 Build/HUAWEINXT-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x2607033D) NetType/WIFI Language/zh_CN Process/appbrand2"
  13 + }
  14 +
  15 +[basic_data_prepare]
  16 +#客户
  17 +instert_customer=INSERT INTO `customer` VALUES ('16', '00010966', null, '', '123456789012345678901234567890*a', '15111888983', 'wechat', null, 'oK0VK5HUZDfMbXw-1oMVr0--GZ4g', '1', '0', 'S002300', '00011000', 'unknown', ' ', null, '1', '2019-03-27 17:05:00', '2019-02-11 17:28:26', null);
  18 +#自提点
  19 +instert_shop=INSERT INTO `shop` VALUES ('116', '成都SAC新店0001', 'S001953', 'W000101', '00010953', '四川省成都市青羊区天府广场', null, '510100', null, '30.663420320381004', '104.07219216758062', null, '李老板', '15111888983', null, null, '天府广场', '3', null, '1', '1', '2019-02-11 14:12:01', null, null, null);
  20 +#商品
  21 +instert_product=INSERT INTO product.product VALUES ('301', '16', '猕猴桃', 'PD2019021000000001', '猕猴桃', 'dili-fresh/groupbuy/7f9fc034c2ec41e18b7560fc42a25abd', '2019-01-29 08:00:00', '2020-12-12 00:00:00', '2019-02-02 10:00:00', '2019-12-11 20:00:00', '600', '<p>预售商品,次日取货。</p><p>预计到店时间:2月3日14点之后。</p><p>到货后群内通知。</p><p><img style=\"max-width:100%;\" src=\"http://img10.nong12.com/dili-fresh/groupbuy/c4aa09d06af948f09269cd0d367fa623\"><br></p><p><br></p>', '2019-01-29 15:48:19', '1', '2019-02-02 10:13:33', '39', '4', '0', '400', '0');
  22 +#商品标签
  23 +instert_product_tag=INSERT INTO `product_tag` VALUES ('818', '1', '301', null, null, '2019-04-02 15:50:48', '2019-04-02 15:50:45');
  24 +#标签
  25 +instert_tag=INSERT INTO `tag` VALUES ('1', '年货爆款', '26', '2019-01-14 11:24:48', '26', '2019-03-05 14:13:46', '27');
  26 +#成都商品库存
  27 +instert_product_stock1=INSERT INTO `area_stock` VALUES ('502', '301', '0', '740', '185', '925', '1', '510100', '2019-04-01 17:11:28', '999', null, '2019-02-11 14:20:50', null, '490', '573', '3.00', '1', '0');
  28 +#沈阳商品库存
  29 +instert_product_stock2=INSERT INTO `area_stock` VALUES ('503', '301', '0', '998', '2', '1000', '1', '210100', '2019-04-01 17:11:28', '999', null, '2019-02-11 14:20:50', null, '9', '5', '3.00', '1', '0');
  30 +#钱包余额
  31 +instert_wallet=INSERT INTO `wallet` VALUES ('11845', '00010953', '1000', '0', '1000', '1', '0', '2019-02-11 12:08:50', '2019-02-11 12:08:50', null, null);
  32 +#优惠券
  33 +instert_coupon=INSERT INTO `customer_coupon` VALUES ('10014', '0', '00010966', 'C000452', '1', null, '1', '1', '600', '0', '2019-03-12 00:00:00', '2019-04-30 23:59:59', '2', '2019-03-12 11:02:08', null, '3');
  34 +
  35 +
  36 +
  37 +
  38 +[Database]
  39 +dbhost=10.28.10.169
  40 +dbport=3306
  41 +dbname=customer
  42 +dbuser=root
  43 +dbpassword=123456
  44 +dbcharset=utf8
  45 +
src/config/token.conf 0 → 100644
  1 +[token]
  2 +token = 666
  3 +
src/main.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import sys,os
  4 +import getopt
  5 +import unittest
  6 +import time
  7 +# import HTMLTestRunner
  8 +import HTMLTestRunner_cn
  9 +import commons.SendEmail as em
  10 +import commons.common as com
  11 +from commons.Logging import Logger
  12 +#DiscoveringTestLoader解决了代码在liunx无法成功加载用例的问题
  13 +from discover import DiscoveringTestLoader
  14 +log=Logger()
  15 +
  16 +
  17 +def Create_Testcase_suite(filename=None,testclass=None,casename=None,emailaddr=False,priority=False,casemark=None):
  18 + '''可以拓展该方法,为读取相对路径,然后传入指定文件测试用例:
  19 + Create_Testcase_suite(最顶层用例文件Case_Sences,下一级具体接口文件,)
  20 + '''
  21 + testunit=unittest.TestSuite()
  22 + test_Loader = DiscoveringTestLoader()
  23 + #可以通过a="./Case_Report/test2.txt" 和a="E:/EclipseWorkspace/WorksapceDemo/Request-demo/src/Case_Report/test2.txt"
  24 + #来获取指定文件内容
  25 + path="./testcase/"
  26 + if filename:
  27 + #path=os.path.dirname(__file__)不能通过命令行获取当前文件路径,返回路径为空
  28 + #path=os.path.dirname(__file__)
  29 +# filename=path+"/testcase/"+filename
  30 + filename=path+filename
  31 + print("filename",filename)
  32 + else:
  33 +# listaa = "E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\testcase\\"
  34 + filename=path
  35 +
  36 + log.info("用例路径%s"%path)
  37 + print("filename==",filename)
  38 + #discover会展示有多少test_*.py的文件,然后for依次添加这些文件夹下test_*.py里面的testcase
  39 + #这个方法会识别指定目录下所有test_*.py文件和test_*.py文件中所有class *(unittest.TestCase)以及其中的case
  40 + #每一个接口文件下面都得添加一个_init_.py不然无法识别该文件下的test_*.py
  41 + #_init_.py把所在目录当作一个package处理, from-import 语句导入子包时需要用到它。 如果没有用到, 他们可以是空文件
  42 + #如引入package.module下的所有模块from package.module import *
  43 + #submitOrder文件下不加_init_.py时,test_submitOrder文件无法被搜索
  44 +
  45 + #提前设置用户自定义用例等级,提前设置全局变量以免报错
  46 + com.set_priority(priority)
  47 + #提前设置用户自定义用例标记,提前设置全局变量以免报错
  48 + com.set_mark(casemark)
  49 + #discover会把指定的文件都加载一遍,会把所有文件中class测试类外和if __name__ == "__main__"外的代码加载一遍,
  50 + #如果测试文件中有import公共方法Case_Method.ConfigAction,系统并不会去加载公共方法内的代码
  51 + #如果通过创建全局变量来控制case的优先级并再py文件中读取全局变量时,要提前给全局变量赋值,以免在discover用例文件时,全局变量还为空,会报错
  52 + log.info("222222")
  53 + if filename and testclass and casename:
  54 + print("1-1-1")
  55 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  56 + for test_suite in discover:
  57 + for test_class in test_suite:
  58 + if testclass in str(test_class):
  59 + for test_num in test_class:
  60 + if casename in str(test_num):
  61 + testunit.addTest(test_num)
  62 +
  63 + elif filename and testclass and (not casename):
  64 + print("1-1-0")
  65 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  66 + for test_suite in discover:
  67 + for test_class in test_suite:
  68 + if testclass in str(test_class):
  69 + testunit.addTests(test_class)
  70 +
  71 + elif filename and (not testclass) and (not casename):
  72 + print("1-0-0")
  73 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  74 + for test_suite in discover:
  75 + for test_class in test_suite:
  76 + testunit.addTests(test_class)
  77 +
  78 + elif (not filename) and (not testclass) and (not casename):
  79 + print("0-0-0")
  80 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  81 + for test_suite in discover:
  82 + for test_class in test_suite:
  83 + testunit.addTests(test_class)
  84 +
  85 + elif (not filename) and testclass and (not casename):
  86 + print("0-1-0")
  87 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  88 + for test_suite in discover:
  89 + for test_class in test_suite:
  90 + if testclass in str(test_class):
  91 + testunit.addTests(test_class)
  92 +
  93 + elif (not filename) and testclass and casename:
  94 + print("0-1-1")
  95 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  96 + for test_suite in discover:
  97 + for test_class in test_suite:
  98 + if testclass in str(test_class):
  99 + for test_num in test_class:
  100 + if casename in str(test_num):
  101 + testunit.addTest(test_num)
  102 +
  103 + elif filename and (not testclass) and casename:
  104 + print("1-0-1")
  105 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  106 + for test_suite in discover:
  107 + for test_class in test_suite:
  108 + for test_num in test_class:
  109 + if casename in str(test_num):
  110 + testunit.addTest(test_num)
  111 + else:
  112 + print("0-0-1")
  113 + discover=test_Loader.discover(filename,pattern='test_*.py',top_level_dir=None)
  114 + for test_suite in discover:
  115 + for test_class in test_suite:
  116 + for test_num in test_class:
  117 + if casename in str(test_num):
  118 + testunit.addTest(test_num)
  119 +
  120 + print(testunit)
  121 + log.info("发送的邮件地址%s:"%emailaddr)
  122 + log.info("运行的用例优先级%s:"%priority)
  123 + log.info("运行的用例标记%s:"%casemark)
  124 + log.info("测试用例加载结果%s"%testunit)
  125 +
  126 + now = time.strftime("%Y-%m-%d %H_%M_%S",time.localtime())
  127 + #获取当前文件的路径,sys.argv[0]为当前文件
  128 + path=os.path.dirname(os.path.abspath(sys.argv[0]))
  129 + #filename="E:\\EclipseWorkspace\\nong12test\\Request-fresh\\src\\Case_Report\\"+now+"_result.html"
  130 + report_file=path+"/report/"+now+"_result.html"
  131 + log.info("测试报告路径%s:"%report_file)
  132 + fp=open(report_file,'wb')
  133 +
  134 + runner=HTMLTestRunner_cn.HTMLTestRunner(
  135 + stream=fp,
  136 + title=u'搜索功能测试报告', #设置HTML报告的title
  137 + description=u'用例执行情况:',#设置HTML报告内容中的描述
  138 + verbosity = 2,#设置报告详细级别,设置为1时有bug,无法失败连续重跑,最好为2(已验证连续3个用例重跑)
  139 + retry=2, #设置重跑次数,默认为0
  140 + save_last_try=False) #为True,一个用例仅显示最后一次测试的结果;为False,则显示所有重试的结果;
  141 +
  142 + log.info("********运行测试用例********")
  143 + runner.run(testunit)
  144 + fp.close()
  145 +
  146 + if emailaddr:
  147 + em.send_email(report_file,emailaddr)
  148 + else:
  149 + em.send_email(report_file)
  150 +
  151 +def main_get(argv):
  152 + """
  153 + 通过 getopt模块 来识别参数demo, http://blog.csdn.net/ouyang_peng/
  154 + """
  155 +
  156 + _filename = False
  157 + _testclass = False
  158 + _casename = False
  159 + _emailaddr = []
  160 + _priority = []
  161 + _casemark = False
  162 +
  163 + try:
  164 + """
  165 + options, args = getopt.getopt(args, shortopts, longopts=[])
  166 +
  167 + 参数args:一般是sys.argv[1:]。过滤掉sys.argv[0],它是执行脚本的名字,不算做命令行参数。
  168 + 参数shortopts:短格式分析串。例如:"hp:i:",h后面没有冒号,表示后面不带参数;p和i后面带有冒号,表示后面带参数。
  169 + 参数longopts:长格式分析串列表。例如:["help", "ip=", "port="],help后面没有等号,表示后面不带参数;ip和port后面带冒号,表示后面带参数。
  170 +
  171 + 返回值options是以元组为元素的列表,每个元组的形式为:(选项串, 附加参数),如:('-i', '192.168.0.1')
  172 + 返回值args是个列表,其中的元素是那些不含'-'或'--'的参数。
  173 + 若命令行-c或--testclass后面不加任何值的话或报错,若-和c之间有空格,或者-c后面有连续两个参数,会导致参数不匹配
  174 + """
  175 + opts, args = getopt.getopt(argv, "hf:c:t:e:p:m:", ["help", "filename=", "testclass=", "casename=","emailaddr=","priority=","mark="])
  176 +
  177 + except getopt.GetoptError:
  178 + print('''Error: test_arg.py -f <filename> -c <testclass> -t <casename> -e <emailaddr> -p <priority> -m <mark>''')
  179 + print(''' or: test_arg.py --filename=<filename> --testclass=<testclass> --casename=<casename>
  180 + --emailaddr=<emailaddr> --priority=<priority> --mark=<mark>''')
  181 + sys.exit(2)
  182 +
  183 + # 处理 返回值options是以元组为元素的列表。
  184 +# print "opts",opts
  185 +# print "args",args
  186 +# print "argv",argv
  187 + for opt, arg in opts:
  188 + print('opt',opt)
  189 + print('arg',arg)
  190 + if opt in ("-h", "--help"):
  191 + print('''test_arg.py -f <filename> -c <testclass> -t <casename> -e <emailaddr> -p <priority> -m <mark>''')
  192 + print('''or: test_arg.py --filename=<filename> --testclass=<testclass> --casename=<casename>
  193 + --emailaddr=<emailaddr> --priority=<priority> --mark=<mark>''')
  194 + sys.exit()
  195 + elif opt in ("-f", "--filename"):
  196 + _filename = arg
  197 + elif opt in ("-c", "--testclass"):
  198 + _testclass = arg
  199 + elif opt in ("-t", "--casename"):
  200 + _casename = arg
  201 + elif opt in ("-e", "--emailaddr"):
  202 + _emailaddr.append(arg)
  203 + elif opt in ("-p", "--priority"):
  204 + #arg传入的都是字符串,控制优先级时需要转换
  205 + _priority.append(int(arg))
  206 + elif opt in ("-m", "--mark"):
  207 + #arg传入的都是字符串,控制优先级时需要转换
  208 + _casemark=arg
  209 +
  210 + print('filename=', _filename)
  211 + print('testclass=', _testclass)
  212 + print('casename=', _casename)
  213 + print('emailaddr=', _emailaddr)
  214 + print('priority=', _priority)
  215 + print('mark=', _casemark)
  216 +
  217 + print(len(sys.argv))
  218 +
  219 + # 打印 返回值args列表,即其中的元素是那些不含'-'或'--'的参数。
  220 + for i in range(0, len(sys.argv)):
  221 + print(u'输入参数 %s 为:%s' % (i + 1, sys.argv[i]))
  222 +
  223 + Create_Testcase_suite(filename=_filename,testclass=_testclass,casename=_casename,emailaddr=_emailaddr,priority=_priority,casemark=_casemark)
  224 +
  225 +
  226 +if __name__ == "__main__":
  227 + # sys.argv[1:]为要处理的参数列表,里边的项为用户输入的参数,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
  228 + main_get(sys.argv[1:])
  229 +
  230 +
src/main_bu.py 0 → 100644
  1 +#!/usr/bin/python
  2 +# -*- coding: UTF-8 -*-
  3 +import os,time
  4 +import unittest
  5 +import HTMLTestRunner_cn
  6 +import commons.SendEmail as em
  7 +
  8 +
  9 +if __name__ == "__main__":
  10 +
  11 + #递归查询测试用例
  12 + listaa = "E:\\EclipseWorkspace\\WorksapceDemo\\Request-demo2\\src\\testcase"
  13 + def Create_Testcase_suite():
  14 + '''可以拓展该方法,为读取相对路径,然后传入指定文件测试用例:
  15 + Create_Testcase_suite(最顶层用例文件Case_Sences,下一级具体接口文件,)
  16 + '''
  17 +
  18 + testunit=unittest.TestSuite()
  19 + #discover会展示有多少test_*.py的文件,然后for依次添加这些文件夹下test_*.py里面的testcase
  20 + #这个方法会识别指定目录下所有test_*.py文件和test_*.py文件中所有class *(unittest.TestCase)以及其中的case
  21 + #每一个接口文件下面都得添加一个_init_.py不然无法识别该文件下的test_*.py
  22 + #_init_.py把所在目录当作一个package处理, from-import 语句导入子包时需要用到它。 如果没有用到, 他们可以是空文件
  23 + #如引入package.module下的所有模块from package.module import *
  24 + #submitOrder文件下不加_init_.py时,test_submitOrder文件无法被搜索
  25 + discover=unittest.defaultTestLoader.discover(listaa,pattern='test_*.py',top_level_dir=None)
  26 + #dicover会按照class为一个单位把每一个文件下的每一个class单位下的所有用例都加载出来
  27 + print(discover)
  28 + for test_suite in discover:
  29 + testunit.addTests(test_suite)
  30 +# for test_case in test_suite:
  31 +# testunit.addTests(test_case)
  32 +# print(testunit)
  33 + return testunit
  34 + print(Create_Testcase_suite())
  35 + #创建测试报告
  36 + now = time.strftime("%Y-%m-%d %H_%M_%S",time.localtime())
  37 + filename="E:\\EclipseWorkspace\\WorksapceDemo\\Request-demo2\\src\\report\\"+now+"_result.html"
  38 + fp=open(filename,'wb')
  39 +
  40 + runner=HTMLTestRunner_cn.HTMLTestRunner(
  41 + stream=fp,
  42 + title=u'搜索功能测试报告',
  43 + description=u'用例执行情况:',
  44 + verbosity = 2)
  45 +
  46 + runner.run(Create_Testcase_suite())
  47 +# #发送测试报告
  48 +# em.send_email(filename)
  49 +#
  50 +# fp.close()
  51 +#
  52 +# data = open(filename, 'r')
  53 +# print(data.read())
0 \ No newline at end of file 54 \ No newline at end of file
src/report/123.jpg 0 → 100644

3.49 KB

src/report/2019-12-02 11_09_30_result.html 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3 +<html xmlns="http://www.w3.org/1999/xhtml">
  4 +<head>
  5 + <title>搜索功能测试报告</title>
  6 + <meta name="generator" content="HTMLTestRunner 0.8.3"/>
  7 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  8 +
  9 +<style type="text/css" media="screen">
  10 +body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
  11 +table { font-size: 100%; }
  12 +pre {
  13 + white-space: pre-wrap;
  14 + word-wrap: break-word;
  15 +}
  16 +
  17 +/* -- heading ---------------------------------------------------------------------- */
  18 +h1 {
  19 + font-size: 16pt;
  20 + color: gray;
  21 +}
  22 +.heading {
  23 + float:left;
  24 + width:30%;
  25 + margin-top: 0ex;
  26 + margin-bottom: 1ex;
  27 +}
  28 +
  29 +.heading .attribute {
  30 + margin-top: 1ex;
  31 + margin-bottom: 0;
  32 +}
  33 +
  34 +.heading .description {
  35 + margin-top: 4ex;
  36 + margin-bottom: 6ex;
  37 +}
  38 +
  39 +/* -- css div popup ------------------------------------------------------------------------ */
  40 +a.popup_link {
  41 +}
  42 +
  43 +a.popup_link:hover {
  44 + color: red;
  45 +}
  46 +.img{
  47 + height: 100%;
  48 + border-collapse: collapse;
  49 + border: 2px solid #777;
  50 +}
  51 +
  52 +.screenshots {
  53 + z-index: 100;
  54 + position:fixed;
  55 + height: 80%;
  56 + left: 50%;
  57 + top: 50%;
  58 + transform: translate(-50%,-50%);
  59 + display: none;
  60 +}
  61 +
  62 +.imgyuan{
  63 + height: 20px;
  64 + border-radius: 12px;
  65 + background-color: red;
  66 + padding-left: 13px;
  67 + margin: 0 auto;
  68 + position: relative;
  69 + top: -40px;
  70 + background-color: rgba(1, 150, 0, 0.3);
  71 +}
  72 +.imgyuan font{
  73 + border:1px solid white;
  74 + width:11px;
  75 + height:11px;
  76 + border-radius:50%;
  77 + margin-right: 9px;
  78 + margin-top: 4px;
  79 + display: block;
  80 + float: left;
  81 + background-color: white;
  82 +}
  83 +.close_shots {
  84 + background-image: url(data:image/png;base64,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/GMzLdsAAD+3aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzA2NyA3OS4xNTc3NDcsIDIwMTUvMDMvMzAtMjM6NDA6NDIgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk4NDVkYzlhLTM2NTEtMTFlOC1hMDRjLWMzZmRjNzFmNjFkZDwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDo3YzQ4OTMyZS0wM2FjLTIxNDctYTJiZi1iNmViOWU4ZDY2Y2Q8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmQ0ZjMzNDFjLTRkYjctZjc0YS1iZTAxLWYxMGEwMzNhNjg4ZDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wNC0wMlQxNjo0MToxMCswODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIEVsZW1lbnRzIDE0LjAgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y29udmVydGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5kZXJpdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3YzQ4OTMyZS0wM2FjLTIxNDctYTJiZi1iNmViOWU4ZDY2Y2Q8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDQtMDJUMTY6NDE6MTArMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBFbGVtZW50cyAxNC4wIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmQ0ZjMzNDFjLTRkYjctZjc0YS1iZTAxLWYxMGEwMzNhNjg4ZDwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3N0UmVmOmRvY3VtZW50SUQ+CiAgICAgICAgICAgIDxzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3N0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDQtMDJUMTY6MjM6NTUrMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNC0wMlQxNjo0MToxMCswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDQtMDJUMTY6NDE6MTArMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIEVsZW1lbnRzIDE0LjAgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx0aWZmOkltYWdlV2lkdGg+MjU0PC90aWZmOkltYWdlV2lkdGg+CiAgICAgICAgIDx0aWZmOkltYWdlTGVuZ3RoPjI1NDwvdGlmZjpJbWFnZUxlbmd0aD4KICAgICAgICAgPHRpZmY6Qml0c1BlclNhbXBsZT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+ODwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjg8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT44PC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC90aWZmOkJpdHNQZXJTYW1wbGU+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpTYW1wbGVzUGVyUGl4ZWw+MzwvdGlmZjpTYW1wbGVzUGVyUGl4ZWw+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpFeGlmVmVyc2lvbj4wMjIxPC9leGlmOkV4aWZWZXJzaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE1MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xNTA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg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);
  85 + background-size: 22px 22px;
  86 + -moz-background-size: 22px 22px;
  87 + background-repeat: no-repeat;
  88 + position: absolute;
  89 + top: 5px;
  90 + right: 5px;
  91 + height: 22px;
  92 + z-index: 99;
  93 + width: 22px;
  94 +}
  95 +.popup_window {
  96 + display: none;
  97 + position: relative;
  98 + left: 0px;
  99 + top: 0px;
  100 + padding: 10px;
  101 + background-color: #E6E6D6;
  102 + font-family: "Lucida Console", "Courier New", Courier, monospace;
  103 + text-align: left;
  104 + font-size: 8pt;
  105 +}
  106 +
  107 +}
  108 +/* -- report ------------------------------------------------------------------------ */
  109 +#show_detail_line {
  110 + float:left;
  111 + width:100%;
  112 + margin-top: 3ex;
  113 + margin-bottom: 1ex;
  114 +}
  115 +
  116 +#result_table {
  117 + margin: 1em 0;
  118 + width: 100%;
  119 + overflow: hidden;
  120 + background: #FFF;
  121 + color: #024457;
  122 + border-radius: 10px;
  123 + border: 1px solid #167F92;
  124 +}
  125 +#result_table th {
  126 + border: 1px solid #FFFFFF;
  127 + background-color: #167F92;
  128 + color: #FFF;
  129 + padding: 0.5em;
  130 + &:first-child {
  131 + display: table-cell;
  132 + text-align: center;
  133 + }
  134 + &:nth-child(2) {
  135 + display: table-cell;
  136 + span {display:none;}
  137 + &:after {content:attr(data-th);}
  138 + }
  139 + @media (min-width: 480px) {
  140 + &:nth-child(2) {
  141 + span {display: block;}
  142 + &:after {display: none;}
  143 + }
  144 + }
  145 + }
  146 +#result_table td {
  147 + word-wrap: break-word;
  148 + max-width: 7em;
  149 + padding: 0.3em;
  150 + &:first-child {
  151 + display: table-cell;
  152 + text-align: center;
  153 + }
  154 + @media (min-width: 400px) {
  155 + border: 1px solid #D9E4E6;
  156 + }
  157 + }
  158 +
  159 +#result_table th, td {
  160 + margin: .5em 1em;
  161 + @media (min-width: 400px) {
  162 + display: table-cell;
  163 + padding: 1em;
  164 + }
  165 + }
  166 +
  167 +#total_row { font-weight: bold; }
  168 +.passClass { background-color: #6c6; !important ;}
  169 +.failClass { background-color: #c60; !important ;}
  170 +.errorClass { background-color: #c00; !important ; }
  171 +.passCase { color: #6c6; }
  172 +.failCase { color: #c60; font-weight: bold; }
  173 +.errorCase { color: #c00; font-weight: bold; }
  174 +.skipCase { color:#908e8e; font-weight: bold; }
  175 +tr[id^=pt] td { background-color: rgba(73,204,144,.3) !important ; }
  176 +tr[id^=ft] td { background-color: rgba(252,161,48,.3) !important; }
  177 +tr[id^=et] td { background-color: rgba(249,62,62,.3) !important ; }
  178 +tr[id^=st] td { background-color: #6f6f6fa1 !important ; }
  179 +.hiddenRow { display: none; }
  180 +.testcase { margin-left: 2em; }
  181 +
  182 +/* -- ending ---------------------------------------------------------------------- */
  183 +#ending {
  184 +}
  185 +
  186 +.detail_button {
  187 + width: 130px;
  188 + text-decoration: none;
  189 + line-height: 38px;
  190 + text-align: center;
  191 + font-weight: bold;
  192 + color: #ffff;
  193 + border-radius: 6px;
  194 + padding: 5px 10px 5px 10px;
  195 + position: relative;
  196 + overflow: hidden;
  197 +}
  198 +.detail_button.abstract{background-color: #4dbee8;}
  199 +.detail_button.passed{ background-color: #66cc66;}
  200 +.detail_button.failed{ background-color: #cc6600;}
  201 +.detail_button.errored{ background-color: #f54f4f;}
  202 +.detail_button.skiped{ background-color: gray;}
  203 +.detail_button.all{ background-color: blue;}
  204 +.piechart{
  205 + width: 200px;
  206 + float: left;
  207 + display: inline;
  208 +}
  209 +
  210 +
  211 +</style>
  212 +
  213 +</head>
  214 +<body>
  215 +<script language="javascript" type="text/javascript">
  216 +output_list = Array();
  217 +
  218 +/* level - 0:Summary; 1:Passed; 2:Failed; 3:Errored; 4:Skiped; 5:All */
  219 +function showCase(level,channel) {
  220 + trs = document.getElementsByTagName("tr");
  221 + for (var i = 0; i < trs.length; i++) {
  222 + tr = trs[i];
  223 + id = tr.id;
  224 + if (["ft","pt","et","st"].indexOf(id.substr(0,2))!=-1){
  225 + if ( level ==0 && id.substr(2,1)==channel ) {
  226 + tr.className = 'hiddenRow';
  227 + }
  228 + }
  229 +
  230 + if (id.substr(0,3) == 'pt'+channel) {
  231 + if ( level==1){
  232 + tr.className = '';
  233 + }
  234 + else if (level>4 && id.substr(2,1)==channel ){
  235 + tr.className = '';
  236 + }
  237 + else {
  238 + tr.className = 'hiddenRow';
  239 + }
  240 + }
  241 + if (id.substr(0,3) == 'ft'+channel) {
  242 + if (level ==2) {
  243 + tr.className = '';
  244 + }
  245 + else if (level>4 && id.substr(2,1)==channel ){
  246 + tr.className = '';
  247 + }
  248 + else {
  249 + tr.className = 'hiddenRow';
  250 + }
  251 + }
  252 + if (id.substr(0,3) == 'et'+channel) {
  253 + if (level ==3) {
  254 + tr.className = '';
  255 + }
  256 + else if (level>4 && id.substr(2,1)==channel ){
  257 + tr.className = '';
  258 + }
  259 + else {
  260 + tr.className = 'hiddenRow';
  261 + }
  262 + }
  263 + if (id.substr(0,3) == 'st'+channel) {
  264 + if (level ==4) {
  265 + tr.className = '';
  266 + }
  267 + else if (level>4 && id.substr(2,1)==channel ){
  268 + tr.className = '';
  269 + }
  270 + else {
  271 + tr.className = 'hiddenRow';
  272 + }
  273 + }
  274 +
  275 + }
  276 +}
  277 +
  278 +
  279 +function showClassDetail(cid, count) {
  280 + var id_list = Array(count);
  281 + var toHide = 1;
  282 + for (var i = 0; i < count; i++) {
  283 + tid0 = 't' + cid.substr(1) + '.' + (i+1);
  284 + tid = 'f' + tid0;
  285 + tr = document.getElementById(tid);
  286 + if (!tr) {
  287 + tid = 'p' + tid0;
  288 + tr = document.getElementById(tid);
  289 + }
  290 + if (!tr) {
  291 + tid = 'e' + tid0;
  292 + tr = document.getElementById(tid);
  293 + }
  294 + if (!tr) {
  295 + tid = 's' + tid0;
  296 + tr = document.getElementById(tid);
  297 + }
  298 + id_list[i] = tid;
  299 + if (tr.className) {
  300 + toHide = 0;
  301 + }
  302 + }
  303 + for (var i = 0; i < count; i++) {
  304 + tid = id_list[i];
  305 + if (toHide) {
  306 + document.getElementById(tid).className = 'hiddenRow';
  307 + }
  308 + else {
  309 + document.getElementById(tid).className = '';
  310 + }
  311 + }
  312 +}
  313 +
  314 +
  315 +function showTestDetail(div_id){
  316 + var details_div = document.getElementById(div_id)
  317 + var displayState = details_div.style.display
  318 + // alert(displayState)
  319 + if (displayState != 'block' ) {
  320 + displayState = 'block'
  321 + details_div.style.display = 'block'
  322 + }
  323 + else {
  324 + details_div.style.display = 'none'
  325 + }
  326 +}
  327 +
  328 +
  329 +function html_escape(s) {
  330 + s = s.replace(/&/g,'&amp;');
  331 + s = s.replace(/</g,'&lt;');
  332 + s = s.replace(/>/g,'&gt;');
  333 + return s;
  334 +}
  335 +
  336 +function drawCircle(circle,pass, fail, error){
  337 + var color = ["#6c6","#c60","#c00"];
  338 + var data = [pass,fail,error];
  339 + var text_arr = ["Pass", "Fail", "Error"];
  340 +
  341 + var canvas = document.getElementById(circle);
  342 + var ctx = canvas.getContext("2d");
  343 + var startPoint=0;
  344 + var width = 20, height = 10;
  345 + var posX = 112 * 2 + 20, posY = 30;
  346 + var textX = posX + width + 5, textY = posY + 10;
  347 + for(var i=0;i<data.length;i++){
  348 + ctx.fillStyle = color[i];
  349 + ctx.beginPath();
  350 + ctx.moveTo(112,84);
  351 + ctx.arc(112,84,84,startPoint,startPoint+Math.PI*2*(data[i]/(data[0]+data[1]+data[2])),false);
  352 + ctx.fill();
  353 + startPoint += Math.PI*2*(data[i]/(data[0]+data[1]+data[2]));
  354 + ctx.fillStyle = color[i];
  355 + ctx.fillRect(posX, posY + 20 * i, width, height);
  356 + ctx.moveTo(posX, posY + 20 * i);
  357 + ctx.font = 'bold 14px';
  358 + ctx.fillStyle = color[i];
  359 + var percent = text_arr[i] + ":"+data[i];
  360 + ctx.fillText(percent, textX, textY + 20 * i);
  361 +
  362 + }
  363 +}
  364 +
  365 +
  366 +function show_img(obj) {
  367 + var obj1 = obj.nextElementSibling
  368 + obj1.style.display='block'
  369 + var index = 0;//每张图片的下标,
  370 + var len = obj1.getElementsByTagName('img').length;
  371 + var imgyuan = obj1.getElementsByClassName('imgyuan')[0]
  372 + //var start=setInterval(autoPlay,500);
  373 + obj1.onmouseover=function(){//当鼠标光标停在图片上,则停止轮播
  374 + clearInterval(start);
  375 + }
  376 + obj1.onmouseout=function(){//当鼠标光标停在图片上,则开始轮播
  377 + start=setInterval(autoPlay,1000);
  378 + }
  379 + for (var i = 0; i < len; i++) {
  380 + var font = document.createElement('font')
  381 + imgyuan.appendChild(font)
  382 + }
  383 + var lis = obj1.getElementsByTagName('font');//得到所有圆圈
  384 + changeImg(0)
  385 + var funny = function (i) {
  386 + lis[i].onmouseover = function () {
  387 + index=i
  388 + changeImg(i)
  389 + }
  390 + }
  391 + for (var i = 0; i < lis.length; i++) {
  392 + funny(i);
  393 + }
  394 +
  395 + function autoPlay(){
  396 + if(index>len-1){
  397 + index=0;
  398 + clearInterval(start); //运行一轮后停止
  399 + }
  400 + changeImg(index++);
  401 + }
  402 + imgyuan.style.width= 25*len +"px";
  403 + //对应圆圈和图片同步
  404 + function changeImg(index) {
  405 + var list = obj1.getElementsByTagName('img');
  406 + var list1 = obj1.getElementsByTagName('font');
  407 + for (i = 0; i < list.length; i++) {
  408 + list[i].style.display = 'none';
  409 + list1[i].style.backgroundColor = 'white';
  410 + }
  411 + list[index].style.display = 'block';
  412 + list1[index].style.backgroundColor = 'blue';
  413 + }
  414 +
  415 +}
  416 +function hide_img(obj){
  417 + obj.parentElement.style.display = "none";
  418 + obj.parentElement.getElementsByClassName('imgyuan')[0].innerHTML = "";
  419 +}
  420 +</script>
  421 +<div class='heading'>
  422 +<h1>搜索功能测试报告</h1>
  423 +<p class='attribute'><strong>开始时间:</strong> 2019-12-02 11:09:30</p>
  424 +<p class='attribute'><strong>耗时:</strong> 0:00:00.036002</p>
  425 +<p class='attribute'><strong>状态:</strong> <span class="tj passCase">Pass</span>:6 <span class="tj failCase">Failure</span>:3 <span class="tj skipCase">Skip</span>:12 <span class="tj">通过率</span>:66.7%</p>
  426 +
  427 +<p class='description'>用例执行情况:</p>
  428 +</div>
  429 +
  430 +
  431 +<div class="piechart">
  432 + <div>
  433 + <canvas id="circle1" width="350" height="168" </canvas>
  434 + </div>
  435 +</div>
  436 +
  437 +<div id='show_detail_line' style=" float: left; width: 100%;">
  438 +<a class="abstract detail_button" href='javascript:showCase(0,1)'>概要[66.67%]</a>
  439 +<a class="passed detail_button" href='javascript:showCase(1,1)'>通过[6]</a>
  440 +<a class="failed detail_button" href='javascript:showCase(2,1)'>失败[3]</a>
  441 +<a class="errored detail_button" href='javascript:showCase(3,1)'>错误[0]</a>
  442 +<a class="skiped detail_button" href='javascript:showCase(4,1)'>跳过[12]</a>
  443 +<a class="all detail_button" href='javascript:showCase(5,1)'>所有[9]</a>
  444 +</div>
  445 +
  446 +<table id='result_table'>
  447 +<colgroup>
  448 +<col align='left' />
  449 +<col align='right' />
  450 +<col align='right' />
  451 +<col align='right' />
  452 +<col align='right' />
  453 +<col align='right' />
  454 +<col align='right' />
  455 +</colgroup>
  456 +<tr id='header_row'>
  457 + <th>测试组/测试用例</th>
  458 + <th>总数</th>
  459 + <th>通过</th>
  460 + <th>失败</th>
  461 + <th>错误</th>
  462 + <th>视图</th>
  463 + <th>错误截图</th>
  464 +</tr>
  465 +
  466 +<tr class='failClass'>
  467 + <td>test_Userskip.test_Userskip_demo1</td>
  468 + <td>6</td>
  469 + <td>3</td>
  470 + <td>3</td>
  471 + <td>0</td>
  472 + <td><a href="javascript:showClassDetail('c1.1',6)">详情</a></td>
  473 + <td>&nbsp;</td>
  474 +</tr>
  475 +
  476 +<tr id='pt1.1.1' class='hiddenRow'>
  477 + <td ><div class='testcase'>test_1_userskip</div></td>
  478 + <td colspan='5' align='center'>
  479 +
  480 + <!--css div popup start-->
  481 + <span class='status passCase'>
  482 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.1')" >
  483 + 通过</a></span>
  484 +
  485 + <div id='div_pt1.1.1' class="popup_window">
  486 + <div style='text-align: right; color:red;cursor:pointer'>
  487 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.1').style.display = 'none' " >
  488 + [x]</a>
  489 + </div>
  490 + <pre>
  491 +
  492 +pt1.1.1: in test_1
  493 +
  494 +
  495 + </pre>
  496 + </div>
  497 + <!--css div popup end-->
  498 +
  499 + </td>
  500 + <td>无截图</td>
  501 +</tr>
  502 +
  503 +<tr id='ft1.1.2' class='none'>
  504 + <td ><div class='testcase'>test_2_userskip</div></td>
  505 + <td colspan='5' align='center'>
  506 +
  507 + <!--css div popup start-->
  508 + <span class='status failCase'>
  509 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.2')" >
  510 + 失败</a></span>
  511 +
  512 + <div id='div_ft1.1.2' class="popup_window">
  513 + <div style='text-align: right; color:red;cursor:pointer'>
  514 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.2').style.display = 'none' " >
  515 + [x]</a>
  516 + </div>
  517 + <pre>
  518 +
  519 +ft1.1.2: Traceback (most recent call last):
  520 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  521 + assert False
  522 +AssertionError
  523 +
  524 +
  525 + </pre>
  526 + </div>
  527 + <!--css div popup end-->
  528 +
  529 + </td>
  530 + <td>无截图</td>
  531 +</tr>
  532 +
  533 +<tr id='ft1.1.3' class='none'>
  534 + <td ><div class='testcase'>test_2_userskip: _retry:1</div></td>
  535 + <td colspan='5' align='center'>
  536 +
  537 + <!--css div popup start-->
  538 + <span class='status failCase'>
  539 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.3')" >
  540 + 失败</a></span>
  541 +
  542 + <div id='div_ft1.1.3' class="popup_window">
  543 + <div style='text-align: right; color:red;cursor:pointer'>
  544 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.3').style.display = 'none' " >
  545 + [x]</a>
  546 + </div>
  547 + <pre>
  548 +
  549 +ft1.1.3: Traceback (most recent call last):
  550 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  551 + assert False
  552 +AssertionError
  553 +
  554 +
  555 + </pre>
  556 + </div>
  557 + <!--css div popup end-->
  558 +
  559 + </td>
  560 + <td>无截图</td>
  561 +</tr>
  562 +
  563 +<tr id='ft1.1.4' class='none'>
  564 + <td ><div class='testcase'>test_2_userskip: _retry:2</div></td>
  565 + <td colspan='5' align='center'>
  566 +
  567 + <!--css div popup start-->
  568 + <span class='status failCase'>
  569 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.4')" >
  570 + 失败</a></span>
  571 +
  572 + <div id='div_ft1.1.4' class="popup_window">
  573 + <div style='text-align: right; color:red;cursor:pointer'>
  574 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.4').style.display = 'none' " >
  575 + [x]</a>
  576 + </div>
  577 + <pre>
  578 +
  579 +ft1.1.4: Traceback (most recent call last):
  580 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  581 + assert False
  582 +AssertionError
  583 +
  584 +
  585 + </pre>
  586 + </div>
  587 + <!--css div popup end-->
  588 +
  589 + </td>
  590 + <td>无截图</td>
  591 +</tr>
  592 +
  593 +<tr id='st1.1.5' class='none'>
  594 + <td ><div class='testcase'>test_3_userskip</div></td>
  595 + <td colspan='5' align='center'>
  596 +
  597 + <!--css div popup start-->
  598 + <span class='status passCase'>
  599 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.1.5')" >
  600 + 跳过</a></span>
  601 +
  602 + <div id='div_st1.1.5' class="popup_window">
  603 + <div style='text-align: right; color:red;cursor:pointer'>
  604 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.1.5').style.display = 'none' " >
  605 + [x]</a>
  606 + </div>
  607 + <pre>
  608 +
  609 +st1.1.5: [test_3_userskip] do not excute,because [test_2_userskip] is failed
  610 +
  611 + </pre>
  612 + </div>
  613 + <!--css div popup end-->
  614 +
  615 + </td>
  616 + <td>无截图</td>
  617 +</tr>
  618 +
  619 +<tr id='pt1.1.6' class='hiddenRow'>
  620 + <td ><div class='testcase'>test_4_userskip</div></td>
  621 + <td colspan='5' align='center'>
  622 +
  623 + <!--css div popup start-->
  624 + <span class='status passCase'>
  625 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.6')" >
  626 + 通过</a></span>
  627 +
  628 + <div id='div_pt1.1.6' class="popup_window">
  629 + <div style='text-align: right; color:red;cursor:pointer'>
  630 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.6').style.display = 'none' " >
  631 + [x]</a>
  632 + </div>
  633 + <pre>
  634 +
  635 +pt1.1.6: in test_4
  636 +
  637 +
  638 + </pre>
  639 + </div>
  640 + <!--css div popup end-->
  641 +
  642 + </td>
  643 + <td>无截图</td>
  644 +</tr>
  645 +
  646 +<tr id='st1.1.7' class='none'>
  647 + <td ><div class='testcase'>test_5_userskip</div></td>
  648 + <td colspan='5' align='center'>
  649 +
  650 + <!--css div popup start-->
  651 + <span class='status passCase'>
  652 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.1.7')" >
  653 + 跳过</a></span>
  654 +
  655 + <div id='div_st1.1.7' class="popup_window">
  656 + <div style='text-align: right; color:red;cursor:pointer'>
  657 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.1.7').style.display = 'none' " >
  658 + [x]</a>
  659 + </div>
  660 + <pre>
  661 +
  662 +st1.1.7: [test_5_userskip] do not excute,because [test_2_userskip] is failed
  663 +
  664 + </pre>
  665 + </div>
  666 + <!--css div popup end-->
  667 +
  668 + </td>
  669 + <td>无截图</td>
  670 +</tr>
  671 +
  672 +<tr id='pt1.1.8' class='hiddenRow'>
  673 + <td ><div class='testcase'>test_6</div></td>
  674 + <td colspan='5' align='center'>
  675 +
  676 + <!--css div popup start-->
  677 + <span class='status passCase'>
  678 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.8')" >
  679 + 通过</a></span>
  680 +
  681 + <div id='div_pt1.1.8' class="popup_window">
  682 + <div style='text-align: right; color:red;cursor:pointer'>
  683 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.8').style.display = 'none' " >
  684 + [x]</a>
  685 + </div>
  686 + <pre>
  687 +
  688 +pt1.1.8: in test_6
  689 +
  690 +
  691 + </pre>
  692 + </div>
  693 + <!--css div popup end-->
  694 +
  695 + </td>
  696 + <td>无截图</td>
  697 +</tr>
  698 +
  699 +<tr class='passClass'>
  700 + <td>test_skipclass.test_skipclass_demo1</td>
  701 + <td>0</td>
  702 + <td>0</td>
  703 + <td>0</td>
  704 + <td>0</td>
  705 + <td><a href="javascript:showClassDetail('c1.2',0)">详情</a></td>
  706 + <td>&nbsp;</td>
  707 +</tr>
  708 +
  709 +<tr id='st1.2.1' class='none'>
  710 + <td ><div class='testcase'>test_1_skipclass</div></td>
  711 + <td colspan='5' align='center'>
  712 +
  713 + <!--css div popup start-->
  714 + <span class='status passCase'>
  715 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.1')" >
  716 + 跳过</a></span>
  717 +
  718 + <div id='div_st1.2.1' class="popup_window">
  719 + <div style='text-align: right; color:red;cursor:pointer'>
  720 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.1').style.display = 'none' " >
  721 + [x]</a>
  722 + </div>
  723 + <pre>
  724 +
  725 +st1.2.1: skip directly
  726 +
  727 + </pre>
  728 + </div>
  729 + <!--css div popup end-->
  730 +
  731 + </td>
  732 + <td>无截图</td>
  733 +</tr>
  734 +
  735 +<tr id='st1.2.2' class='none'>
  736 + <td ><div class='testcase'>test_2_skipclass</div></td>
  737 + <td colspan='5' align='center'>
  738 +
  739 + <!--css div popup start-->
  740 + <span class='status passCase'>
  741 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.2')" >
  742 + 跳过</a></span>
  743 +
  744 + <div id='div_st1.2.2' class="popup_window">
  745 + <div style='text-align: right; color:red;cursor:pointer'>
  746 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.2').style.display = 'none' " >
  747 + [x]</a>
  748 + </div>
  749 + <pre>
  750 +
  751 +st1.2.2: skip directly
  752 +
  753 + </pre>
  754 + </div>
  755 + <!--css div popup end-->
  756 +
  757 + </td>
  758 + <td>无截图</td>
  759 +</tr>
  760 +
  761 +<tr id='st1.2.3' class='none'>
  762 + <td ><div class='testcase'>test_3_skipclass</div></td>
  763 + <td colspan='5' align='center'>
  764 +
  765 + <!--css div popup start-->
  766 + <span class='status passCase'>
  767 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.3')" >
  768 + 跳过</a></span>
  769 +
  770 + <div id='div_st1.2.3' class="popup_window">
  771 + <div style='text-align: right; color:red;cursor:pointer'>
  772 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.3').style.display = 'none' " >
  773 + [x]</a>
  774 + </div>
  775 + <pre>
  776 +
  777 +st1.2.3: skip directly
  778 +
  779 + </pre>
  780 + </div>
  781 + <!--css div popup end-->
  782 +
  783 + </td>
  784 + <td>无截图</td>
  785 +</tr>
  786 +
  787 +<tr id='st1.2.4' class='none'>
  788 + <td ><div class='testcase'>test_4_skipclass</div></td>
  789 + <td colspan='5' align='center'>
  790 +
  791 + <!--css div popup start-->
  792 + <span class='status passCase'>
  793 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.4')" >
  794 + 跳过</a></span>
  795 +
  796 + <div id='div_st1.2.4' class="popup_window">
  797 + <div style='text-align: right; color:red;cursor:pointer'>
  798 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.4').style.display = 'none' " >
  799 + [x]</a>
  800 + </div>
  801 + <pre>
  802 +
  803 +st1.2.4: skip directly
  804 +
  805 + </pre>
  806 + </div>
  807 + <!--css div popup end-->
  808 +
  809 + </td>
  810 + <td>无截图</td>
  811 +</tr>
  812 +
  813 +<tr id='st1.2.5' class='none'>
  814 + <td ><div class='testcase'>test_5_skipclass</div></td>
  815 + <td colspan='5' align='center'>
  816 +
  817 + <!--css div popup start-->
  818 + <span class='status passCase'>
  819 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.5')" >
  820 + 跳过</a></span>
  821 +
  822 + <div id='div_st1.2.5' class="popup_window">
  823 + <div style='text-align: right; color:red;cursor:pointer'>
  824 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.5').style.display = 'none' " >
  825 + [x]</a>
  826 + </div>
  827 + <pre>
  828 +
  829 +st1.2.5: skip directly
  830 +
  831 + </pre>
  832 + </div>
  833 + <!--css div popup end-->
  834 +
  835 + </td>
  836 + <td>无截图</td>
  837 +</tr>
  838 +
  839 +<tr id='st1.2.6' class='none'>
  840 + <td ><div class='testcase'>test_6_skipclass</div></td>
  841 + <td colspan='5' align='center'>
  842 +
  843 + <!--css div popup start-->
  844 + <span class='status passCase'>
  845 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.6')" >
  846 + 跳过</a></span>
  847 +
  848 + <div id='div_st1.2.6' class="popup_window">
  849 + <div style='text-align: right; color:red;cursor:pointer'>
  850 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.6').style.display = 'none' " >
  851 + [x]</a>
  852 + </div>
  853 + <pre>
  854 +
  855 +st1.2.6: skip directly
  856 +
  857 + </pre>
  858 + </div>
  859 + <!--css div popup end-->
  860 +
  861 + </td>
  862 + <td>无截图</td>
  863 +</tr>
  864 +
  865 +<tr id='st1.2.7' class='none'>
  866 + <td ><div class='testcase'>test_7_skipclass</div></td>
  867 + <td colspan='5' align='center'>
  868 +
  869 + <!--css div popup start-->
  870 + <span class='status passCase'>
  871 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.7')" >
  872 + 跳过</a></span>
  873 +
  874 + <div id='div_st1.2.7' class="popup_window">
  875 + <div style='text-align: right; color:red;cursor:pointer'>
  876 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.7').style.display = 'none' " >
  877 + [x]</a>
  878 + </div>
  879 + <pre>
  880 +
  881 +st1.2.7: skip directly
  882 +
  883 + </pre>
  884 + </div>
  885 + <!--css div popup end-->
  886 +
  887 + </td>
  888 + <td>无截图</td>
  889 +</tr>
  890 +
  891 +<tr class='passClass'>
  892 + <td>test_Systemskip.test_systemskip_demo1</td>
  893 + <td>3</td>
  894 + <td>3</td>
  895 + <td>0</td>
  896 + <td>0</td>
  897 + <td><a href="javascript:showClassDetail('c1.3',3)">详情</a></td>
  898 + <td>&nbsp;</td>
  899 +</tr>
  900 +
  901 +<tr id='pt1.3.1' class='hiddenRow'>
  902 + <td ><div class='testcase'>test_1_systemskip</div></td>
  903 + <td colspan='5' align='center'>
  904 +
  905 + <!--css div popup start-->
  906 + <span class='status passCase'>
  907 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.1')" >
  908 + 通过</a></span>
  909 +
  910 + <div id='div_pt1.3.1' class="popup_window">
  911 + <div style='text-align: right; color:red;cursor:pointer'>
  912 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.1').style.display = 'none' " >
  913 + [x]</a>
  914 + </div>
  915 + <pre>
  916 +
  917 +pt1.3.1: in test_1
  918 +
  919 +
  920 + </pre>
  921 + </div>
  922 + <!--css div popup end-->
  923 +
  924 + </td>
  925 + <td>无截图</td>
  926 +</tr>
  927 +
  928 +<tr id='st1.3.2' class='none'>
  929 + <td ><div class='testcase'>test_2_systemskip</div></td>
  930 + <td colspan='5' align='center'>
  931 +
  932 + <!--css div popup start-->
  933 + <span class='status passCase'>
  934 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.2')" >
  935 + 跳过</a></span>
  936 +
  937 + <div id='div_st1.3.2' class="popup_window">
  938 + <div style='text-align: right; color:red;cursor:pointer'>
  939 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.2').style.display = 'none' " >
  940 + [x]</a>
  941 + </div>
  942 + <pre>
  943 +
  944 +st1.3.2: skip directly
  945 +
  946 + </pre>
  947 + </div>
  948 + <!--css div popup end-->
  949 +
  950 + </td>
  951 + <td>无截图</td>
  952 +</tr>
  953 +
  954 +<tr id='st1.3.3' class='none'>
  955 + <td ><div class='testcase'>test_3_systemskip</div></td>
  956 + <td colspan='5' align='center'>
  957 +
  958 + <!--css div popup start-->
  959 + <span class='status passCase'>
  960 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.3')" >
  961 + 跳过</a></span>
  962 +
  963 + <div id='div_st1.3.3' class="popup_window">
  964 + <div style='text-align: right; color:red;cursor:pointer'>
  965 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.3').style.display = 'none' " >
  966 + [x]</a>
  967 + </div>
  968 + <pre>
  969 +
  970 +st1.3.3: TEST skipIf True
  971 +
  972 + </pre>
  973 + </div>
  974 + <!--css div popup end-->
  975 +
  976 + </td>
  977 + <td>无截图</td>
  978 +</tr>
  979 +
  980 +<tr id='pt1.3.4' class='hiddenRow'>
  981 + <td ><div class='testcase'>test_4_systemskip</div></td>
  982 + <td colspan='5' align='center'>
  983 +
  984 + <!--css div popup start-->
  985 + <span class='status passCase'>
  986 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.4')" >
  987 + 通过</a></span>
  988 +
  989 + <div id='div_pt1.3.4' class="popup_window">
  990 + <div style='text-align: right; color:red;cursor:pointer'>
  991 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.4').style.display = 'none' " >
  992 + [x]</a>
  993 + </div>
  994 + <pre>
  995 +
  996 +pt1.3.4: in test_4
  997 +
  998 +
  999 + </pre>
  1000 + </div>
  1001 + <!--css div popup end-->
  1002 +
  1003 + </td>
  1004 + <td>无截图</td>
  1005 +</tr>
  1006 +
  1007 +<tr id='pt1.3.5' class='hiddenRow'>
  1008 + <td ><div class='testcase'>test_5_systemskip</div></td>
  1009 + <td colspan='5' align='center'>
  1010 +
  1011 + <!--css div popup start-->
  1012 + <span class='status passCase'>
  1013 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.5')" >
  1014 + 通过</a></span>
  1015 +
  1016 + <div id='div_pt1.3.5' class="popup_window">
  1017 + <div style='text-align: right; color:red;cursor:pointer'>
  1018 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.5').style.display = 'none' " >
  1019 + [x]</a>
  1020 + </div>
  1021 + <pre>
  1022 +
  1023 +pt1.3.5: in test_5
  1024 +
  1025 +
  1026 + </pre>
  1027 + </div>
  1028 + <!--css div popup end-->
  1029 +
  1030 + </td>
  1031 + <td>无截图</td>
  1032 +</tr>
  1033 +
  1034 +<tr id='st1.3.6' class='none'>
  1035 + <td ><div class='testcase'>test_6_systemskip</div></td>
  1036 + <td colspan='5' align='center'>
  1037 +
  1038 + <!--css div popup start-->
  1039 + <span class='status passCase'>
  1040 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.6')" >
  1041 + 跳过</a></span>
  1042 +
  1043 + <div id='div_st1.3.6' class="popup_window">
  1044 + <div style='text-align: right; color:red;cursor:pointer'>
  1045 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.6').style.display = 'none' " >
  1046 + [x]</a>
  1047 + </div>
  1048 + <pre>
  1049 +
  1050 +st1.3.6: TEST skipUnless True
  1051 +
  1052 + </pre>
  1053 + </div>
  1054 + <!--css div popup end-->
  1055 +
  1056 + </td>
  1057 + <td>无截图</td>
  1058 +</tr>
  1059 +
  1060 +<tr id='total_row'>
  1061 + <th>统计</th>
  1062 + <th>9</th>
  1063 + <th>6</th>
  1064 + <th>3</th>
  1065 + <th>0</th>
  1066 + <th>&nbsp;</th>
  1067 + <th>&nbsp;</th>
  1068 +</tr>
  1069 +</table>
  1070 +<script>
  1071 + showCase(0,1);
  1072 + drawCircle('circle1',6, 3, 0);
  1073 +</script>
  1074 +
  1075 +<div id='ending'>&nbsp;</div>
  1076 +
  1077 +</body>
  1078 +</html>
src/report/2019-12-02 11_10_59_result.html 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3 +<html xmlns="http://www.w3.org/1999/xhtml">
  4 +<head>
  5 + <title>搜索功能测试报告</title>
  6 + <meta name="generator" content="HTMLTestRunner 0.8.3"/>
  7 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  8 +
  9 +<style type="text/css" media="screen">
  10 +body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
  11 +table { font-size: 100%; }
  12 +pre {
  13 + white-space: pre-wrap;
  14 + word-wrap: break-word;
  15 +}
  16 +
  17 +/* -- heading ---------------------------------------------------------------------- */
  18 +h1 {
  19 + font-size: 16pt;
  20 + color: gray;
  21 +}
  22 +.heading {
  23 + float:left;
  24 + width:30%;
  25 + margin-top: 0ex;
  26 + margin-bottom: 1ex;
  27 +}
  28 +
  29 +.heading .attribute {
  30 + margin-top: 1ex;
  31 + margin-bottom: 0;
  32 +}
  33 +
  34 +.heading .description {
  35 + margin-top: 4ex;
  36 + margin-bottom: 6ex;
  37 +}
  38 +
  39 +/* -- css div popup ------------------------------------------------------------------------ */
  40 +a.popup_link {
  41 +}
  42 +
  43 +a.popup_link:hover {
  44 + color: red;
  45 +}
  46 +.img{
  47 + height: 100%;
  48 + border-collapse: collapse;
  49 + border: 2px solid #777;
  50 +}
  51 +
  52 +.screenshots {
  53 + z-index: 100;
  54 + position:fixed;
  55 + height: 80%;
  56 + left: 50%;
  57 + top: 50%;
  58 + transform: translate(-50%,-50%);
  59 + display: none;
  60 +}
  61 +
  62 +.imgyuan{
  63 + height: 20px;
  64 + border-radius: 12px;
  65 + background-color: red;
  66 + padding-left: 13px;
  67 + margin: 0 auto;
  68 + position: relative;
  69 + top: -40px;
  70 + background-color: rgba(1, 150, 0, 0.3);
  71 +}
  72 +.imgyuan font{
  73 + border:1px solid white;
  74 + width:11px;
  75 + height:11px;
  76 + border-radius:50%;
  77 + margin-right: 9px;
  78 + margin-top: 4px;
  79 + display: block;
  80 + float: left;
  81 + background-color: white;
  82 +}
  83 +.close_shots {
  84 + background-image: url(data:image/png;base64,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/GMzLdsAAD+3aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzA2NyA3OS4xNTc3NDcsIDIwMTUvMDMvMzAtMjM6NDA6NDIgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk4NDVkYzlhLTM2NTEtMTFlOC1hMDRjLWMzZmRjNzFmNjFkZDwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDo3YzQ4OTMyZS0wM2FjLTIxNDctYTJiZi1iNmViOWU4ZDY2Y2Q8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmQ0ZjMzNDFjLTRkYjctZjc0YS1iZTAxLWYxMGEwMzNhNjg4ZDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wNC0wMlQxNjo0MToxMCswODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIEVsZW1lbnRzIDE0LjAgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y29udmVydGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5kZXJpdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpwYXJhbWV0ZXJzPmNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3YzQ4OTMyZS0wM2FjLTIxNDctYTJiZi1iNmViOWU4ZDY2Y2Q8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDQtMDJUMTY6NDE6MTArMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBFbGVtZW50cyAxNC4wIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmQ0ZjMzNDFjLTRkYjctZjc0YS1iZTAxLWYxMGEwMzNhNjg4ZDwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3N0UmVmOmRvY3VtZW50SUQ+CiAgICAgICAgICAgIDxzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+MEIzOTNDRjk1RDQ0RDlGMDNFQjEzQkZEQ0UxRDA5MjM8L3N0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDQtMDJUMTY6MjM6NTUrMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNC0wMlQxNjo0MToxMCswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDQtMDJUMTY6NDE6MTArMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIEVsZW1lbnRzIDE0LjAgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx0aWZmOkltYWdlV2lkdGg+MjU0PC90aWZmOkltYWdlV2lkdGg+CiAgICAgICAgIDx0aWZmOkltYWdlTGVuZ3RoPjI1NDwvdGlmZjpJbWFnZUxlbmd0aD4KICAgICAgICAgPHRpZmY6Qml0c1BlclNhbXBsZT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+ODwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjg8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT44PC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC90aWZmOkJpdHNQZXJTYW1wbGU+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpTYW1wbGVzUGVyUGl4ZWw+MzwvdGlmZjpTYW1wbGVzUGVyUGl4ZWw+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpFeGlmVmVyc2lvbj4wMjIxPC9leGlmOkV4aWZWZXJzaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE1MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xNTA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg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);
  85 + background-size: 22px 22px;
  86 + -moz-background-size: 22px 22px;
  87 + background-repeat: no-repeat;
  88 + position: absolute;
  89 + top: 5px;
  90 + right: 5px;
  91 + height: 22px;
  92 + z-index: 99;
  93 + width: 22px;
  94 +}
  95 +.popup_window {
  96 + display: none;
  97 + position: relative;
  98 + left: 0px;
  99 + top: 0px;
  100 + padding: 10px;
  101 + background-color: #E6E6D6;
  102 + font-family: "Lucida Console", "Courier New", Courier, monospace;
  103 + text-align: left;
  104 + font-size: 8pt;
  105 +}
  106 +
  107 +}
  108 +/* -- report ------------------------------------------------------------------------ */
  109 +#show_detail_line {
  110 + float:left;
  111 + width:100%;
  112 + margin-top: 3ex;
  113 + margin-bottom: 1ex;
  114 +}
  115 +
  116 +#result_table {
  117 + margin: 1em 0;
  118 + width: 100%;
  119 + overflow: hidden;
  120 + background: #FFF;
  121 + color: #024457;
  122 + border-radius: 10px;
  123 + border: 1px solid #167F92;
  124 +}
  125 +#result_table th {
  126 + border: 1px solid #FFFFFF;
  127 + background-color: #167F92;
  128 + color: #FFF;
  129 + padding: 0.5em;
  130 + &:first-child {
  131 + display: table-cell;
  132 + text-align: center;
  133 + }
  134 + &:nth-child(2) {
  135 + display: table-cell;
  136 + span {display:none;}
  137 + &:after {content:attr(data-th);}
  138 + }
  139 + @media (min-width: 480px) {
  140 + &:nth-child(2) {
  141 + span {display: block;}
  142 + &:after {display: none;}
  143 + }
  144 + }
  145 + }
  146 +#result_table td {
  147 + word-wrap: break-word;
  148 + max-width: 7em;
  149 + padding: 0.3em;
  150 + &:first-child {
  151 + display: table-cell;
  152 + text-align: center;
  153 + }
  154 + @media (min-width: 400px) {
  155 + border: 1px solid #D9E4E6;
  156 + }
  157 + }
  158 +
  159 +#result_table th, td {
  160 + margin: .5em 1em;
  161 + @media (min-width: 400px) {
  162 + display: table-cell;
  163 + padding: 1em;
  164 + }
  165 + }
  166 +
  167 +#total_row { font-weight: bold; }
  168 +.passClass { background-color: #6c6; !important ;}
  169 +.failClass { background-color: #c60; !important ;}
  170 +.errorClass { background-color: #c00; !important ; }
  171 +.passCase { color: #6c6; }
  172 +.failCase { color: #c60; font-weight: bold; }
  173 +.errorCase { color: #c00; font-weight: bold; }
  174 +.skipCase { color:#908e8e; font-weight: bold; }
  175 +tr[id^=pt] td { background-color: rgba(73,204,144,.3) !important ; }
  176 +tr[id^=ft] td { background-color: rgba(252,161,48,.3) !important; }
  177 +tr[id^=et] td { background-color: rgba(249,62,62,.3) !important ; }
  178 +tr[id^=st] td { background-color: #6f6f6fa1 !important ; }
  179 +.hiddenRow { display: none; }
  180 +.testcase { margin-left: 2em; }
  181 +
  182 +/* -- ending ---------------------------------------------------------------------- */
  183 +#ending {
  184 +}
  185 +
  186 +.detail_button {
  187 + width: 130px;
  188 + text-decoration: none;
  189 + line-height: 38px;
  190 + text-align: center;
  191 + font-weight: bold;
  192 + color: #ffff;
  193 + border-radius: 6px;
  194 + padding: 5px 10px 5px 10px;
  195 + position: relative;
  196 + overflow: hidden;
  197 +}
  198 +.detail_button.abstract{background-color: #4dbee8;}
  199 +.detail_button.passed{ background-color: #66cc66;}
  200 +.detail_button.failed{ background-color: #cc6600;}
  201 +.detail_button.errored{ background-color: #f54f4f;}
  202 +.detail_button.skiped{ background-color: gray;}
  203 +.detail_button.all{ background-color: blue;}
  204 +.piechart{
  205 + width: 200px;
  206 + float: left;
  207 + display: inline;
  208 +}
  209 +
  210 +
  211 +</style>
  212 +
  213 +</head>
  214 +<body>
  215 +<script language="javascript" type="text/javascript">
  216 +output_list = Array();
  217 +
  218 +/* level - 0:Summary; 1:Passed; 2:Failed; 3:Errored; 4:Skiped; 5:All */
  219 +function showCase(level,channel) {
  220 + trs = document.getElementsByTagName("tr");
  221 + for (var i = 0; i < trs.length; i++) {
  222 + tr = trs[i];
  223 + id = tr.id;
  224 + if (["ft","pt","et","st"].indexOf(id.substr(0,2))!=-1){
  225 + if ( level ==0 && id.substr(2,1)==channel ) {
  226 + tr.className = 'hiddenRow';
  227 + }
  228 + }
  229 +
  230 + if (id.substr(0,3) == 'pt'+channel) {
  231 + if ( level==1){
  232 + tr.className = '';
  233 + }
  234 + else if (level>4 && id.substr(2,1)==channel ){
  235 + tr.className = '';
  236 + }
  237 + else {
  238 + tr.className = 'hiddenRow';
  239 + }
  240 + }
  241 + if (id.substr(0,3) == 'ft'+channel) {
  242 + if (level ==2) {
  243 + tr.className = '';
  244 + }
  245 + else if (level>4 && id.substr(2,1)==channel ){
  246 + tr.className = '';
  247 + }
  248 + else {
  249 + tr.className = 'hiddenRow';
  250 + }
  251 + }
  252 + if (id.substr(0,3) == 'et'+channel) {
  253 + if (level ==3) {
  254 + tr.className = '';
  255 + }
  256 + else if (level>4 && id.substr(2,1)==channel ){
  257 + tr.className = '';
  258 + }
  259 + else {
  260 + tr.className = 'hiddenRow';
  261 + }
  262 + }
  263 + if (id.substr(0,3) == 'st'+channel) {
  264 + if (level ==4) {
  265 + tr.className = '';
  266 + }
  267 + else if (level>4 && id.substr(2,1)==channel ){
  268 + tr.className = '';
  269 + }
  270 + else {
  271 + tr.className = 'hiddenRow';
  272 + }
  273 + }
  274 +
  275 + }
  276 +}
  277 +
  278 +
  279 +function showClassDetail(cid, count) {
  280 + var id_list = Array(count);
  281 + var toHide = 1;
  282 + for (var i = 0; i < count; i++) {
  283 + tid0 = 't' + cid.substr(1) + '.' + (i+1);
  284 + tid = 'f' + tid0;
  285 + tr = document.getElementById(tid);
  286 + if (!tr) {
  287 + tid = 'p' + tid0;
  288 + tr = document.getElementById(tid);
  289 + }
  290 + if (!tr) {
  291 + tid = 'e' + tid0;
  292 + tr = document.getElementById(tid);
  293 + }
  294 + if (!tr) {
  295 + tid = 's' + tid0;
  296 + tr = document.getElementById(tid);
  297 + }
  298 + id_list[i] = tid;
  299 + if (tr.className) {
  300 + toHide = 0;
  301 + }
  302 + }
  303 + for (var i = 0; i < count; i++) {
  304 + tid = id_list[i];
  305 + if (toHide) {
  306 + document.getElementById(tid).className = 'hiddenRow';
  307 + }
  308 + else {
  309 + document.getElementById(tid).className = '';
  310 + }
  311 + }
  312 +}
  313 +
  314 +
  315 +function showTestDetail(div_id){
  316 + var details_div = document.getElementById(div_id)
  317 + var displayState = details_div.style.display
  318 + // alert(displayState)
  319 + if (displayState != 'block' ) {
  320 + displayState = 'block'
  321 + details_div.style.display = 'block'
  322 + }
  323 + else {
  324 + details_div.style.display = 'none'
  325 + }
  326 +}
  327 +
  328 +
  329 +function html_escape(s) {
  330 + s = s.replace(/&/g,'&amp;');
  331 + s = s.replace(/</g,'&lt;');
  332 + s = s.replace(/>/g,'&gt;');
  333 + return s;
  334 +}
  335 +
  336 +function drawCircle(circle,pass, fail, error){
  337 + var color = ["#6c6","#c60","#c00"];
  338 + var data = [pass,fail,error];
  339 + var text_arr = ["Pass", "Fail", "Error"];
  340 +
  341 + var canvas = document.getElementById(circle);
  342 + var ctx = canvas.getContext("2d");
  343 + var startPoint=0;
  344 + var width = 20, height = 10;
  345 + var posX = 112 * 2 + 20, posY = 30;
  346 + var textX = posX + width + 5, textY = posY + 10;
  347 + for(var i=0;i<data.length;i++){
  348 + ctx.fillStyle = color[i];
  349 + ctx.beginPath();
  350 + ctx.moveTo(112,84);
  351 + ctx.arc(112,84,84,startPoint,startPoint+Math.PI*2*(data[i]/(data[0]+data[1]+data[2])),false);
  352 + ctx.fill();
  353 + startPoint += Math.PI*2*(data[i]/(data[0]+data[1]+data[2]));
  354 + ctx.fillStyle = color[i];
  355 + ctx.fillRect(posX, posY + 20 * i, width, height);
  356 + ctx.moveTo(posX, posY + 20 * i);
  357 + ctx.font = 'bold 14px';
  358 + ctx.fillStyle = color[i];
  359 + var percent = text_arr[i] + ":"+data[i];
  360 + ctx.fillText(percent, textX, textY + 20 * i);
  361 +
  362 + }
  363 +}
  364 +
  365 +
  366 +function show_img(obj) {
  367 + var obj1 = obj.nextElementSibling
  368 + obj1.style.display='block'
  369 + var index = 0;//每张图片的下标,
  370 + var len = obj1.getElementsByTagName('img').length;
  371 + var imgyuan = obj1.getElementsByClassName('imgyuan')[0]
  372 + //var start=setInterval(autoPlay,500);
  373 + obj1.onmouseover=function(){//当鼠标光标停在图片上,则停止轮播
  374 + clearInterval(start);
  375 + }
  376 + obj1.onmouseout=function(){//当鼠标光标停在图片上,则开始轮播
  377 + start=setInterval(autoPlay,1000);
  378 + }
  379 + for (var i = 0; i < len; i++) {
  380 + var font = document.createElement('font')
  381 + imgyuan.appendChild(font)
  382 + }
  383 + var lis = obj1.getElementsByTagName('font');//得到所有圆圈
  384 + changeImg(0)
  385 + var funny = function (i) {
  386 + lis[i].onmouseover = function () {
  387 + index=i
  388 + changeImg(i)
  389 + }
  390 + }
  391 + for (var i = 0; i < lis.length; i++) {
  392 + funny(i);
  393 + }
  394 +
  395 + function autoPlay(){
  396 + if(index>len-1){
  397 + index=0;
  398 + clearInterval(start); //运行一轮后停止
  399 + }
  400 + changeImg(index++);
  401 + }
  402 + imgyuan.style.width= 25*len +"px";
  403 + //对应圆圈和图片同步
  404 + function changeImg(index) {
  405 + var list = obj1.getElementsByTagName('img');
  406 + var list1 = obj1.getElementsByTagName('font');
  407 + for (i = 0; i < list.length; i++) {
  408 + list[i].style.display = 'none';
  409 + list1[i].style.backgroundColor = 'white';
  410 + }
  411 + list[index].style.display = 'block';
  412 + list1[index].style.backgroundColor = 'blue';
  413 + }
  414 +
  415 +}
  416 +function hide_img(obj){
  417 + obj.parentElement.style.display = "none";
  418 + obj.parentElement.getElementsByClassName('imgyuan')[0].innerHTML = "";
  419 +}
  420 +</script>
  421 +<div class='heading'>
  422 +<h1>搜索功能测试报告</h1>
  423 +<p class='attribute'><strong>开始时间:</strong> 2019-12-02 11:10:59</p>
  424 +<p class='attribute'><strong>耗时:</strong> 0:00:00.026998</p>
  425 +<p class='attribute'><strong>状态:</strong> <span class="tj passCase">Pass</span>:6 <span class="tj failCase">Failure</span>:3 <span class="tj skipCase">Skip</span>:12 <span class="tj">通过率</span>:66.7%</p>
  426 +
  427 +<p class='description'>用例执行情况:</p>
  428 +</div>
  429 +
  430 +
  431 +<div class="piechart">
  432 + <div>
  433 + <canvas id="circle1" width="350" height="168" </canvas>
  434 + </div>
  435 +</div>
  436 +
  437 +<div id='show_detail_line' style=" float: left; width: 100%;">
  438 +<a class="abstract detail_button" href='javascript:showCase(0,1)'>概要[66.67%]</a>
  439 +<a class="passed detail_button" href='javascript:showCase(1,1)'>通过[6]</a>
  440 +<a class="failed detail_button" href='javascript:showCase(2,1)'>失败[3]</a>
  441 +<a class="errored detail_button" href='javascript:showCase(3,1)'>错误[0]</a>
  442 +<a class="skiped detail_button" href='javascript:showCase(4,1)'>跳过[12]</a>
  443 +<a class="all detail_button" href='javascript:showCase(5,1)'>所有[9]</a>
  444 +</div>
  445 +
  446 +<table id='result_table'>
  447 +<colgroup>
  448 +<col align='left' />
  449 +<col align='right' />
  450 +<col align='right' />
  451 +<col align='right' />
  452 +<col align='right' />
  453 +<col align='right' />
  454 +<col align='right' />
  455 +</colgroup>
  456 +<tr id='header_row'>
  457 + <th>测试组/测试用例</th>
  458 + <th>总数</th>
  459 + <th>通过</th>
  460 + <th>失败</th>
  461 + <th>错误</th>
  462 + <th>视图</th>
  463 + <th>错误截图</th>
  464 +</tr>
  465 +
  466 +<tr class='failClass'>
  467 + <td>test_Userskip.test_Userskip_demo1</td>
  468 + <td>6</td>
  469 + <td>3</td>
  470 + <td>3</td>
  471 + <td>0</td>
  472 + <td><a href="javascript:showClassDetail('c1.1',6)">详情</a></td>
  473 + <td>&nbsp;</td>
  474 +</tr>
  475 +
  476 +<tr id='pt1.1.1' class='hiddenRow'>
  477 + <td ><div class='testcase'>test_1_userskip</div></td>
  478 + <td colspan='5' align='center'>
  479 +
  480 + <!--css div popup start-->
  481 + <span class='status passCase'>
  482 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.1')" >
  483 + 通过</a></span>
  484 +
  485 + <div id='div_pt1.1.1' class="popup_window">
  486 + <div style='text-align: right; color:red;cursor:pointer'>
  487 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.1').style.display = 'none' " >
  488 + [x]</a>
  489 + </div>
  490 + <pre>
  491 +
  492 +pt1.1.1: in test_1
  493 +
  494 +
  495 + </pre>
  496 + </div>
  497 + <!--css div popup end-->
  498 +
  499 + </td>
  500 + <td>无截图</td>
  501 +</tr>
  502 +
  503 +<tr id='ft1.1.2' class='none'>
  504 + <td ><div class='testcase'>test_2_userskip</div></td>
  505 + <td colspan='5' align='center'>
  506 +
  507 + <!--css div popup start-->
  508 + <span class='status failCase'>
  509 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.2')" >
  510 + 失败</a></span>
  511 +
  512 + <div id='div_ft1.1.2' class="popup_window">
  513 + <div style='text-align: right; color:red;cursor:pointer'>
  514 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.2').style.display = 'none' " >
  515 + [x]</a>
  516 + </div>
  517 + <pre>
  518 +
  519 +ft1.1.2: Traceback (most recent call last):
  520 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  521 + assert False
  522 +AssertionError
  523 +
  524 +
  525 + </pre>
  526 + </div>
  527 + <!--css div popup end-->
  528 +
  529 + </td>
  530 + <td>无截图</td>
  531 +</tr>
  532 +
  533 +<tr id='ft1.1.3' class='none'>
  534 + <td ><div class='testcase'>test_2_userskip: _retry:1</div></td>
  535 + <td colspan='5' align='center'>
  536 +
  537 + <!--css div popup start-->
  538 + <span class='status failCase'>
  539 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.3')" >
  540 + 失败</a></span>
  541 +
  542 + <div id='div_ft1.1.3' class="popup_window">
  543 + <div style='text-align: right; color:red;cursor:pointer'>
  544 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.3').style.display = 'none' " >
  545 + [x]</a>
  546 + </div>
  547 + <pre>
  548 +
  549 +ft1.1.3: Traceback (most recent call last):
  550 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  551 + assert False
  552 +AssertionError
  553 +
  554 +
  555 + </pre>
  556 + </div>
  557 + <!--css div popup end-->
  558 +
  559 + </td>
  560 + <td>无截图</td>
  561 +</tr>
  562 +
  563 +<tr id='ft1.1.4' class='none'>
  564 + <td ><div class='testcase'>test_2_userskip: _retry:2</div></td>
  565 + <td colspan='5' align='center'>
  566 +
  567 + <!--css div popup start-->
  568 + <span class='status failCase'>
  569 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_ft1.1.4')" >
  570 + 失败</a></span>
  571 +
  572 + <div id='div_ft1.1.4' class="popup_window">
  573 + <div style='text-align: right; color:red;cursor:pointer'>
  574 + <a onfocus='this.blur();' onclick="document.getElementById('div_ft1.1.4').style.display = 'none' " >
  575 + [x]</a>
  576 + </div>
  577 + <pre>
  578 +
  579 +ft1.1.4: Traceback (most recent call last):
  580 + File "E:\EclipseWorkspace\WorksapceDemo\Request-demo\src\testcase\test_skip_demo\test_Userskip.py", line 15, in test_2_userskip
  581 + assert False
  582 +AssertionError
  583 +
  584 +
  585 + </pre>
  586 + </div>
  587 + <!--css div popup end-->
  588 +
  589 + </td>
  590 + <td>无截图</td>
  591 +</tr>
  592 +
  593 +<tr id='st1.1.5' class='none'>
  594 + <td ><div class='testcase'>test_3_userskip</div></td>
  595 + <td colspan='5' align='center'>
  596 +
  597 + <!--css div popup start-->
  598 + <span class='status passCase'>
  599 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.1.5')" >
  600 + 跳过</a></span>
  601 +
  602 + <div id='div_st1.1.5' class="popup_window">
  603 + <div style='text-align: right; color:red;cursor:pointer'>
  604 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.1.5').style.display = 'none' " >
  605 + [x]</a>
  606 + </div>
  607 + <pre>
  608 +
  609 +st1.1.5: [test_3_userskip] do not excute,because [test_2_userskip] is failed
  610 +
  611 + </pre>
  612 + </div>
  613 + <!--css div popup end-->
  614 +
  615 + </td>
  616 + <td>无截图</td>
  617 +</tr>
  618 +
  619 +<tr id='pt1.1.6' class='hiddenRow'>
  620 + <td ><div class='testcase'>test_4_userskip</div></td>
  621 + <td colspan='5' align='center'>
  622 +
  623 + <!--css div popup start-->
  624 + <span class='status passCase'>
  625 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.6')" >
  626 + 通过</a></span>
  627 +
  628 + <div id='div_pt1.1.6' class="popup_window">
  629 + <div style='text-align: right; color:red;cursor:pointer'>
  630 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.6').style.display = 'none' " >
  631 + [x]</a>
  632 + </div>
  633 + <pre>
  634 +
  635 +pt1.1.6: in test_4
  636 +
  637 +
  638 + </pre>
  639 + </div>
  640 + <!--css div popup end-->
  641 +
  642 + </td>
  643 + <td>无截图</td>
  644 +</tr>
  645 +
  646 +<tr id='st1.1.7' class='none'>
  647 + <td ><div class='testcase'>test_5_userskip</div></td>
  648 + <td colspan='5' align='center'>
  649 +
  650 + <!--css div popup start-->
  651 + <span class='status passCase'>
  652 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.1.7')" >
  653 + 跳过</a></span>
  654 +
  655 + <div id='div_st1.1.7' class="popup_window">
  656 + <div style='text-align: right; color:red;cursor:pointer'>
  657 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.1.7').style.display = 'none' " >
  658 + [x]</a>
  659 + </div>
  660 + <pre>
  661 +
  662 +st1.1.7: [test_5_userskip] do not excute,because [test_2_userskip] is failed
  663 +
  664 + </pre>
  665 + </div>
  666 + <!--css div popup end-->
  667 +
  668 + </td>
  669 + <td>无截图</td>
  670 +</tr>
  671 +
  672 +<tr id='pt1.1.8' class='hiddenRow'>
  673 + <td ><div class='testcase'>test_6</div></td>
  674 + <td colspan='5' align='center'>
  675 +
  676 + <!--css div popup start-->
  677 + <span class='status passCase'>
  678 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.1.8')" >
  679 + 通过</a></span>
  680 +
  681 + <div id='div_pt1.1.8' class="popup_window">
  682 + <div style='text-align: right; color:red;cursor:pointer'>
  683 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.1.8').style.display = 'none' " >
  684 + [x]</a>
  685 + </div>
  686 + <pre>
  687 +
  688 +pt1.1.8: in test_6
  689 +
  690 +
  691 + </pre>
  692 + </div>
  693 + <!--css div popup end-->
  694 +
  695 + </td>
  696 + <td>无截图</td>
  697 +</tr>
  698 +
  699 +<tr class='passClass'>
  700 + <td>test_skipclass.test_skipclass_demo1</td>
  701 + <td>0</td>
  702 + <td>0</td>
  703 + <td>0</td>
  704 + <td>0</td>
  705 + <td><a href="javascript:showClassDetail('c1.2',0)">详情</a></td>
  706 + <td>&nbsp;</td>
  707 +</tr>
  708 +
  709 +<tr id='st1.2.1' class='none'>
  710 + <td ><div class='testcase'>test_1_skipclass</div></td>
  711 + <td colspan='5' align='center'>
  712 +
  713 + <!--css div popup start-->
  714 + <span class='status passCase'>
  715 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.1')" >
  716 + 跳过</a></span>
  717 +
  718 + <div id='div_st1.2.1' class="popup_window">
  719 + <div style='text-align: right; color:red;cursor:pointer'>
  720 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.1').style.display = 'none' " >
  721 + [x]</a>
  722 + </div>
  723 + <pre>
  724 +
  725 +st1.2.1: skip directly
  726 +
  727 + </pre>
  728 + </div>
  729 + <!--css div popup end-->
  730 +
  731 + </td>
  732 + <td>无截图</td>
  733 +</tr>
  734 +
  735 +<tr id='st1.2.2' class='none'>
  736 + <td ><div class='testcase'>test_2_skipclass</div></td>
  737 + <td colspan='5' align='center'>
  738 +
  739 + <!--css div popup start-->
  740 + <span class='status passCase'>
  741 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.2')" >
  742 + 跳过</a></span>
  743 +
  744 + <div id='div_st1.2.2' class="popup_window">
  745 + <div style='text-align: right; color:red;cursor:pointer'>
  746 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.2').style.display = 'none' " >
  747 + [x]</a>
  748 + </div>
  749 + <pre>
  750 +
  751 +st1.2.2: skip directly
  752 +
  753 + </pre>
  754 + </div>
  755 + <!--css div popup end-->
  756 +
  757 + </td>
  758 + <td>无截图</td>
  759 +</tr>
  760 +
  761 +<tr id='st1.2.3' class='none'>
  762 + <td ><div class='testcase'>test_3_skipclass</div></td>
  763 + <td colspan='5' align='center'>
  764 +
  765 + <!--css div popup start-->
  766 + <span class='status passCase'>
  767 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.3')" >
  768 + 跳过</a></span>
  769 +
  770 + <div id='div_st1.2.3' class="popup_window">
  771 + <div style='text-align: right; color:red;cursor:pointer'>
  772 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.3').style.display = 'none' " >
  773 + [x]</a>
  774 + </div>
  775 + <pre>
  776 +
  777 +st1.2.3: skip directly
  778 +
  779 + </pre>
  780 + </div>
  781 + <!--css div popup end-->
  782 +
  783 + </td>
  784 + <td>无截图</td>
  785 +</tr>
  786 +
  787 +<tr id='st1.2.4' class='none'>
  788 + <td ><div class='testcase'>test_4_skipclass</div></td>
  789 + <td colspan='5' align='center'>
  790 +
  791 + <!--css div popup start-->
  792 + <span class='status passCase'>
  793 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.4')" >
  794 + 跳过</a></span>
  795 +
  796 + <div id='div_st1.2.4' class="popup_window">
  797 + <div style='text-align: right; color:red;cursor:pointer'>
  798 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.4').style.display = 'none' " >
  799 + [x]</a>
  800 + </div>
  801 + <pre>
  802 +
  803 +st1.2.4: skip directly
  804 +
  805 + </pre>
  806 + </div>
  807 + <!--css div popup end-->
  808 +
  809 + </td>
  810 + <td>无截图</td>
  811 +</tr>
  812 +
  813 +<tr id='st1.2.5' class='none'>
  814 + <td ><div class='testcase'>test_5_skipclass</div></td>
  815 + <td colspan='5' align='center'>
  816 +
  817 + <!--css div popup start-->
  818 + <span class='status passCase'>
  819 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.5')" >
  820 + 跳过</a></span>
  821 +
  822 + <div id='div_st1.2.5' class="popup_window">
  823 + <div style='text-align: right; color:red;cursor:pointer'>
  824 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.5').style.display = 'none' " >
  825 + [x]</a>
  826 + </div>
  827 + <pre>
  828 +
  829 +st1.2.5: skip directly
  830 +
  831 + </pre>
  832 + </div>
  833 + <!--css div popup end-->
  834 +
  835 + </td>
  836 + <td>无截图</td>
  837 +</tr>
  838 +
  839 +<tr id='st1.2.6' class='none'>
  840 + <td ><div class='testcase'>test_6_skipclass</div></td>
  841 + <td colspan='5' align='center'>
  842 +
  843 + <!--css div popup start-->
  844 + <span class='status passCase'>
  845 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.6')" >
  846 + 跳过</a></span>
  847 +
  848 + <div id='div_st1.2.6' class="popup_window">
  849 + <div style='text-align: right; color:red;cursor:pointer'>
  850 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.6').style.display = 'none' " >
  851 + [x]</a>
  852 + </div>
  853 + <pre>
  854 +
  855 +st1.2.6: skip directly
  856 +
  857 + </pre>
  858 + </div>
  859 + <!--css div popup end-->
  860 +
  861 + </td>
  862 + <td>无截图</td>
  863 +</tr>
  864 +
  865 +<tr id='st1.2.7' class='none'>
  866 + <td ><div class='testcase'>test_7_skipclass</div></td>
  867 + <td colspan='5' align='center'>
  868 +
  869 + <!--css div popup start-->
  870 + <span class='status passCase'>
  871 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.2.7')" >
  872 + 跳过</a></span>
  873 +
  874 + <div id='div_st1.2.7' class="popup_window">
  875 + <div style='text-align: right; color:red;cursor:pointer'>
  876 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.2.7').style.display = 'none' " >
  877 + [x]</a>
  878 + </div>
  879 + <pre>
  880 +
  881 +st1.2.7: skip directly
  882 +
  883 + </pre>
  884 + </div>
  885 + <!--css div popup end-->
  886 +
  887 + </td>
  888 + <td>无截图</td>
  889 +</tr>
  890 +
  891 +<tr class='passClass'>
  892 + <td>test_Systemskip.test_systemskip_demo1</td>
  893 + <td>3</td>
  894 + <td>3</td>
  895 + <td>0</td>
  896 + <td>0</td>
  897 + <td><a href="javascript:showClassDetail('c1.3',3)">详情</a></td>
  898 + <td>&nbsp;</td>
  899 +</tr>
  900 +
  901 +<tr id='pt1.3.1' class='hiddenRow'>
  902 + <td ><div class='testcase'>test_1_systemskip</div></td>
  903 + <td colspan='5' align='center'>
  904 +
  905 + <!--css div popup start-->
  906 + <span class='status passCase'>
  907 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.1')" >
  908 + 通过</a></span>
  909 +
  910 + <div id='div_pt1.3.1' class="popup_window">
  911 + <div style='text-align: right; color:red;cursor:pointer'>
  912 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.1').style.display = 'none' " >
  913 + [x]</a>
  914 + </div>
  915 + <pre>
  916 +
  917 +pt1.3.1: in test_1
  918 +
  919 +
  920 + </pre>
  921 + </div>
  922 + <!--css div popup end-->
  923 +
  924 + </td>
  925 + <td>无截图</td>
  926 +</tr>
  927 +
  928 +<tr id='st1.3.2' class='none'>
  929 + <td ><div class='testcase'>test_2_systemskip</div></td>
  930 + <td colspan='5' align='center'>
  931 +
  932 + <!--css div popup start-->
  933 + <span class='status passCase'>
  934 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.2')" >
  935 + 跳过</a></span>
  936 +
  937 + <div id='div_st1.3.2' class="popup_window">
  938 + <div style='text-align: right; color:red;cursor:pointer'>
  939 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.2').style.display = 'none' " >
  940 + [x]</a>
  941 + </div>
  942 + <pre>
  943 +
  944 +st1.3.2: skip directly
  945 +
  946 + </pre>
  947 + </div>
  948 + <!--css div popup end-->
  949 +
  950 + </td>
  951 + <td>无截图</td>
  952 +</tr>
  953 +
  954 +<tr id='st1.3.3' class='none'>
  955 + <td ><div class='testcase'>test_3_systemskip</div></td>
  956 + <td colspan='5' align='center'>
  957 +
  958 + <!--css div popup start-->
  959 + <span class='status passCase'>
  960 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.3')" >
  961 + 跳过</a></span>
  962 +
  963 + <div id='div_st1.3.3' class="popup_window">
  964 + <div style='text-align: right; color:red;cursor:pointer'>
  965 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.3').style.display = 'none' " >
  966 + [x]</a>
  967 + </div>
  968 + <pre>
  969 +
  970 +st1.3.3: TEST skipIf True
  971 +
  972 + </pre>
  973 + </div>
  974 + <!--css div popup end-->
  975 +
  976 + </td>
  977 + <td>无截图</td>
  978 +</tr>
  979 +
  980 +<tr id='pt1.3.4' class='hiddenRow'>
  981 + <td ><div class='testcase'>test_4_systemskip</div></td>
  982 + <td colspan='5' align='center'>
  983 +
  984 + <!--css div popup start-->
  985 + <span class='status passCase'>
  986 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.4')" >
  987 + 通过</a></span>
  988 +
  989 + <div id='div_pt1.3.4' class="popup_window">
  990 + <div style='text-align: right; color:red;cursor:pointer'>
  991 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.4').style.display = 'none' " >
  992 + [x]</a>
  993 + </div>
  994 + <pre>
  995 +
  996 +pt1.3.4: in test_4
  997 +
  998 +
  999 + </pre>
  1000 + </div>
  1001 + <!--css div popup end-->
  1002 +
  1003 + </td>
  1004 + <td>无截图</td>
  1005 +</tr>
  1006 +
  1007 +<tr id='pt1.3.5' class='hiddenRow'>
  1008 + <td ><div class='testcase'>test_5_systemskip</div></td>
  1009 + <td colspan='5' align='center'>
  1010 +
  1011 + <!--css div popup start-->
  1012 + <span class='status passCase'>
  1013 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_pt1.3.5')" >
  1014 + 通过</a></span>
  1015 +
  1016 + <div id='div_pt1.3.5' class="popup_window">
  1017 + <div style='text-align: right; color:red;cursor:pointer'>
  1018 + <a onfocus='this.blur();' onclick="document.getElementById('div_pt1.3.5').style.display = 'none' " >
  1019 + [x]</a>
  1020 + </div>
  1021 + <pre>
  1022 +
  1023 +pt1.3.5: in test_5
  1024 +
  1025 +
  1026 + </pre>
  1027 + </div>
  1028 + <!--css div popup end-->
  1029 +
  1030 + </td>
  1031 + <td>无截图</td>
  1032 +</tr>
  1033 +
  1034 +<tr id='st1.3.6' class='none'>
  1035 + <td ><div class='testcase'>test_6_systemskip</div></td>
  1036 + <td colspan='5' align='center'>
  1037 +
  1038 + <!--css div popup start-->
  1039 + <span class='status passCase'>
  1040 + <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_st1.3.6')" >
  1041 + 跳过</a></span>
  1042 +
  1043 + <div id='div_st1.3.6' class="popup_window">
  1044 + <div style='text-align: right; color:red;cursor:pointer'>
  1045 + <a onfocus='this.blur();' onclick="document.getElementById('div_st1.3.6').style.display = 'none' " >
  1046 + [x]</a>
  1047 + </div>
  1048 + <pre>
  1049 +
  1050 +st1.3.6: TEST skipUnless True
  1051 +
  1052 + </pre>
  1053 + </div>
  1054 + <!--css div popup end-->
  1055 +
  1056 + </td>
  1057 + <td>无截图</td>
  1058 +</tr>
  1059 +
  1060 +<tr id='total_row'>
  1061 + <th>统计</th>
  1062 + <th>9</th>
  1063 + <th>6</th>
  1064 + <th>3</th>
  1065 + <th>0</th>
  1066 + <th>&nbsp;</th>
  1067 + <th>&nbsp;</th>
  1068 +</tr>
  1069 +</table>
  1070 +<script>
  1071 + showCase(0,1);
  1072 + drawCircle('circle1',6, 3, 0);
  1073 +</script>
  1074 +
  1075 +<div id='ending'>&nbsp;</div>
  1076 +
  1077 +</body>
  1078 +</html>