def run(uuid): # todo:恶心啊 如果不加这句,多进程运行会报错 # [pocoservice.apk] stdout: b'INSTRUMENTATION_RESULT: shortMsg=Process crashed.\r\nINSTRUMENTATION_CODE: 0\r\n' # 并且多进程执行时会出现报错(疑似隔离问题,加上这句初始化后正常) init_device(uuid=uuid) APK = "3139_wdsm_wdsm_3k_20191112_28835_28835.apk" game_name, package_name, launchable_activity = get_packagename_and_launchable_activity( APK) case = Cases(uuid=uuid, apk_path=APK, package=package_name, game_name=game_name) case.execute() return "success!"
def run_case(uuid): log_dir = os.path.join(APP.AIRTEST_LOG_FILE_PATH, uuid, time.strftime("%Y_%m_%d_%H_%M_%S")) if not os.path.exists(log_dir): os.makedirs(log_dir) # todo 需要加上这一句,否则pocoservice会报错 auto_setup(basedir=APP.WORKSPACE, devices=["Android:///" + uuid], logdir=log_dir) APK = "3139_wdsm_wdsm_3k_20191112_28835_28835.apk" game_name_, package_name_, launchable_activity = get_packagename_and_launchable_activity( APK) # discover = unittest.defaultTestLoader.discover(start_dir=APP.TEST_CASE_ROOT_PATH, # pattern="test*.py", # top_level_dir=None) # todo: 需要实现测试发现功能 # 这里需要注意一下:后续会开放多个接口,有一键执行多个用例接口,有执行特定用例接口; suite = unittest.TestSuite() suite.addTest( BaseCase.parametrize(TestInstall, uuid=uuid, group_name=game_name_, apk_path=APK, package_name=package_name_)) suite.addTest( BaseCase.parametrize(TestAllowPermission, uuid=uuid, group_name=game_name_, apk_path=APK, package_name=package_name_)) unittest.TextTestRunner().run(suite) ret_ = run_one_report(os.path.join(APP.AIRTEST_LOG_FILE_PATH, "empty.py"), uuid, log_dir) return uuid, ret_
def run_case_auto(uuid, apk_path): """ 自动添加测试用例文件下全部用例(执行顺序需按照既定的规则) :param uuid: :param apk_path: :return: """ log_dir = os.path.join(APP.AIRTEST_LOG_FILE_PATH, uuid, time.strftime("%Y_%m_%d_%H_%M_%S")) if not os.path.exists(log_dir): os.makedirs(log_dir) # todo 需要加上这一句,否则pocoservice会报错 auto_setup(basedir=APP.WORKSPACE, devices=["Android:///" + uuid], logdir=log_dir) game_name, package_name, activity = get_packagename_and_launchable_activity( apk_path) # todo: 需要实现测试发现功能 # 这里需要注意一下:后续会开放多个接口,有一键执行多个用例接口,有执行特定用例接口; suite = suite_all_case(uuid, group_name=game_name, apk_path=apk_path, package_name=package_name) try: unittest.TextTestRunner().run(suite) except Exception as e: logger.info(str(e)) return uuid, {} else: # 运行报告 result = run_one_report( os.path.join(APP.AIRTEST_LOG_FILE_PATH, "empty.py"), uuid, log_dir) return uuid, result
def run_case_by_custom(uuid, apk_path): """ 手动添加测试用例,确保用例执行顺序 :param uuid: :param apk_path: :return: """ log_dir = os.path.join(APP.AIRTEST_LOG_FILE_PATH, uuid, time.strftime("%Y_%m_%d_%H_%M_%S")) if not os.path.exists(log_dir): os.makedirs(log_dir) # todo 需要加上这一句,否则pocoservice会报错 auto_setup(basedir=APP.WORKSPACE, devices=["Android:///" + uuid], logdir=log_dir) game_name, package_name, activity = get_packagename_and_launchable_activity( apk_path) # 测试用例添加进测试套件 suite = unittest.TestSuite() param = (uuid, game_name, apk_path, package_name) # 参数 suite.addTest(BaseCase.parametrize(TestInstall, *param)) suite.addTest(BaseCase.parametrize(TestAllowPermission, *param)) try: unittest.TextTestRunner().run(suite) except Exception as e: logger.info(str("run_case_by_custom error: {0}".format(e))) return uuid, {} else: # 运行报告 result = run_one_report( os.path.join(APP.AIRTEST_LOG_FILE_PATH, "empty.py"), uuid, log_dir) return uuid, result
async def run_script(uuid): log_dir = os.path.join(APP.AIRTEST_LOG_FILE_PATH, uuid, time.strftime("%Y_%m_%d_%H_%M_%S")) if not os.path.exists(log_dir): os.makedirs(log_dir) # todo 需要加上这一句,否则pocoservice会报错 auto_setup(basedir=APP.WORKSPACE, devices=["Android:///" + uuid], logdir=log_dir) APK = "3139_wdsm_wdsm_3k_20191112_28835_28835.apk" game_name_, package_name_, launchable_activity = get_packagename_and_launchable_activity( APK) # 需要实现测试发现功能 suite = unittest.TestSuite() suite.addTest( BaseCase.parametrize(TestInstall, uuid=uuid, group_name=game_name_, apk_path=APK, package_name=package_name_)) suite.addTest( BaseCase.parametrize(TestAllowPermission, uuid=uuid, group_name=game_name_, apk_path=APK, package_name=package_name_)) # todo: 单元测试的run方法导致协程不能运行? unittest.TextTestRunner().run(suite) ret_ = run_one_report(os.path.join(APP.AIRTEST_LOG_FILE_PATH, "empty.py"), uuid, log_dir) return uuid, ret_
if __name__ == '__main__': # apk = "3139_wdsm_wdsm_3k_20191112_28835_28835.apk" # apk = "2905_wdsm_wdsmzgl_qq3k_20191108_28156_28156.apk" # apk = "620_wzzg_wzzg_360_20190920_0_21381.apk" # apk = "1903_wzzg_wzzgjymz_qq3k_20191012_24007_24007.apk" # apk = "2322_xcqy_xcqymhxy_qq3k_20190930_26519_26519.apk" # apk = "3165_tkqx_tkqx_3k_20191106_2833_2833.apk" apk = "3372_tkqx_tkqxzh_qq3k_20191112_23875_23875.apk" game_name, package_name, activity = get_packagename_and_launchable_activity( apk) dev = init_device() if package_name not in dev.list_app(): # 使用这种方式不会因为遇到弹框而阻塞 dev.adb.push(apk, "/data/local/tmp/") proc = dev.adb.start_shell( "pm install /data/local/tmp/{0}".format(apk)) dev.stop_app(package_name) dev.start_app(package_name) poco = AndroidUiautomationPoco() # 权限框弹窗处理 btn_text = ["确认", "始终允许", "允许", "总是允许"] watcher(btn_text, poco=poco)
def execute(self): while 1: uuid = self.q.get() if uuid is None: break self.execute_install(uuid) self.execute_allow_permission(uuid) q.task_done() if __name__ == '__main__': devices = [dev[0] for dev in ADB().devices()] APK = "3139_wdsm_wdsm_3k_20191112_28835_28835.apk" game_name, package_name, launchable_activity = get_packagename_and_launchable_activity( APK) q = queue.Queue() tasks = [] threads = [] for device in devices: q.put(device) for device in devices: cases = Cases(q, apk_path=APK, package=package_name, game_name=game_name) tasks.append(cases)