【深度测试】看到技术方案后,该怎么进行分析和测试

测试左移的思想,讲究尽早测试,测试是一系列的行为,并不一定要等代码运行起来才能测,下面会分享一些经验,提供大家参考。

一、静态分析

1.1 分析方法调用链

目标:梳理结构,化繁为简
原理:相同数据源,相同方法(逻辑),无需进行重复测试
举例:通用榜单项目,多个不同入口,榜单前置预检逻辑:
在这里插入图片描述

1.2 代码阅读

目标:补充技术文档中未涉及部分&确认代码和文档的匹配一致性;
原理:不能自洽的部分,读着读着就发现问题了(可以自己读,也可以和开发一起读)
举例:涉及代码段,不太方便举例子

1.3 可以直接被review出来的常见错误

  1. 容易遗漏的一般是:系统行为、异常处理、排序逻辑;
  2. 容易出错的一般是:硬编码、方法的调用方和方法定义不一致(方法名和执行命令名不一致、方法名和kv设计不一致)、逻辑错误(缺少结束返回值、变量赋值错误)、接口文档和实际接口结构体,字段定义不一致、边界值处理;
  3. 条件逻辑错误:比如go语言的“&&”乱用;
  4. msg_id和redis幂等键书写取值错误:redis锁使用了秒级时间戳(秒级锁相当于一个失败的锁);

//总的来说,多关注下内部数据流转链路、并发的设计。//

二、代码“异味”

有的问题,属于能用但是很烂,我们可以借助一些工具来辅助。
不同语言,适用的检测工具是不同的,因为本司接触go比较多一些,故而以下可以适用于go。

2.1 GolangCi-lint

1、谷歌、脸书、IBM、雅虎等公司均采用

2、下载方便,速度快,可与sublime,vscode等编辑器整合

3、聚合48种linters,扫描规则丰富

2.2 SonarQube集成GolangCi-lint

2.2.1 docker 安装SonarQube
  1. 拉取postgre镜像:docker pull postgres
  2. 拉取sonarqube镜像:docker pull sonarqube
  3. 启动postgre容器:
docker run --name db
-e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar
-d postgres
  1. 挂载目录赋权:chown -R 999:999 sonarqube_data sonarqube_extensions sonarqube_logs sonarqube_conf

//注:docker内部使用sonarqube用户,如果不改权限,挂载本地目录会报错,sonarqube内部使用的默认用户名分组为999

  1. 启动sonar容器:
docker run  --name sonarqube \
--link db \
-e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar \
-v $PWD/sonarqube_data:/opt/sonarqube/data \
-v $PWD/sonarqube_extensions:/opt/sonarqube/extensions \
-v $PWD/sonarqube_logs:/opt/sonarqube/logs \
-v $PWD/sonarqube_conf:/opt/sonarqube/conf \
-p 9000:9000  \
-d --privileged=true sonarqube
2.2.2 安装静态代码扫描工具golangci-lint

通过github获取指定版本:https://github.com/golangci/golangci-lint/releases
本地安装:

  1. mac brew 安装:
brew install golangci-lint
or
brew install golangci/tap/golangci-lint
  1. Linux和Windows:
# binary will be $(go env GOPATH)/bin/golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.39.0
 
golangci-lint --version
  1. 使用golangci-lint开始执行扫描:
$ cd go-live/app/service/live-reward/internal/service
$ golangci-lint run -v --out-format checkstyle > golangcilint.xml

  1. 控制台信息如下:
