# tips **Repository Path**: chris_coder/tips ## Basic Information - **Project Name**: tips - **Description**: tips on work - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-08-08 - **Last Updated**: 2021-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tips tips on work 无扫网,无切卡 250168000000074e3231000030314108674390400016733839383630343430313931394330303831383738046004608131187800000e620b017d13016c6b185c04000000000100000002000000000000000000000000000001011702030000000005000000ac6427 无扫网,有切卡 250169000000174e32310000303141086743904000167338393836313131393232343030323832383836340460113040489862000009ca00811cd00039720156f40200000004000000060000000000000000000000000000010117200300000000060000028c208a27 有扫网,无切卡 2501900000000f4e32310000303141086743904000167338393836313131393232343030323832383836340460113040489862000009ca0259385200cb730156f30200000001000000010000000000000000000000000000010117200300000000010000003901310100000e655f1000000e68660600000e626b05020000066865fb00000ed67afa0000000000001827 有扫网,有切卡 2501910000001f4e32310000303141086743904000167338393836313131393232343030323832383836340460113040489862000009ca00811cd000396f0857f60200000006000000080000000000000000000000000000010117200300000000060000032401310100000e655d1300000e68600e00000e626a070200000ed67302000000000000000000000000203627 A报文 683836373732353033333136363739380202ffc500ec001b0101607b91b5e03245c967d32ed3ed1740b4b6da75fe5b05e226bbc6c193e1e82c02a140cdaf3415832685b991d0261abf028abcb75eb5ffc8a799575ce237d07c6d2fd8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7a4d73642b7066d5a1873c640e6c83dfdc0cf25b3973b8cba6517d8a3168347c16d8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7ad8b59848c7670c94b29b54d2379e2e7a114dad9f83d3e67cc91fe786529f6e546e5ce77821ba515109011625389bee36f653a02cece3fa0228aaf51cf7237f8600007816 Git统计一段时间内的代码行数 git log --pretty=tformat: --since ==2020-1-10 --until=2020-5-5 --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' 1、研发Bug的定义: 在云端定义中,研发Bug分为以下几类: (1)阻塞性Bug:指操作流程无法正常进行、结束,但不包含错误异常处理。(A) (2)功能性Bug:指操作流程能正常结束,但实现原因,导致出现非正常结果或错误。(B或C) (3)提示性Bug:指操作流程能正常结束,但在交互、显示上与UE设计输出的视觉文件不一致。(C或D) 其中: 阻塞性Bug应该对应终端定义中的A级别,代表致命 功能性Bug应该对应终端定义中的B或C级别,代表严重或一般 提示性Bug应该对应终端定义中的C级别或D级别,代表提示性 以上三类Bug的确认,应当由测试人员与研发人员进行沟通,不确定的时候,应该有软件经理的参与。 2、非研发Bug的定义: 在云端的定义中,非研发Bug主要是:需求性Bug,指代码按照功能实现了,但未能达到产品预期,或是产品定义需求存在问题。 此类Bug,本质上不属于故障,属于需求传递问题,不因由测试人员去进行Bug定级,应由项目经理和UE或是产品经理进行确定传达。 但结合4G管道云中,由终端同事定义的故障等级如下: 设备在线率统计中在线设备和离线设备统计策略是3天未数据交互更新状态 A 上述的问题,是产品侧明确定义的在线离线逻辑,如果终端测试人员认为不合理,应该反馈至项目经理,最终由产品经理进行决定。 测试小伙伴提出问题,原则上一定是要在本次转测需求框架范围内的,切不能因自认为需求不合理就new出需求来。 https://kdocs.cn/l/seySVNlr3?f=301 测试暂定给粤海侧提供的appId与secretKey: appId =“yuehai”, secretKey = “f82b53dae7a144828da9ac096b2f5974” Apache-Commons-Dbutils 学习笔记: https://www.cnblogs.com/best/p/7485389.html https://www.cnblogs.com/best/p/7485389.html 导入校验 ``` java @Slf4j public class UploadDeviceInfoListener extends AnalysisEventListener { private DeviceManageMapper deviceManageMapper; private EmqRedisDao emqRedisDao; /** * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 50; private static final String COLUMN_NAME_0 = "设备序列号"; private static final String COLUMN_NAME_1 = "运营商"; private static final String COLUMN_NAME_2 = "小区名称"; private static final String COLUMN_NAME_3 = "小区地址"; private static final String CELL_NAME_REGEX = "^[\u4E00-\u9FA5A-Za-z0-9_-]{0,32}"; private static final String CELL_ADDRESS_REGEX = "^[\u4E00-\u9FA5A-Za-z0-9_-]{0,128}"; private static final String IMEI_REGEX = "^[0-9]{15}"; List list = new ArrayList<>(); private Map updateRedisMap = new HashMap<>(1); private List errorInfo = new ArrayList<>(); private int rowNum = 1; private Boolean hasStart = false; public UploadDeviceInfoListener(DeviceManageMapper deviceManageMapper, EmqRedisDao emqRedisDao) { this.deviceManageMapper = deviceManageMapper; this.emqRedisDao = emqRedisDao; } @Override public void invoke(DeviceInfoModelOfExcel deviceInfoModelOfExcel, AnalysisContext analysisContext) { long startTime = System.currentTimeMillis(); rowNum += 1; StringBuilder sb = new StringBuilder(); if (!hasStart) { log.error("表头数据存在问题!请下载模板进行数据导入!"); return; } if (deviceInfoModelOfExcel == null) { log.error("数据为空!"); return; } if (!ReUtil.isMatch(IMEI_REGEX,deviceInfoModelOfExcel.getImei())){ sb.append("设备序列号应为15位数字!"); } else if(!(OperatorEnum.CMCC.getOperator().equals(deviceInfoModelOfExcel.getOperator()) || OperatorEnum.CTCC.getOperator().equals(deviceInfoModelOfExcel.getOperator()) || OperatorEnum.CUCC.getOperator().equals(deviceInfoModelOfExcel.getOperator()))) { sb.append("运营商只能为CMCC、CTCC、CUCC!"); } else if (!ReUtil.isMatch(CELL_NAME_REGEX, deviceInfoModelOfExcel.getCellName())){ sb.append("小区名称应为1-32位,中英文、数字、中划线、下划线!"); } else if (!ReUtil.isMatch(CELL_ADDRESS_REGEX, deviceInfoModelOfExcel.getCellAddress())){ sb.append("小区地址应为1-128位,中英文、数字、中划线、下划线!"); } if (StringUtils.isEmpty(sb)){ // 添加对象 DeviceInfo deviceInfo = new DeviceInfo(); deviceInfo.setImei(deviceInfoModelOfExcel.getImei()); deviceInfo.setOperator(deviceInfoModelOfExcel.getOperator()); deviceInfo.setCellAddress(deviceInfoModelOfExcel.getCellAddress()); deviceInfo.setCellName(deviceInfoModelOfExcel.getCellName()); Map cellIdInfo = emqRedisDao.findCellIdInfo(); Set keySet = cellIdInfo.keySet(); for (String ks : keySet){ if ((deviceInfoModelOfExcel.getCellAddress() + deviceInfoModelOfExcel.getCellName()).equals(ks)){ deviceInfo.setCellId(cellIdInfo.get(ks).split(";")[0]); deviceInfo.setCellLocations(cellIdInfo.get(ks).split(";")[1]); } } if (!CollectionUtils.isEmpty(list)){ list.forEach(di-> { if (deviceInfoModelOfExcel.getCellName().equals(di.getCellName()) && deviceInfoModelOfExcel.getCellAddress().equals(di.getCellAddress())){ deviceInfo.setCellId(di.getCellId()); deviceInfo.setCellLocations(di.getCellLocations()); }}); } if (StringUtils.isBlank(deviceInfo.getCellId()) && StringUtils.isBlank(deviceInfo.getCellLocations())) { deviceInfo.setCellId(IdUtil.simpleUUID()); String cellDetailAddress = deviceInfoModelOfExcel.getCellAddress() + deviceInfoModelOfExcel.getCellName(); String agps = AmapTools.getAGPS(cellDetailAddress); deviceInfo.setCellLocations(agps); updateRedisMap.put(deviceInfo.getCellAddress() + deviceInfo.getCellName(), deviceInfo.getCellId() + ";" + deviceInfo.getCellLocations()); emqRedisDao.updateCellIdInfo(updateRedisMap); } list.add(deviceInfo); if (list.size() >= BATCH_COUNT) { List temImeis = new ArrayList<>(); List uniqueList = list.stream().filter( di -> { if (!temImeis.contains(di.getImei())) { temImeis.add(di.getImei()); return true; } else { sb.append("excel表格中设备序列号:").append(di.getImei()).append("重复添加!"); return false; } } ).collect(Collectors.toList()); List imeis = emqRedisDao.findAllImei(); List endList = uniqueList.stream().filter( di -> { if (!imeis.contains(di.getImei())) { return true; } else { sb.append("设备序列号:").append(di.getImei()).append("已存在!"); return false; } } ).collect(Collectors.toList()); if (!StringUtils.isEmpty(sb)) { errorInfo.add(sb.toString()); } if (!CollectionUtils.isEmpty(endList)) { deviceManageMapper.batchInsertDeviceInfo(endList); emqRedisDao.updateImei(endList.stream().map(DeviceInfo::getImei).toArray(String[]::new)); } // 存储完清理数组 list.clear(); } } else { sb.insert(0,"第" + rowNum + "行数据存在错误!"); errorInfo.add(sb.toString()); } log.info("第" + rowNum + "条用时:" + (System.currentTimeMillis()-startTime) + "毫秒"); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { if (CollectionUtils.isEmpty(list)) { return; } StringBuilder sb = new StringBuilder(); List temImeis = new ArrayList<>(); List uniqueList = list.stream().filter( di -> { if (!temImeis.contains(di.getImei())) { temImeis.add(di.getImei()); return true; } else { sb.append("excel表格中设备序列号:").append(di.getImei()).append("重复添加!"); return false; } } ).collect(Collectors.toList()); List imeis = emqRedisDao.findAllImei(); List endList = uniqueList.stream().filter( di -> { if (!imeis.contains(di.getImei())) { return true; } else { sb.append("设备序列号:").append(di.getImei()).append("已存在!"); return false; } } ).collect(Collectors.toList()); if (!StringUtils.isEmpty(sb)) { errorInfo.add(sb.toString()); } if (!CollectionUtils.isEmpty(endList)) { deviceManageMapper.batchInsertDeviceInfo(endList); emqRedisDao.updateImei(endList.stream().map(DeviceInfo::getImei).toArray(String[]::new)); } log.info("所有数据解析导入完成!"); } @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { hasStart = true; StringBuilder sb = new StringBuilder(); log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); String columnName0 = headMap.get(0); String columnName1 = headMap.get(1); String columnName2 = headMap.get(2); String columnName3 = headMap.get(3); if (CollectionUtils.isEmpty(headMap) || headMap.size() == 0 || headMap.size() != 4 || !COLUMN_NAME_0.equals(columnName0) || !COLUMN_NAME_1.equals(columnName1) || !COLUMN_NAME_2.equals(columnName2) || !COLUMN_NAME_3.equals(columnName3)) { sb.append("Excel表格与模板不符,请先下载模板!"); hasStart = false; } if (hasStart.equals(false)) { errorInfo.add(sb.toString()); } } @Override public void onException(Exception exception, AnalysisContext context) { log.error("解析导入失败,问题是:{}", exception.getMessage()); if (exception instanceof ExcelDataConvertException) { ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; log.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex(), excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData()); } throw new ExcelAnalysisException(exception.getMessage()); } public List getErrorInfo() { return errorInfo; } } ```