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

news2024/9/23 19:24:34

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

一、静态分析

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.coloradmin.cn/o/1430721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quppy wise 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号

Quppy 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号 官网下载APP或者去香港区下载APP使用, 按照官方APP里的邮箱注册就行,成功后添加电话和个人信息;需要说明的是:网站所填内容请全部用真实身份填写;名在前,姓…

华为机考入门python3--(7)牛客7-取近似值

分类:数字 知识点: str转float float(str) 向上取整 math.ceil(float_num) 向下取整 math.floor(float_num) 题目来自【牛客】 import math def round_to_int(float_num): # 如果小数点后的数值大于等于0.5,则向上取整&#xf…

计算机视觉中的目标跟踪

从保护我们城市的监控系统到自动驾驶车辆在道路上行驶,目标跟踪已经成为计算机视觉中的一项基础技术。本文深入探讨了目标跟踪,探索了其基本原理、多样化的方法以及在现实世界中的应用。 什么是目标跟踪? 目标跟踪是深度学习在计算机视觉中广…

分布式任务调度框架XXL-JOB详解

分布式任务调度 概述 场景: 如12306网站根据不同车次设置放票时间点,商品成功发货后向客户发送短信提醒等任务,某财务系统需要在每天上午10天前统计前一天的账单数据 任务的调度是指系统为了完成特定业务,基于给定的时间点,时间间隔&#…

axios二次封装用法

axios二次封装 一、request.js import axios from axios import router from "/router";const request axios.create({baseURL: http://localhost:9090,timeout: 5000 })// request 拦截器 // 可以自请求发送前对请求做一些处理 // 比如统一加token,对…

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking(三)过滤baking的输出 默认情况下,在conversation world(baker和baking system运行的环境)下产生的所有entities和components,都会作为baking环节的输出。在baking结束时,U…

[SWPUCTF 2021 新生赛]include

他让我们传入一个flag值 我们传入即可看到代码部分 传入一个php的伪类即可 得到经过Base64加密的flag,解密即可

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件,用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址: https://www.xshell.com/zh/free-for-home-…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究,镜头的模糊场也就是镜头的 PSF 分布,镜头的 PSF 与物距,焦距,光学系统本身的像差都有关系,实际的 PSF 分布是非常复杂而且数量也很多,这篇文章提出用一个神经网络…

Vulnhub靶机:hacksudo3

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo3(10.0.2.45) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entry/hac…

Power BI案例-链接Mysql方法

Power BI案例-连锁Mysql 方法1-通过组件mysql-connector-net-8.3.0: 选择文件–获取数据–选择MySQL数据库–选择链接 提示无组件,选择了解详细情况 弹出浏览器,选择下载 不用登陆,可以直接下载 下载的组件如下&#xff1a…

cesium-加载谷歌影像

cesium在开发的时候有可能会加载不同的影像&#xff0c;今天就先看一下加载谷歌的吧。 使用谷歌有个好处就是基本不会出现此区域无卫星图的情况 闲言话语不多说&#xff0c;看代码 <template><div id"cesiumContainer" style"height: 100vh;"&g…

uniapp开发一个交流社区小程序

uniapp开发一个交流社区小程序 假期的时候简单学了一下uniapp&#xff0c;想开发一款类似百度贴吧的交流社区来练练手。本篇文章主要记录开发过程&#xff0c;文末附上项目地址。 主要需要开发以下几个页面。 信息页面热榜页面用户主页用户信息页 信息页面 该页面的功能主要…

国标GB/T 28181详解:设备视音频文件检索消息流程

目 录 一、设备视音频文件检索 二、设备视音频文件检索的基本要求 三、命令流程 1、流程图 2、流程描述 四、协议接口 五、产品说明 六、设备视音频文件检索的作用 七、参考 在国标GBT28181中&#xff0c;定义了设备视音频文件检索消息的流程&#xff0c;主…

ubuntu 安装 kvmQemu no active connection to install on

更新 apt sudo apt update检查虚拟化是否开启 0 不开&#xff0c;其余数字表示开启&#xff0c;开不开都可以&#xff0c;不开性能弱&#xff0c;只能跑 x86 系统 egrep -c (vmx|svm) /proc/cpuinfo安装 sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virt…

Oracle 面试题 | 09.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【备战蓝桥杯】——循环结构终篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-yl4Tqejg4LkjZLAM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff0…

HP惠普暗影精灵8P笔记本OMEN Gaming Laptop 16-n0076AX原厂Win11系统镜像恢复出厂预装OEM系统

原装Windows11系统安装包&#xff0c;适用型号(HP暗影8plus笔记本电脑)&#xff1a; 16-n0000AX、16-n0001AX、16-n0002AX、16-n0003AX、16-n0004AX、16-n0005AX 16-n0016AX、16-n0058AX、16-n0059AX、16-n0076AX、16-n0078AX等 链接&#xff1a;https://pan.baidu.com/s/1G…

Matplotlib魅力揭秘:多彩直方图绘制技巧与实战【第56篇—python:Matplotlib多彩直方图绘制】

文章目录 Matplotlib魅力揭秘&#xff1a;多彩直方图绘制技巧与实战1. 普通直方图2. 多变量直方图3. 堆叠直方图4. 分组直方图5. 多个子图直方图6. 折线直方图7. 曲线直方图8. 绘制密度直方图9. 自定义直方图颜色和样式结语 Matplotlib魅力揭秘&#xff1a;多彩直方图绘制技巧与…