IDO老徐分享:APP测试流程与实用资料V2.0

需积分: 9 3 下载量 71 浏览量 更新于2024-07-17 收藏 400KB PDF 举报
"《App测试流程及资料合集V2.0》由经验丰富的测试专家IDO老徐编撰,旨在提供一套全面且实用的APP测试指南。这份文档不仅涵盖了通用的测试理论知识,还详细介绍了APP测试的独特流程,特别关注客户端兼容性测试,包括系统版本、ROM定制、屏幕分辨率、安装、卸载、升级以及与其他程序的交互影响等。作者强调了工具的使用,如Appium、LR、JMeter、打包工具和抓包工具在测试过程中的重要作用,能够提升效率。 对于Android和iOS平台的测试,虽然存在一些系统特性的差异,但大部分测试原则是相通的,例如横竖屏操作、Home键、音量键和电源键的测试。在实际测试中,熟练运用云测工具如Testin可以大大提高测试效能。 关于环境搭建,通常情况下,由于服务端的统一部署,对客户端测试环境的需求相对较小,无需单独搭建。至于APP的打包和分发,作者推荐了Fir.im和Pgyer等工具网站,确保开发者了解如何将应用发布到相应的市场。 文档深入探讨了APP的软件权限管理,涉及到扣费风险、隐私保护、输入验证、数据安全和网络功能控制等关键点。此外,还强调了安装与卸载过程的安全性,确保应用程序的正确安装、图标显示和数字签名的完整性。 这份资料合集对新手测试人员来说非常有价值,不仅提供了基础知识,还包含了实践经验的总结,有助于新入行者快速上手APP测试工作。有问题时,IDO老徐也鼓励读者通过公众号"简尚"进行交流和咨询。" 通过这份合集,测试人员不仅能掌握基础测试技巧,还能学习到针对移动应用的特殊处理方法,提升测试的专业性和效率。

Unexpected error occurred in scheduled task. java.lang.NullPointerException: temporal at java.util.Objects.requireNonNull(Objects.java:228) at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1741) at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) at com.ido85.icip.spoperation.special_operation.service.impl.SpecialOperationServiceImpl.SpecialOperationStatus(SpecialOperationServiceImpl.java:140) at com.ido85.icip.spoperation.special_operation.service.impl.SpecialOperationServiceImpl$$FastClassBySpringCGLIB$$ff8b66a6.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684) at com.ido85.icip.spoperation.special_operation.service.impl.SpecialOperationServiceImpl$$EnhancerBySpringCGLIB$$38e4f081.SpecialOperationStatus(<generated>) at sun.reflect.GeneratedMethodAccessor153.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

2023-06-10 上传

帮忙优化以下代码:public void runTask(ReportResultTask data, RunListener runListener) { UseMasterDataTypeEnum dataTypeEnum = ReportCommonLogicHelper.judgeTaskParam(data); // params.put(ReportCommonMasterDataRelationHelper.ParamTypeEnum.USE_MASTER_ENUM, dataTypeEnum.getValue()); params.put(ReportCommonMasterDataRelationHelper.ParamTypeEnum.YEAR_MONTH, data.getYearAndMonth()); try { List<ReportResultInventoryConsumablesNonFirst> saveList = Collections.synchronizedList(new ArrayList<>()); ReportNonFirstInvBO bo = new ReportNonFirstInvBO(); bo.setParams(params); bo.setYearMonth(Func.toLong(data.getYearAndMonth())); LiteflowResponse response = flowExecutor.execute2Resp("flow-calc-non-first-data", bo, ReportNonFirstInvBO.class); if (response.isSuccess()) { saveList = bo.getResults(); } if (saveList != null & saveList.size() > 0) { saveList.stream().forEachOrdered(fun -> { bo.setDistributorCode(fun.getNonFirstDistributorCode()); bo.setYearMonth(fun.getYearMonth()); bo.setIdo(BigDecimal.ZERO); fun.getNonFirstData().stream().forEach(fun1 -> { bo.setProductLine(fun1.getProductLine()); LiteflowResponse idoResponse = flowExecutor.execute2Resp("flow-calc-non-first-calcIdo", bo, ReportNonFirstInvBO.class); if (idoResponse.isSuccess()) { if (fun1.getProductLine().equals(IDO_TOTAL_PL)) { fun1.getItemData().stream().filter(fun2 -> ResultConstance.IDO_TOTAL.equals(fun2.getItemName())).forEach(x -> x.setItemValue(bo.getIdo())); } else { fun1.getItemData().stream().filter(fun2 -> ResultConstance.IDO.equals(fun2.getItemName())).forEach(x -> x.setItemValue(bo.getIdo())); } } }); }); this.updateSystemFieldInfo(saveList, data); inventoryConsumablesNonFirstService.insertBatch(saveList); runListener.complete(); } else { runListener.error(String.format("所选【%s-%s】产品/经销商主数据为空", data.getYearAndMonth(), "")); } } catch (Exception e) { log.error(StringUtil.format("非一级试剂耗材库存报表处理出错【{}】", e.getMessage()), e); runListener.error(StringUtil.format("非一级试剂耗材库存报表处理出错【{}】", e.getMessage())); } }

2023-06-08 上传