def run_case(): logger.debug("进入unittest") class TC102(unittest.TestCase): """用例描述""" @classmethod def setUpClass(cls): """ 这里放需要在所有用例执行前执行的部分""" pass def setUp(self): logger.info('测试测试用例') """这里放需要在每条用例前执行的部分""" pass def test_demo(self): """点击微信登录""" pass def tearDown(self): """这里放需要在每条用例后执行的部分""" sleep(5) @classmethod def tearDownClass(cls): u"""这里放需要在所有用例后执行的部分""" pass # 调试测试类下所有方法 srcSuite = unittest.TestLoader().loadTestsFromTestCase(TC102) # 调试测试类下某个方法 # srcSuite = TC101("test_login") return srcSuite
def query_model_during_export(db_obj, model): """Retrieves query for existing columns of the table modified. During DB setup, newly added column throw error on querying. Those columns need to be skipped while querying. Doesn't export deleted campaigns. Args: db_obj: instance of DatabaseAPI model: instance of DB table Returns: All the results of the query. """ except_cols = list() tbl_name = model.__tablename__ while True: try: rows = db_obj.db_session.query( *[c for c in model.__table__.c if c.name not in except_cols]) rows = rows.all() except (TypeError, OperationalError) as e: if 'Unknown database' in e.message: raise e logger.debug(e.message) col_name = search(r"%s\.(.+?)'" % tbl_name, e.message).group(1) logger.info("Skipping new column %s", col_name) except_cols.append(col_name) else: return rows
def run_case(devices, poco): logger.debug("{}进入unittest".format(devices)) package = Madb(devices).get_packagename() class TC101(unittest.TestCase): """用例描述""" @classmethod def setUpClass(cls): """ 这里放需要在所有用例执行前执行的部分""" wake() def setUp(self): """这里放需要在每条用例前执行的部分""" start_app(package) sleep(2) def test_login(self): """点击微信登录""" pass # logger.info('执行1') # poco(text='微信登录').click() def test_demo2(self): """点击手机号登录""" pass # logger.info('执行2') # poco(text='手机号登录').click() # pass def test_demo3(self): """touch使用""" pass # logger.info('执行test_demo3') # touch(Template('{}/login_on.png'.format(case_img))) def tearDown(self): """这里放需要在每条用例后执行的部分""" sleep(5) stop_app(package) @classmethod def tearDownClass(cls): u"""这里放需要在所有用例后执行的部分""" pass # 调试测试类下所有方法 # srcSuite = unittest.TestLoader().loadTestsFromTestCase(TC101) # 调试测试类下某个方法 srcSuite = TC101("test_login") return srcSuite
def run_case(driver: AutoWeb, url): logger.debug("进入unittest") class TC101(unittest.TestCase): """用例描述""" @classmethod def setUpClass(cls): """ 窗口最大化并访问测试网页地址""" driver.maximize_window() driver.get(url) driver.find_element_by_xpath("//*[@type='text']").send_keys('zwq') driver.find_element_by_xpath("//*[@type='password']").send_keys('situ1234') driver.airtest_touch(Template('{}/login_on.png'.format(case_path))) def setUp(self): """这里放需要在每条用例前执行的部分""" pass @classmethod def test_login(cls): """点击微信登录""" logger.info('测试登录') pass def test_demo2(self): """点击手机号登录""" pass def test_demo3(self): """touch使用""" pass def tearDown(self): """这里放需要在每条用例后执行的部分""" sleep(1) @classmethod def tearDownClass(cls): """关闭浏览器""" time.sleep(1) driver.quit() # 调试测试类下所有方法 # srcSuite = unittest.TestLoader().loadTestsFromTestCase(TC101) # 调试测试类下某个方法 srcSuite = TC101("test_login") return srcSuite
def recreate_db(): """Drop and create DB using latest model definitions""" logger.debug(db_settings) db_obj = MySQLConnection(**db_settings) db_obj.connect() cursor = db_obj.cursor() drop_all = "DROP DATABASE IF EXISTS %s;" logger.info('Dropping database') cursor.execute(drop_all % options.db_name) db_settings.update({'db': options.db_name}) logger.info('Creating database') cursor.execute( """CREATE DATABASE IF NOT EXISTS %(db)s DEFAULT CHARACTER SET %(charset)s DEFAULT COLLATE %(collation)s;""" % db_settings) cursor.close() with DatabaseAPI() as db_api: db_api.create_tables()
def InputEvent(self): devices = self.get_mdevice() logger.info("设备{}开始进行自动处理权限".format(devices)) # 获取andorid的poco代理对象,准备进行开启安装权限(例如各个品牌的自定义系统普遍要求的二次安装确认、vivo/oppo特别要求的输入手机账号密码等)的点击操作。 pocoAndroid = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) # 这里是针对不同机型进行不同控件的选取,需要用户根据自己的实际机型实际控件进行修改 n = self.get_iteration() # 先实现功能,以后有空参数化函数 if devices == "172.16.6.82:7425": count = 0 # 找n次或找到对象以后跳出,否则等5秒重试。 while True: logger.debug("{}安装应用的权限点击,循环第{}次".format(devices, count)) if count >= n: logger.debug("{}退出InputEvent线程".format(devices)) break if pocoAndroid("com.coloros.safecenter:id/et_login_passwd_edit" ).exists(): pocoAndroid( "com.coloros.safecenter:id/et_login_passwd_edit" ).set_text("123456") time.sleep(2) if pocoAndroid("android.widget.FrameLayout").offspring( "android:id/buttonPanel").offspring( "android:id/button1").exists(): pocoAndroid("android.widget.FrameLayout").offspring( "android:id/buttonPanel").offspring( "android:id/button1").click() break else: time.sleep(5) count += 1 elif devices == "127.0.0.1:62025": count = 0 while True: logger.debug("{}安装应用的权限点击,循环第{}次".format(devices, count)) if count >= n: break if pocoAndroid( "com.android.packageinstaller:id/continue_button" ).exists(): pocoAndroid( "com.android.packageinstaller:id/continue_button" ).click() else: time.sleep(5) count += 1
def send(self, params=None, data=None, **kwargs): response = self.session.request(method=self.method, url=self.url, params=params, data=data, **kwargs) response.encoding = 'utf-8' logger.debug('{0} {1}'.format(self.method, self.url)) logger.debug('请求成功:{0}\n{1}'.format(response, response.text)) return response
def main(): # 默认去config.ini里读取期望参与测试的设备,若为空,则选择当前连接的所有状态为“device”的设备 devicesList = Madb().get_devicesList() if devicesList[0] == "": devicesList = Madb().getdevices() logger.info("最终的devicesList={}".format(devicesList)) if Madb().get_apkpath() == "" or Madb().get_packagename() == "": logger.error("配置文件填写不全,packagename和apkpath是必填项") devicesList = None # 读取是否跳过发送邮件 skip_email_flag = Madb().get_skip_email() skip_email = True if skip_email_flag == '1' else False # 读取是否需要同步性能测试的配置。 skip_performance = Madb().get_skip_performance() skip_performance = True if skip_performance == "1" else False is_storaged_by_excel = Madb().get_storage_by_excel() is_storaged_by_excel = True if is_storaged_by_excel == "1" else False reportpath = os.path.join(os.getcwd(), "Report") # 没有Report目录时自动创建 if not os.path.exists(reportpath): os.mkdir(reportpath) os.mkdir(reportpath + "/Screen") logger.debug(reportpath) logger.info("测试开始") if devicesList: try: logger.info("启动进程池") # 进程池 p_list = [] # 根据设备列表去循环创建进程,对每个进程调用下面的enter_processing/enter_enter_performance方法。 for i in range(len(devicesList)): # start会被传递到2个进程函数里,作为区分最终产物html和excel的标志 start = time.localtime() madb = Madb(devicesList[i]) if madb.get_androidversion() < 5: logger.error("设备{}的安卓版本低于5,不支持。".format( madb.get_mdevice())) continue else: # 进程通信变量flag,默认为0,完成测试时修改为1。 flag = Value('i', 0) if not skip_performance: pro1 = Process(target=enter_performance, args=(madb, flag, start, is_storaged_by_excel)) p_list.append(pro1) pro2 = Process(target=enter_processing, args=( i + 1, madb, flag, start, )) p_list.append(pro2) for p1 in p_list: p1.start() for p2 in p_list: p2.join() logger.info("进程回收完毕") logger.info("测试结束") except AirtestError: logger.error("Airtest发生错误" + traceback.format_exc()) except PocoException: logger.error("Poco发生错误" + traceback.format_exc()) except Exception: logger.error("发生未知错误" + traceback.format_exc()) else: logger.error("未找到设备,测试结束") # 判断是否发送邮件 if not skip_email: try: Email().send_email() except Exception: logger.error(traceback.format_exc()) else: logger.info('跳过发送邮件')
def confirmOrderItems(self, orderItems: list): """ 直接提交订单 :param orderItem:商品数据对象 :return: 商品数量修改结果 True/False """ # TODO: 这是页面的访问 找到json的请求接口 url = "https://wq.jd.com/deal/confirmorder/main" commlist = [] for orderItem in orderItems: comm = f"{orderItem.pid},,{orderItem.count},{orderItem.pid},{orderItem.selectPromotion},,0" commlist.append(comm) print(commlist) # 选择item提交 payload = { "commlist": '$'.join(commlist), "cu": "true", "utm_source": "kong", "utm_medium": "jingfen", "utm_campaign": "t_1002950757_" } headers = { 'User-Agent': self.user_agent, "Origin": "https://p.m.jd.com", "Referer": "https://p.m.jd.com/" } logger.debug("1") resp = self.sess.get(url, params=payload, headers=headers) logger.debug("2") try: pattern = re.compile(r"\"order\":(.*),\s+\"orderPromotion", re.MULTILINE | re.DOTALL) # dealData = pattern.search(resp.text).group(1) try: dealData = demjson.decode( str(pattern.search(resp.text).group(1))) except Exception as e: return venderCart = dealData.get("venderCart") self.submitOrderExtraData["traceId"] = dealData.get("traceId") self.submitOrderExtraData["token2"] = dealData.get("token2") self.submitOrderExtraData["skulist"] = dealData.get("skulist") flag = True def _parse_product(products): for product in products: mainSku = product.get("mainSku") if int(product.get("mainSku").get("outOfStock")) == 0: continue else: sku_id = mainSku.get("id") sku_name = mainSku.get("name") logger.error(f"订单中{sku_id}:{sku_name}无货!") return False return True for vender in venderCart: if vender.get("products"): flag = _parse_product(vender.get("products")) and flag if vender.get("mfsuits"): for _item in vender.get("mfsuits"): flag = _parse_product(_item.get("products")) and flag if vender.get("mzsuits"): for _item in vender.get("mzsuits"): flag += _parse_product(_item.get("products")) and flag if flag: logger.debug("3") logger.info("选择Order成功") return True except Exception as e: logger.error(traceback.format_exc()) logger.debug("3") logger.error("选择Order失败") return False