class Control(WatchGuard): def __init__(self, user_product): super(Control, self).__init__(user_product) self.product_obj_list = [] self.log = Log('control') def save_performance_data(self): """ @summary 存储产品的performance数据 :return:None """ self.save_product_obj() # 遍历每个产品对象,获取所以的产品数据存以列表形式放在all_data中 all_data = [] for probj in self.product_obj_list: pf = probj.get_product_performance() all_data.append(pf) # 对all_data中的字典按照键值 Firewall Throughput 进行升排序, # 因为Firewall Throughput单位全部换算成以K为单位的数字,对应键值flag_number, # 所以这里以flag_number排序. all_data.sort(key=lambda x: x['flag_number'], reverse=False) title = [] value = [] for i, data in enumerate(all_data): temp = [] for k, v in data.items(): if not k == "flag_number": if i == 0: title.append(k) temp.append(v) value.append(temp) # 调用view层进行写文件 file_name = "..\\data\\performance.csv" visual = Visual(file_name) visual.write_to_csv(title, value) self.log.debug("存储产品performance数据完成, 结果在data文件下的performance.csv") def save_product_obj(self): """ @summary 采用多线程获取存储产品对象【如果产品数量过多,则要限制多线程,防止服务器忙于过多请求, 具体限制数量根据网站性能和要求给出】 :return:None """ user_prd = self.choose_product() thread_list = [] for prd in user_prd: name = prd['name'] pid = prd['id'] self.thread_action(name, pid) th = Thread(target=self.thread_action, args=(name, pid)) thread_list.append(th) for thread in thread_list: thread.start() for thread in thread_list: thread.join(60) def thread_action(self, name, pid): prd = self.get_product_obj(name, pid) self.product_obj_list.append(prd)
class Visual(object): def __init__(self, file): self.file = file self.log = Log('') def write_to_csv(self, title, value): """ @summary 将用户数据写入CSV文件 :param title: [list] 标题 :param value: [list] 写入的行数据列表 :return:None """ try: with open(self.file, 'w', newline="") as f: writer = csv.writer(f, dialect='excel') writer.writerow(title) writer.writerows(value) except IOError as e: self.log.error('写文件失败 %s' % str(e))
def test_user_login_platUserAccount_null(self): '''登陆账户为空''' Log().info("开始执行测试用例test_user_login_platUserAccount_null") payload = '&request={"platUserAccount": "", "password": "******"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'F') self.assertEqual(testresult['errmsg'], '请求参数不完整:platUserAccount')
def test_user_login_password_error(self): '''登陆密码错误''' Log().info("开始执行测试用例test_user_login_password_error") payload = '&request={"platUserAccount": "weizhaojg", "password": "******"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['loginMsg'], '密码错误')
def test_user_login_loginPwd_toosmall(self): '''修改登录密码--新密码过短''' Log().info("开始执行测试用例test_user_login_loginPwd_toosmall") payload = '&request={"platUserId":"1609260937392541000000002","ologinPwd":"123456","loginPwd":"1"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['updateMsg'], '登录密码长度应在6-20位之间')
def test_user_update_oldpassword_null(self): '''修改登录密码--空原始密码''' Log().info("开始执行测试用例test_user_login_platUserAccount_null") payload = '&request={"platUserId":"1609260937392541000000002","ologinPwd":"","loginPwd":"123456"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'F') self.assertEqual(testresult['errmsg'], '修改登录密码需要同时输入原密码和新密码')
def test_user_update_password_null(self): '''修改登录密码--空原始密码新密码''' Log().info("开始执行测试用例test_user_update_password_null") payload = '&request={"platUserId":"1609260937392541000000002","ologinPwd":"","loginPwd":""}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['updateMsg'], '修改成功')
def test_user_update_all_null(self): '''所有参数为空''' Log().info("开始执行测试用例test_user_login_all_null") payload = '&request={"platUserId":""}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'F') self.assertEqual(testresult['errmsg'], '请求参数不完整:platUserId')
def test_order_create_success(self): '''创建订单成功''' Log().info("开始执行测试用例test_order_create_success") payload = '&request={"platUserId":""}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'F') self.assertEqual(testresult['errmsg'], '请求参数不完整:platUserId')
def test_user_login_ologinPwd_error(self): '''修改登录密码--原始密码错误''' Log().info("开始执行测试用例test_user_login_ologinPwd_error") payload = '&request={"platUserId":"1609260937392541000000002",' \ '"ologinPwd":"1234567","loginPwd":"123456"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['updateMsg'], '原登录密码错误')
def sendmail(file_new): logger = Log() mail_from = globalparam.mail_from_address mail_to = globalparam.mail_accept_address #定义正文 f = open(file_new, 'rb') mail_body = f.read() f.close() msg = MIMEText(mail_body, _subtype='html', _charset='utf-8') #定义标题 msg['Subject'] = u"RKYSB2G Interface Test Report" msg['From'] = mail_from msg['To'] = ''.join(mail_to) #定义发送时间(不定义的可能有的邮件客户端会不显示发送时间) msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z') try: smtp = smtplib.SMTP() #连接SMTP服务器,此处用的163的SMTP服务器 smtp.connect('smtp.163.com') #用户名密码 smtp.login('*****@*****.**', 'zhyo123456789') smtp.sendmail(mail_from, mail_to, msg.as_string()) smtp.quit() print('email has send out !') logger.info("发送邮件成功") except SMTPDataError: logger.error('发送邮件失败') raise
class WatchGuard(object): def __init__(self, user_product): self.compare_url = COMPARE_URL self.user_product = user_product self.log = Log('watchGuard') def choose_product(self): """ @summary 获取指定的产品列表 :return: data: [list] ,返回一个列表,其中元素是字典包含设备name和id """ data = [] page_text = connection.open_url(self.compare_url) soup = BeautifulSoup(page_text, 'lxml') select_tag = soup.find_all('select', attrs={'name': 'p1'})[0] optgroup = select_tag.find_all('optgroup') # 遍历下拉框选择Firebox M Series、Firebox T Series型号的设备id for group in optgroup: label = str(group.get('label').encode('utf-8')) if label in self.user_product: # 获取到该型号的option标签列表 option_list = group.find_all('option') for opt in option_list: name = str(opt.text.encode('utf-8')) value = str(opt.get('value')) data.append({'name': name, 'id': value}) self.log.debug("选取用户特定产品型号完成") return data def get_product_obj(self, name, pid): """ 获取产品对象 :return: Product 对象 """ url = COMPARE_URL + "/%s/%s/%s" % (pid, pid, pid) page = connection.open_url(url) prd = Product(name, page) short_name = name.split(' ')[-1] self.log.debug('%s 实例化产品对象完成' % short_name) return prd
def test_user_login_password_success(self): '''登陆成功''' Log().info("开始执行测试用例test_user_login_password_error") payload = '&request={"platUserAccount": "weizhaojg", "password": "******"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) platuserid = testresult['responseData']['platUserId'] self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['loginMsg'], '成功') self.assertEqual(platuserid, '1609260937392541000000002') self.assertEqual(testresult['responseData']['loginStatus'], 'T') return platuserid
def test_flight_getinfo(self): '''航班查询接口''' Log().info("开始执行测试用例test_flight_getinfo") payload = '&request={"airline":"CA","departureTime":"2017-05-22 00:00:00",' \ '"departurecity":"PEK",' \ '"arrivecity":"CTU",' \ '"bookreason":"1",' \ '"PlatCompanyId":"1609260937392691000000003"}' url = self.base_url + payload r = requests.get(url) self.result = r.json() testresult = json.loads(self.result) self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['updateMsg'], '登录密码长度应在6-20位之间')
def test_user_login_password_success(self): '''修改登录密码--修改成功''' Log().info("开始执行测试用例test_user_login_password_success") payload = '&request={"platUserId":"1609260937392541000000002",' \ '"ologinPwd":"123456","loginPwd":"1234567"}' payloadreturn = '&request={"platUserId":"1609260937392541000000002",' \ '"ologinPwd":"1234567","loginPwd":"123456"}' urltest = 'http://192.168.1.19:9984/openapi/getway?&service=user_login&partner=ca4e1e00b4a0400cbd20fd8d82076551&request={"platUserAccount": "weizhaojg", "password": "******"}&sign=543534534132132' url = self.base_url + payload urlreturn = self.base_url +payloadreturn requests.get(url) rtest = requests.get(urltest) self.result = rtest.json() testresult = json.loads(self.result) platuserid = testresult['responseData']['platUserId'] self.assertEqual(testresult['issuccess'], 'T') self.assertEqual(testresult['responseData']['loginMsg'], '成功') self.assertEqual(platuserid, '1609260937392541000000002') self.assertEqual(testresult['responseData']['loginStatus'], 'T') requests.get(urlreturn)
def run(): logger = Log() print(u"开始运行脚本:") logger.info(u"开始运行脚本:") if globalparam.isNeedCreateTestResult == 1: # test_data.init_data() # 初始化接口测试数据 now = time.strftime("%Y-%m-%d %H_%M_%S") filename = './report/htmlreport/' + now + '_result.html' fp = open(filename, 'wb') runner = HTMLTestRunner(stream=fp, title='RKYSB2G Interface Test Report', description=u'用例执行情况') runner.run(discover) fp.close() else: print("不生成测试报告") unittest.main() Mailpost.sendreport() logger.info(u"运行完成退出~~~~~~~~~~~") print(u"运行完成退出~~~~~~~~~~~")
def sendreport(): logger = Log() result_dir = './report/htmlreport/' lists = os.listdir(result_dir) lists.sort(key=lambda fn: os.path.getmtime(result_dir + "\\" + fn) if not os.path.isdir(result_dir + "\\" + fn) else 0) print(u'最新测试生成的报告:' + lists[-1]) if len(lists) > 2: print(u'待删除的报告' + lists[1]) logger.info("开始删除测试报告" + lists[1]) os.remove(result_dir + lists[1]) if os.path.exists(result_dir + lists[1]) == False: logger.info("删除测试报告成功" + lists[1]) else: logger.info("删除测试报告失败" + lists[1]) else: logger.info("不需要删除测试报告") #找到最新生成的文件 file_new = os.path.join(result_dir, lists[-1]) print(file_new) if globalparam.isneedsendMail == 1: logger.info("获取是否发送邮件参数:为是~~是~~准备开始发送") #调用发邮件模块 sendmail(file_new) else: logger.info("获取是否发送邮件参数:为否") print("不发送测试报告······")
def __init__(self, user_product): self.compare_url = COMPARE_URL self.user_product = user_product self.log = Log('watchGuard')
# -*- coding:utf-8 -*- from selenium import webdriver import time, os, re, unittest from src.common.log import Log #导入日志模块 Log log = Log() def setup(self): #初始化登录 self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url = "http://192.168.110.85:8095/" self.verificationErrors = [] self.accept_next_alert = True def login_successful(self): #登录后关闭企业管理页面 driver = self.driver driver.maximize_window() time.sleep(1) driver.find_element_by_name('username').clear() time.sleep(1) driver.find_element_by_name('username').send_keys(u'孙兆富') time.sleep(1) driver.find_element_by_name('pwd').clear() time.sleep(1) driver.find_element_by_name('pwd').send_keys('admin123') time.sleep(1) driver.find_element_by_xpath(
def __init__(self, file): self.file = file self.log = Log('')
# -*- coding:utf-8 -*- """ @author: jiangkai @file:connection.py @time:2018/06/03 16:49:28 """ import requests from src.common.log import Log from src.common.myexception import RequestHostFailed log = Log('connect') def open_url(url): """ @summary 根据指定的URL 获取网页内容 :param url: [str] 网页url :return data: [str] 网页内容 """ header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'} try: res = requests.get(url, headers=header) except Exception as e: log.exception('连接被服务器强制断开,请重新尝试...[%s]' % str(e)) raise RequestHostFailed('request请求被服务器强制断开') if res.status_code == 200: data = res.text else: data = "" return data
def __init__(self, user_product): super(Control, self).__init__(user_product) self.product_obj_list = [] self.log = Log('control')