作者|灰狐
来源|灰狐
最近的工作需要整理代码质量、代码安全性和软件测试,并考虑将它们集成到日常的R&D和DevOps装配线上。
今天,我将和大家简单谈谈代码质量、代码安全和软件测试的话题。
关于代码质量,我会用Sonar之类的工具,把它纳入代码质量和代码规范管理,这对控制自研产品和外包项目的质量非常重要。
快速体验声纳,可以克隆Open Testng套件,然后运行mvn命令
这是官方的Sonar项目,让我们一起了解和感受一下。
除了代码质量,代码安全也越来越受到重视。你可以想,如果代码不安全,软件系统怎么可能安全?
现在,开源项目越来越多。如何确保使用和集成的开源软件是安全的,没有后门,没有植入恶意软件?
静态分析和软件安全测试可以作为突破口,因为有大量的开源软件进行分析和评估。并能参与开源项目进行静态分析和软件测试,贡献力量,提升影响力。
代码规范、安全编程、如何编写安全更健壮的代码都值得我们去了解。
静态代码分析,机器学习,未来的程序员一写代码就能立即感知错误和安全问题。将来,开发好代码应该比开发坏代码更容易。
而且,技术人员可以从测试人员进入这个行业。看了更多又丑又美的代码后,你的审美会逐渐形成和提高,这可能有助于你将来成为一名优秀的程序员。
这里有很多代码安全工作要做,一些关键检查包括:
*错误使用原料药
*安全编码最佳实践
*常见的编码错误
*缓冲区溢出
*建筑系统安全问题(Maven、Gradle、Bazel)
*类型、级别不匹配
*代码可维护性问题(没有单元测试很难重构)
*并发数据访问冲突
*控制流问题
*伪造跨站点请求(CSRF)
*跨站点脚本(XSS)
*
"4985393" qid="6579708514329974019" mention-index="0">死锁* 异常和错误处理问题
* 不安全的数据处理
* 边界问题,溢出
* 内存问题:脏内存、内存损坏、内存非法访问、指针、空指针引用等
* 路径操作
* 系统性能低效,如何改进和提升
* 系统各种莫名出错和挂起 ,考虑引入分布式调用链
* 错误的配置设置(尤其 Spring 和 Java 应用有大量配置信息需要维护)
* SQL注入
还有很多可做的事情 ...
接下来,大家应该把静态分析好好弄弄,因为它异常重要。
静态程序分析就是在程序没有执行的情况下进行的分析。通过在编写代码时就快速查找并修复安全性和质量问题。也是静态分析、静态应用安全测试 (SAST) 等相关内容。
想想看,若能随代码的编写及时识别出代码中严重的软件质量缺陷和安全漏洞。将自动安全测试无缝集成到CI/CD Pipeline中,并支持现有开发工具和工作流,那将是一件非常重要和酷酷的工作。并且管理安全政策合规性问题(如:OWASP Top 10、CWE/SANS Top 25和PCI DSS),支持多语言、多框架、模板、多平台、各种编译器和各种主流IDE。
代码安全测试后,常常以安全审计报告的形式呈现。
这里有一个安全审计报告,供大家学习参考。
这是分布式应用运行时 Dapr 接受了 CNCF 核定的网络安全公司 Cure53 的安全审计。测试的重点是:
* Dapr 运行时代码库评估
* Dapr 组件代码基础评估
* Dapr CLI 代码基础评估
* 权限升级
* 流量欺骗
* 密钥管理
* RBAC
* 验证基本假设:mTLS、作用域、API 身份验证
* 编排强化 ( Kubernetes)
* DoS 攻击
* 渗透测试
这份报告也可指导我们日常安全审计工作的一些思路、流程和关注点。
一些静态分析资源,大家可关注。
Awesome Static Analysis
另外,跟进领导厂商,持续更新知识结构和实践技能。

聊了代码质量和代码安全后,我们再说说软件测试。
传统测试一定要增加这样的代码质量管理,而不是仅仅只有功能上的黑盒测试,还应有进入程序内部和逻辑的白盒测试,这也能带来团队代码规范制度的逐步形成和长期执行。
黑盒测试(功能测试):黑盒测试者不了解程序的内部情况,不需具备应用程序的代码、内部结构和编程语言的专门知识,所以不硬性要求具有编程知识和编程能力。
白盒测试(逻辑测试):白盒测试者需了解待测试程序的内部结构、算法等信息,这是从程序设计者的角度对程序进行的测试。根据测试层面的复杂性,白盒测试需要知识和能力水平更高的程序员。

(图片来自网络)
说到测试,聊到 Java 测试,绕不开 JUnit, TDD, BDD, Refactoring,有关它们的内容就不详细展开,就说说自己感受。
JUnit 在 Java 世界是单元测试的事实标准,必须掌握。

(图为JUnit5架构,JUnit 5 = Platform + Jupiter + Vintage)
有关 TDD 和 BDD,尤其这两句,意义非凡,大家细细品。
Build the thing right, Build the right thing.

(图片来自网络)
关于重构:任何一个傻瓜都能写出计算机可以理解的代码。惟有写出人类容易理解的代码,才是优秀的程序员。

(图片来自网络)
我们有无数的开源软件可以阅读,有无数的系统等待测试,有无数的代码需要重构。
所以,代码质量、代码安全、代码搜索、代码测试、代码重构是门生意,也是一个商业模式。
有关软件测试工程师职业发展计划可简单参考下,书是2003年出版的,依然很有用。


个人 Development, Testing, DevOps 三位一体,学习体系,供参考:
1、Spring(Spring Boot, Spring Cloud), MicroProfile + JHipster
2、JUnit, TDD & BDD, Refactoring + Open Testing Suite(OTS)
3、Sonar, Elasticsearch, Jenkins + Open DevOps Dashboard(ODD)
此外,一套主要软件测试栈应包含:
* 使用 JUnit 5 进行单元测试;
* 使用 Spring Test Context 框架进行集成测试;
* 用 Jest 进行 UI 测试;
* 使用 ArchUnit 进行架构测试;
* 用 Gatling 进行性能测试;
* 行为驱动(BDD)的 Cucumber 测试;
* Karate 的全面自动化测试
* 用 Cypress 或者 Protractor 进行 Angular/React/Vue 集成测试

(Karate: Test Automation Made Simple.)
参考书籍:
《Google 软件测试之道》Google Testing Blog (行业标杆,有空就去刷)
《重构-改善即有代码的设计》
《测试驱动开发》
《软件自动化测试》
...