$ mauer@MabledeMacBook-Pro service % golangci-lint run -v --out-format checkstyle > golangcilint.xml
INFO [config_reader] Config search paths: [./ /Users/mauer/go/src/bilibili/go-live/app/service/live-reward/internal/service]
INFO [lintersdb] Active 10 linters: [deadcode errcheck gosimple govet ineffassign staticcheck structcheck typecheck unused varcheck]
INFO [loader] Go packages loading at mode 575 (types_sizes|deps|imports|name|compiled_files|exports_file|files) took 585.760604ms
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 3.390498ms
INFO [linters context/goanalysis] analyzers took 0s with no stages
INFO [runner/max_same_issues] 17/20 issues with text "unusedresult: result of fmt.Sprintf call not used" were hidden, use --max-same-issues
INFO [runner] Issues before processing: 44, after processing: 6
INFO [runner] Processors filtering stat (out/in): diff: 23/23, max_per_file_from_linter: 23/23, max_from_linter: 6/6, sort_results: 6/6, cgo: 44/44, skip_files: 44/44, autogenerated_exclude: 44/44, nolint: 43/43, uniq_by_line: 23/43, severity-rules: 6/6, path_prefixer: 6/6, filename_unadjuster: 44/44, path_prettifier: 44/44, skip_dirs: 44/44, exclude: 44/44, source_code: 6/6, path_shortener: 6/6, identifier_marker: 44/44, exclude-rules: 43/44, max_same_issues: 6/23
INFO [runner] processing took 4.739912ms with stages: nolint: 2.471254ms, exclude-rules: 874.552µs, identifier_marker: 520.534µs, path_prettifier: 425.545µs, skip_dirs: 149.956µs, source_code: 128.702µs, autogenerated_exclude: 121.867µs, max_same_issues: 23.073µs, uniq_by_line: 10.309µs, cgo: 4.657µs, max_from_linter: 2.591µs, filename_unadjuster: 2.188µs, max_per_file_from_linter: 1.967µs, path_shortener: 1.246µs, diff: 317ns, skip_files: 269ns, severity-rules: 264ns, sort_results: 257ns, exclude: 232ns, path_prefixer: 132ns
INFO [runner] linters took 206.589753ms with stages: goanalysis_metalinter: 201.585771ms
INFO File cache stats: 4 entries of total size 62.1KiB
INFO Memory: 10 samples, avg is 72.1MB, max is 72.6MB
INFO Execution took 809.232544ms
2.2.3 使用sonar-scanner集成golangci-lint报告
$ cd go-live/app/service/live-reward/internal/service
$ sonar-scanner
  -Dsonar.projectKey = live-reward \
  -Dsonar.sources .\
  -Dsonar.host.url = http://192.168.0.20:9000 \
  -Dsonar.login = 8113d659484bea6a600cc2d080e546f7df8a7b60

如果使用sonar-project.properties则无需指定配置参数:


$ cd go-live/app/service/live-reward/internal/service
$ sonar-scanner

控制台信息如下:

$ mauer@MabledeMacBook-Pro service % sonar-scanner
WARN:   * golangcilint.xml
INFO: Analysis report generated in 61ms, dir size=326 KB
INFO: Analysis report compressed in 61ms, zip size=94 KB
INFO: Analysis report uploaded in 274ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://192.168.0.20:9000/dashboard?id=live-reward
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://192.168.0.20:9000/api/ce/task?id=AXWJy_nPVL3yjLKDbznj
INFO: Analysis total time: 6.570 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 7.569s
INFO: Final Memory: 13M/50M
INFO: ------------------------------------------------------------------------
2.2.4 sonar配置文件
#----- Default SonarQube server
sonar.host.url=http://192.168.0.20:9000
#----- 需要扫描的服务名称(相同key不会创建新项目)
sonar.projectKey=live-reward
sonar.projectName=live-reward
 
#----- sonar服务安全令牌口令
sonar.login=8113d659484bea6a600cc2d080e546f7df8a7b60
 
#----- GolangCI-Lint报告文件路径
sonar.go.golangci-lint.reportPaths=golangcilint.xml
 
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
 
sonar.sources=.
2.2.5 SonarQube查看扫描报告

报告总览:
在这里插入图片描述
报告详情:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/369106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

在WORD中设置公式居中编号右对齐设置方式

1 软件环境 Office Microsoft Office LTSC 专业增强版2021 2 最终效果 3 操作步骤 编辑公式;光标定位到公式的最后(不是行的最后);输入#编号光标定位在公式最后(不是行的最后),按Enter键回车…

【Linux系统 01】Vim工具

目录 一、Vim概述 1. 文件打开方式 2. 模式切换 二、命令模式 1. 移动与跳转 2. 复制与粘贴 3. 剪切与撤销 三、编辑模式 1. 插入 2. 替换 四、末行模式 1. 保存与退出 2. 查找与替换 3. 分屏显示 4. 命令执行 一、Vim概述 1. 文件打开方式 vim 文件路径&#…

【CSS】css获取子元素的父元素,即通过子元素选择父元素(使用CSS伪类 :has() :not() )

这里写目录标题 一、:has获取第一个div获取包含 a.active 的 li获取第二个div 二、:not除了类名为active 的 a,其他的a的字体都为18px <div><h1>标题</h1></div><div><ul><li><a href"#" class"active">测…

Filter与Listener(Java Web)

Filter与Listener(Java Web) 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、…

mysql按周统计数据简述

概述 业务中经常会遇到按年月日统计的场景&#xff1b; 但有时会有按周统计的情况&#xff1b; 我一般是用2中方法去解决&#xff1a; 利用mysql的weekday函数。计算出当前日期是一周中的第几天&#xff0c;然后当前日期 - 这个数值&#xff0c;就可以得到当前周的周一的日期…

