别再乱提交代码了,看下大厂 Git 提交规范是怎么做的!

来自丨掘金,
作者丨人人贷大前端技术中心
链接:
https://juejin.im/post/5d0b3f8c6fb9a07ec07fc5d0

 

Git commit message 规范

 

 

 

git是现在市面上最流行的版本控制工具,书写良好的commit message能大大提高代码维护的效率。但是在日常开发中由于缺少对于commit message的约束,导致填写内容随意、质量参差不齐,可读性低亦难以维护。在项目中引入commit message规范已是迫在眉睫。

用什么规范?

现在市面上比较流行的方案是约定式提交规范Conventional Commits),它受到了Angular提交准则的启发,并在很大程度上以其为依据。约定式提交规范是一种基于提交消息的轻量级约定。 它提供了一组用于创建清晰的提交历史的简单规则;这使得编写基于规范的自动化工具变得更容易。这个约定与SemVer相吻合,在提交信息中描述新特性、bug 修复和破坏性变更。它的 message 格式如下:

<类型>[可选的作用域]: <描述>

[可选的正文]

[可选的脚注]
复制代码

Quick Start

1. 全局安装commitizen & cz-conventional-changelog

commitizen是一个撰写合格commit message的工具,用于代替git commit 指令,而cz-conventional-changelog适配器提供conventional-changelog标准(约定式提交标准)。基于不同需求,也可以使用不同适配器。

npm install -g commitizen cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
复制代码

安装完毕后,可直接使用git cz来取代git commit

全局模式下,需要 ~/.czrc 配置文件, 为commitizen指定Adapter

2. 项目内安装commitlint & husky

commitlint负责用于对commit message进行格式校验,husky负责提供更易用的git hook

Use npm

npm i -D husky @commitlint/config-conventional @commitlint/cli
复制代码

Use yarn

yarn add husky @commitlint/config-conventional @commitlint/cli -D
复制代码

commitlint只能做格式规范,无法触及内容。对于内容质量的把控只能靠我们自己。

3. 添加相应配置

创建commitlint.config.js

# In the same path as package.json

echo 'module.exports = {extends: ["@commitlint/config-conventional"]};' > ./commitlint.config.js
复制代码

引入husky

# package.json

...,
"husky": {
    "hooks": {
      "commit-msg": "commitlint -e $GIT_PARAMS"
    }
}
复制代码

4. 使用

执行git cz进入interactive模式,根据提示依次填写

1.Select the type of change that you're committing 选择改动类型 (<type>)

2.What is the scope of this change (e.g. component or file name)? 填写改动范围 (<scope>)

3.Write a short, imperative tense description of the change: 写一个精简的描述 (<subject>)

4.Provide a longer description of the change: (press enter to skip) 对于改动写一段长描述 (<body>)

5.Are there any breaking changes? (y/n) 是破坏性修改吗?默认n (<footer>)

6.Does this change affect any openreve issues? (y/n) 改动修复了哪个问题?默认n (<footer>)
复制代码

生成的commit message格式如下:

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
复制代码

填写完毕后,husky会调用commitlint对message进行格式校验,默认规定typesubject为必填项。

任何git commit指令的option都能用在 git cz指令上, 例如git cz -a

Commit message规范在rrd-fe落地使用情况

针对团队目前使用的情况,我们讨论后拟定了commit message每一部分的填写规则。

1. type

type为必填项,用于指定commit的类型,约定了featfix两个主要type,以及docs、style、build、refactor、revert五个特殊type其余type暂不使用。

# 主要type
feat:     增加新功能
fix:      修复bug

# 特殊type
docs:     只改动了文档相关的内容
style:    不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
build:    构造工具的或者外部依赖的改动,例如webpack,npm
refactor: 代码重构时使用
revert:   执行git revert打印的message

# 暂不使用type
test:     添加测试或者修改现有测试
perf:     提高性能的改动
ci:       与CI(持续集成服务)有关的改动
chore:    不修改src或者test的其余修改,例如构建过程或辅助工具的变动
复制代码

当一次改动包括主要type特殊type时,统一采用主要type

2. scope

scope也为必填项,用于描述改动的范围,格式为项目名/模块名,例如: node-pc/common rrd-h5/activity,而we-sdk不需指定模块名。如果一次commit修改多个模块,建议拆分成多次commit,以便更好追踪和维护。

3. body

body填写详细描述,主要描述改动之前的情况修改动机,对于小的修改不作要求,但是重大需求、更新等必须添加body来作说明。

4. break changes

break changes指明是否产生了破坏性修改,涉及break changes的改动必须指明该项,类似版本升级、接口参数减少、接口删除、迁移等。

5. affect issues

affect issues指明是否影响了某个问题。例如我们使用jira时,我们在commit message中可以填写其影响的JIRA_ID,若要开启该功能需要先打通jiragitlab。参考文档:docs.gitlab.com/ee/user/pro…

