一、当前软件开发的趋势
开篇我们先简要介绍一些近几年在企业开发中出现的重要概念,以便引入持续测试的主旨。这些概念中最重要的两个便是DevOps和微服务。两者都是目前软件开发中的最佳实践和方法论,旨在为企业提供更高的灵活性,提升运营效率。
1.1 DevOpsDevOps是一套实践方法论和文化,提倡打破原有组织和限制,职能团队开始拥抱和接受DevOps所倡导的高度协同,研发、测试、运维及交付一体化的思维。随着DevOps和敏捷热度的不断提升,无论是互联网企业还是传统软件企业都开始拥抱敏捷,实践DevOps。持续集成CI(Continuous integration)、持续交付CD(Continuous delivery )作为DevOps的最佳实践,越来越受到重视。
1.2 微服务架构 Microservice Architecture微服务架构源起于DevOps意识形态和实践中,是一种软件架构风格。微服务架构带来了一系列好处,例如可部署性、可靠性、可用性等等。虽然原则上可以使用任何架构来实践DevOps,但微服务架构正在成为构建持续部署 (CD)系统的标准架构风格。由于每项服务的规模都很小,它允许通过连续重构来实现单个服务的体系结构,因此减少了对大型项目前期设计的需求,允许尽早发布软件并且持续交付。微服务和DevOps是天然的共同体,结合起来共同实现软件开发行业的变革。
二、自动化测试 Test Automation随着敏捷和微服务架构的引入,CI/CD成为构建和部署的标准,即使在没有采用微服务架构的项目中也是如此。为了保证已定义的流程和事务按照预期运行,测试必不可少。而在应对现代软件产品频繁的变化和发布上,传统的手工测试方式在人员和效率上都存在严重不足,因此自动化测试已经成为现代软件研发过程中一个关键组成部分。自动化测试是打通持续集成和持续交付的核心,没有有效的自动化测试保证,持续集成和持续交付就仅仅是一个没有灵魂的躯壳。
2.1 测试分类测试按照不同的维度可以进行多种分类。
按测试手段是否手工,可划分为自动化测试和人工测试;
按照测试目的划分,可分为功能测试、性能测试、负载测试等。
本文采用Martin Fowler按照层级分类的方式对测试进行分类。
Martin Fowler描述测试金字塔分为单元、服务和UI三个层级。尽管大家对此的具体描述各不相同(有人将三层分别定义为单元、接口、集成测试;也有人将整个金字塔划分为4-5个层级),但金字塔自底向上的结构是大家公认和遵循的。
1)单元测试
单元测试是针对代码单元(通常是类/方法)的测试,单元测试的价值在于能提供最快的反馈,在开发过程中就可以对逻辑单元进行验证。好的单元测试可以帮助改善既有设计,在团队掌握 TDD的前提下,单元测试能辅助重构,帮助提升代码整洁度。
2)接口(服务/API)测试
接口测试是针对业务接口进行的测试,主要测试内部接口功能实现是否完整。比如内部逻辑是否正常、异常处理是否正确。接口测试的主要价值在于接口定义相对稳定,不像界面或底层代码会经常发生变化,所以接口测试比较容易编写,用例的维护成本也相对较低。在接口层面准备测试的性价比相对较高。
3)集成(UI)测试
集成测试从用户的角度验证产品功能的正确性,测的是端到端的流程,并且加入用户场景和数据,验证整个过程是否健康流畅。集成测试的业务价值最高,它验证的是一个完整的流程,但因为需要验证完整流程,在环境部署、准备用例及实施等方面成本较高,实施起来并不容易。
2.2 微服务架构为测试带来的挑战微服务架构在解决了应用大小、应用开发规模等问题之后也带来了一些新的问题,比较突出的有微服务数量增多、服务间调用关系复杂等等。复杂的依赖导致即使项目资深开发人员也不能一下子梳理出所有关系。
微服务和传统的单体应用相比,在测试策略上会有一些不太一样的地方。简单来说,在微服务架构中,测试的层次变得更多,需要测试的服务和应用也会变得更多。手动执行所有的测试是低效的,无法跟上互联网快速迭代的要求。这时有必要引入自动化测试来减轻测试团队的压力,提高测试效率和测试质量。
2.3 自动化测试说起自动化测试,功能测试人员可能会将其想得很高端复杂。