Python—数据可视化Seaborn大全:参数详解与实战案例全解析【第52篇—python:Seaborn大全】

文章目录 Seaborn库常用绘图详解与实战引言安装与导入一、散点图参数说明实战案例 二、直方图参数说明实战案例 三、线性关系图参数说明实战案例 四、热力图参数说明实战案例 五、分布图参数说明实战案例 六、箱线图参数说明实战案例 七、联合分布图参数说明实战案例 八、小提琴…

钓鱼攻击:深度解析与防范策略

一、引言 在当今的网络世界中&#xff0c;钓鱼攻击已经成为一种日益猖獗的威胁。这种攻击方式利用电子邮件、社交媒体或其他在线平台&#xff0c;伪装成可信赖的来源&#xff0c;诱导受害者点击恶意链接或下载恶意附件&#xff0c;进而窃取个人信息或实施其他恶意行为。本文将…

[SWPUCTF 2021 新生赛]easyupload2.0

一开始我通过cobaltstrike写一个文件上传的木马它不允许上传php文件 我这边写了一句话木马通过burp拦截修改后缀为phtml然后通过蚁剑找flag

centos7安装oracle

1 安装虚拟机 设置4G内存&#xff0c;硬盘40G 2 配置网络环境 2.1配置主机名 # vi /etc/hostname 修改为 oracle2.2 配置IP地址 # vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改 BOOTPROTO"static" ONBOOT"yes" IPADDR192.168.109.110 NETMAS…

政安晨:示例演绎Python的函数与获取帮助的方法

调用函数和定义我们自己的函数&#xff0c;并使用Python内置的文档&#xff0c;是成为一位Pythoner的开始。 通过我的上篇文章&#xff0c;相信您已经看过并使用了print和abs等函数。但是Python还有许多其他函数&#xff0c;并且定义自己的函数是Python编程的重要部分。 在本…

027 方法的定义及调用

方法的定义 方法调用 设计方法的原则 使用场景 想象一下有个场景需要我们不断频繁地去使用某部分特定的代码&#xff0c;我们自然可以通过复制粘贴去完成&#xff0c;但是这样会导致代码又臭又长&#xff0c;大部分是重复的代码&#xff0c;这不利于我们后续的维护&#xff0c;…

一键转换MOV至MP3:轻松删除原视频,释放存储空间!

你是否曾经有一个MOV格式的视频文件&#xff0c;想要提取其中的音频却苦于没有合适的工具&#xff1f;现在&#xff0c;有了我们的全新视频剪辑工具&#xff0c;这个烦恼全部消失&#xff01;我们为你提供一键式解决方案&#xff0c;将MOV视频文件快速转换为MP3音频格式。 首先…

tidb节点重启后,服务无法重连

大家好&#xff0c;我是烤鸭&#xff1a; 前几天遇到tidb节点重启后服务无法重连&#xff0c;确切地说是两个服务&#xff0c;一个可以正常重连&#xff0c;一个不行。 问题复现 由于线上执行慢SQL&#xff0c;导致TiDB 单个节点宕机重启。 其中A服务的3个节点和B服务的1个节…

电商实战练习部署

基于阿里云ECS服务器实战部署 1 单架构部署方案 1.1 部署流程 传统方案 基于docker 2 持续集成&持续部署方案 随着软件开发复杂度的不断提高&#xff0c;团队开发成员间如何更好地协同工作以确保软件 开发的质量已经慢慢成为开发过程中不可回避的问题。互联网软件的开发…

153基于matlab的滚动轴承故障诊断

基于matlab的滚动轴承故障诊断&#xff0c;基于小波包分解&#xff0c;得到数据峭度值&#xff0c;以正常与故障数据峭度差值进行最大尺度重构&#xff0c;对重构信号进行包络谱分析。程序已调通&#xff0c;可直接运行。 153matlab 信号重构 包络谱分析 故障诊断 (xiaohongshu…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

gorm day1

gorm day1 gorm简介gorm声明模型 代码样例基本来自官方文档 Gorm简介 什么是ORM&#xff1f; 对象关系映射(Objection Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库(如mysql数据库&#xff09;存在的互不匹配现象的计数。简单来说&#xff0c;ORM是通…

西瓜书学习笔记——主成分分析(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种常用的降维技术&#xff0c;用于在高维数据中发现最重要的特征或主成分。PCA的目标是通过线性变换将原始数据转换成一组新的特征&#xff0c;这些新…