填写方式例如:

re #JIRA_ID
fix #JIRA_ID
复制代码

示例

  • 完整的commit message示例
  • 相应的git log

 

<think>嗯,用户之前已经询问过关于全栈Java开发工程师的自测流程,现在他们又进一步问“具体每一项应该怎么做呢”。看起来用户对之前提供的流程框架有了兴趣,现在需要更详细的步骤指导。我需要确保我的回答能够覆盖每一个阶段的每一个检测项,并且给出具体的操作方法。 首先,我需要回顾之前的回复,确认每个大项下的子项。原来的回复分为代码质量检查、单元测试、接口测试、UI自动化测试、性能压测、安全测试、兼容性测试、上线前Checklist、监控与复盘,以及CI/CD。用户现在需要的是每个检测项的具体实施步骤。 接下来,我需要考虑用户的身份。他们是一名全栈工程师,同时使用Vue和UniApp,可能对前后端以及小程序的测试流程都有所了解,但需要更详细的操作指南。用户可能希望将这些步骤整合到他们的日常开发流程中,符合大公司的标准,因此详细和规范是关键。 我需要确保每个检测项都分解为具体的步骤,可能包括工具的使用方法、代码示例、命令行的操作、配置文件的设置等。例如,在静态代码分析部分,对于Java的SonarQube扫描,用户可能需要知道如何配置Maven插件,运行命令,以及如何解读报告。对于Vue的ESLint,需要说明如何设置规则,运行lint命令,以及如何处理错误。 另外,用户可能会关心如何集成这些测试到CI/CD流程中,所以可能需要提到如何在GitLab CI或Jenkins中配置这些步骤。此外,安全测试部分需要具体的工具使用方法和防护措施,比如使用OWASP ZAP进行扫描,以及后端如何防止SQL注入。 需要注意避免过于技术性的术语,但又要足够具体,让用户能够按照步骤操作。例如,在单元测试阶段,给出JUnit和Jest的具体测试示例,说明如何测量覆盖率,以及如何生成报告。 可能还需要提醒用户一些常见问题,比如在真机测试时如何解决不同平台的问题,或者在性能测试中如何分析结果。此外,上线前的Checklist需要具体列出需要检查的配置项和文档要求,确保符合各平台的规定。 最后,要确保整个回答结构清晰,每个阶段和子项都有明确的步骤说明,可能使用编号列表和代码块来增强可读性。同时,总结部分可以强调流程的重要性和持续改进的必要性,帮助用户理解每个步骤的意义。</think>以下是针对每个测试阶段的具体操作步骤说明,涵盖技术细节与执行规范,基于大厂最佳实践整理: --- ### **一、代码质量检查阶段** #### 1. 静态代码分析 **Java后端** 1. **SonarQube配置** - 在`pom.xml`中添加插件: ```xml <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.9.1.2184</version> </plugin> ``` - 执行扫描:`mvn clean verify sonar:sonar -Dsonar.login=your_token` - **关键修复项**: - 循环嵌套超过3层 → 改用Stream API或策略模式重构 - 空指针风险 → 使用Optional类包装返回值 **Vue前端** 1. **ESLint规范实施** - 安装基础包:`npm install eslint eslint-config-airbnb-base --save-dev` - 配置文件`.eslintrc.js`: ```javascript module.exports = { extends: ['airbnb-base'], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off' } }; ``` - 自动修复:`npm run lint -- --fix` - **典型问题处理**: - 组件props未定义类型 → 添加`props: { title: { type: String, required: true } }` - v-for缺少key → 添加`:key="item.id"` #### 2. Git规范落地 1. **Commitizen配置** - 安装:`npm install -g commitizen cz-conventional-changelog` - 项目根目录创建`.czrc`: ```json { "path": "cz-conventional-changelog" } ``` - 提交时使用`git cz`代替`git commit`,按提示选择类型(feat/fix等) --- ### **二、单元测试阶段** #### 1. Java单元测试实操 **场景:用户服务层测试** ```java @ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepo; @InjectMocks private UserService userService; @Test void testGetUserById_WhenNotExist_ThrowException() { when(userRepo.findById(anyLong())).thenReturn(Optional.empty()); assertThrows(UserNotFoundException.class, () -> userService.getUserById(1L)); } @Test void testCreateUser_WithDuplicateEmail_ReturnError() { UserRequest request = new UserRequest("test@demo.com"); when(userRepo.existsByEmail(request.getEmail())).thenReturn(true); ApiResponse response = userService.createUser(request); assertEquals(400, response.getCode()); } } ``` **覆盖率提升技巧**: - 使用`@ParameterizedTest`进行多入参测试 - 通过Jacoco排除DTO类:`<exclude>**/model/*.class</exclude>` #### 2. Vue组件测试详解 **测试场景:带API调用的搜索组件** ```javascript import { mount } from '@vue/test-utils'; import SearchBox from '@/components/SearchBox.vue'; import axios from 'axios'; jest.mock('axios'); describe('SearchBox', () => { it('搜索时显示加载状态', async () => { axios.get.mockResolvedValue({ data: [] }); const wrapper = mount(SearchBox); await wrapper.find('input').setValue('keyword'); await wrapper.find('button').trigger('click'); expect(wrapper.find('.loading').exists()).toBe(true); }); }); ``` **覆盖率检查**:执行`npm run test:unit -- --coverage`查看`/coverage`目录报告 --- ### **三、接口测试阶段** #### 1. Postman自动化进阶 **步骤**: 1. 创建集合`User API Tests`,添加以下请求: - `POST /api/users` 创建用户 - `GET /api/users/{id}` 查询用户 2. 在Tests标签页添加断言: ```javascript pm.test("响应时间小于500ms", () => pm.expect(pm.response.responseTime).to.be.below(500)); pm.test("返回JSON结构", () => { const schema = { type: "object", properties: { id: { type: "number" }, name: { type: "string" } }, required: ["id"] }; pm.expect(tv4.validate(pm.response.json(), schema)).to.be.true; }); ``` 3. 配置环境变量(开发/测试环境地址) 4. 命令行执行:`newman run collection.json -e env.json --reporters cli,html` #### 2. 小程序Mock技巧 **Apifox高级Mock配置**: 1. 创建`/login`接口,进入「高级Mock」→「自定义脚本」: ```javascript // 模拟网络延迟 delay(2000); // 模拟5%概率的500错误 if(Math.random() < 0.05) { status(500); json({ code: 500, message: "服务不可用" }); } else { json({ code:200, token: "mock_token" }); } ``` 2. 在UniApp中配置baseURL为Apifox生成的代理地址 --- ### **四、UI自动化测试落地** #### 1. Cypress实战案例 **测试文件:e2e/login.cy.js** ```javascript describe('登录异常场景', () => { it('空密码提交应显示错误提示', () => { cy.visit('/login'); cy.get('#username').type('testuser'); cy.get('form').submit(); cy.contains('.error-msg', '密码不能为空').should('be.visible'); }); it('错误凭证登录显示告警', () => { cy.intercept('POST', '/api/login', { statusCode: 401 }); cy.get('#password').type('wrongpass'); cy.get('form').submit(); cy.get('.ant-alert-error').should('exist'); }); }); ``` **执行策略**: - 关键路径每日定时执行(通过GitLab CI调度) - 失败时自动截图保存到`cypress/screenshots` --- ### **五、性能压测深度实施** #### 1. JMeter压力测试配置 **线程组设置**: - 线程数:500 - 启动时间:120秒 - 循环次数:永远 **HTTP请求采样器**: - 路径:`/api/products` - 参数化:CSV文件加载不同用户ID **监听器配置**: - 聚合报告:关注90% Line响应时间 - 后端监听器:对接InfluxDB + Grafana实时监控 **结果分析要点**: - 若TPS曲线先升后降 → 检查数据库连接池配置 - 内存持续增长 → 使用`jmap -dump`生成堆转储分析 --- ### **六、安全测试实施细节** #### 1. OWASP ZAP扫描步骤 1. 启动ZAP,设置浏览器代理为ZAP的监听端口(默认8080) 2. 手动遍历所有功能页面,ZAP会自动记录请求 3. 右键点击站点 → Attack → Active Scan 4. **重点修复项**: - 缺失CSP头 → 添加`Content-Security-Policy: default-src 'self'` - JWT令牌未设置过期时间 → 修改为`Jwts.builder().setExpiration(new Date(System.currentTimeMillis() + 3600000))` --- ### **七、兼容性测试执行指南** #### 1. 小程序多端适配 **平台差异处理代码示例**: ```javascript // 处理微信与支付宝授权差异 function getUserProfile() { #ifdef MP-WEIXIN wx.getUserProfile({ desc: '用于完善会员资料' }); #endif #ifdef MP-ALIPAY my.getAuthCode({ scopes: 'auth_user' }); #endif } ``` **真机测试要点**: - iOS重点测试Webview内核渲染差异 - 安卓低端机测试内存溢出问题(通过开发者模式的内存监控) --- ### **持续改进建议** 1. **建立质量看板**:聚合Sonar/Test/Jacoco等数据到DataEase看板 2. **自动化优先级**: - P0:核心支付流程的API测试 - P1:用户注册登录的前端E2E测试 3. **缺陷预防**:在IDE安装SpotBugs插件实时检测代码坏味道 通过以上步骤的系统化实施,可使代码质量达到互联网大厂L3级工程师要求(参考阿里云效质量标准)。建议每周进行质量复盘,使用TAPD管理技术债务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值