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

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

一、静态分析

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.0golangci-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-8sonar.sources=.
2.2.5 SonarQube查看扫描报告

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寒假 day2

1、请编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> enum{FALSE-1,SUCCESS}; typedef int datatype; //定义节点结构体 //节点&#xff1a;数据域、指针域 typedef struct Node {//数…

美国纳斯达克大屏怎么投放:投放完成需要多长时间-大舍传媒Dashe Media

陕西大舍广告传媒有限公司&#xff08;Shaanxi Dashe Advertising Media Co., Ltd&#xff09;&#xff0c;简称大舍传媒&#xff08;Dashe Media&#xff09;&#xff0c;是纳斯达克在中国区的总代理&#xff08;China General Agent&#xff09;。与纳斯达克合作已经有八年的…

Visual Studio 最新版安装教程

Visual Studio简介 Visual Studio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于.NET和C工作负载以及许多其他语言和框架的开发。它提供了一套完整的工具集&#xff0c;包括UML工具、代码管控工具、集成开发环境&#xff08;IDE&#xff09;等&#xff…

css1引入方式

一.行内样式表(行内式&#xff09;&#xff08;用在标签内部&#xff09;&#xff08;用于修改一些简单的&#xff09; 二.内部样式表&#xff08;嵌入式&#xff09;&#xff08;平常练习的呢种&#xff09; 三 .外部样式表&#xff08;链接式&#xff09; 写在一个单独的文件…

Hadoop3.x基础(3)- Yarn

来源&#xff1a;B站尚硅谷 目录 Yarn资源调度器Yarn基础架构Yarn工作机制作业提交全过程Yarn调度器和调度算法先进先出调度器&#xff08;FIFO&#xff09;容量调度器&#xff08;Capacity Scheduler&#xff09;公平调度器&#xff08;Fair Scheduler&#xff09; Yarn常用命…

ele-h5项目使用vue3+vite开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…

苹果CMS挖片网升级版视频主题模版源码

自适应视频站正版高级挖片网收录模板&#xff0c;模板不错&#xff0c;是挖片网的升级版。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88799583 更多资源下载&#xff1a;关注我。

第十二篇【传奇开心果系列】Python的OpenCV技术点案例示例:视频流处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例短博文系列短博文目录一、前言二、视频流处理介绍三、实时视频流处理示例代码四、视频流分析示例代码五、归纳总结系列短博文目录 Python的OpenCV技术点案例示例短博文系列 短博文目录 一、前言 OpenCV视频…

UnityShader(十四)纹理

目录 前言&#xff1a; 单张纹理实现效果&#xff1a; 效果&#xff1a; 前言&#xff1a; 纹理最初的目的是用一张图片来控制模型的外观。使用纹理映射技术我们可以把一张图“贴”在模型表面&#xff0c;逐纹素&#xff08;文素的名字是为了和像素进行区分&#xff09;控制…

js数组和字符串之间的转换方式以及数组的一些方法

一、数组和字符串之间的转换方式 1&#xff09;将字符串切割成字符串数组—stringObject.split(separator, howmany) seperator-----字符串、正则表达式&#xff0c;必需 howmany------指定返回的数组的最大长度&#xff0c;可省略&#xff0c;省略后全量返回 源代码 var str&q…

VBA技术资料MF114:批量给Word文档添加页眉

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是&#xff0c;紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中&#xff0c;很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心&#xff0c;每个簇一个&#xff0c;并将…