`
JerryWang_SAP
  • 浏览: 1042300 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考

阅读更多

今天的文章来自Jerry的同事,曾经的搭档郑晓霞(Zheng Kate)。郑晓霞是在Jerry心中是一位很有实力的程序媛,2011年从西安某软件公司跳槽到SAP成都研究院。当时,成都研究院的CRM团队刚刚成立,Jerry和郑晓霞都在一个大组。

2012年夏天,我们接到任务,要把SAP Customer Briefing这款已经发布的iOS应用移植到Android平台。因为只有1年的期限,老板组建了一只特殊的开发团队,由Jerry, 郑晓霞和另外两位男同事组成。是的,因为需求很清楚,就是把iOS版本上的功能移植到Android平台,所以这只团队没有产品经理,没有架构师,郑晓霞担任了开发人员和Scrum Master的双重身份, UX也是项目中后期从上海找了一位同事远程加入项目组。由于我们4位以前都没接触过Android开发,因此也是边学习边干活。这个微型团队的学习气氛非常好,一个人遇到困难,其他三位都会积极热心参与讨论和提供帮助。

 

Jerry印象最深的一件事是,当时我负责实现一个company profile的功能,即客户可以从一个下拉列表里选择一个企业,从而进入该企业明细页面,显示该企业的概述,包含文字简介,企业人数,财政收入等等。概述信息通过消费wikipedia提供的Restful API,传入企业名称,返回响应,其中需要显示在明细页面里的关键信息得通过编程人员自己写正则表达式提取出来。

Jerry当时的想法是,把iOS版本里解析正则表达式的Object C代码直接改成Java代码,因为不同编程语言里使用的正则表达式,其语法虽然稍有差异,但语意是相同的。但当我阅读了一段时间iOS代码那些操作正则表达式的Object C代码后,已经头昏脑胀了,我的Java代码写好后进行测试,发现并不能保证对所有测试输入的company, 都能够用正则表达式正确地解析出关键信息。

然后Jerry说,算了,我不参考iOS代码,我直接自己从头写吧。写完后测试,发现仍然不能保证对于所有的测试数据都能正常工作。

看到Jerry陷入进退两难的境地后,晓霞同学像女神一般出现在我面前,说:“我来试试”。一个下午过去,晓霞同学提交了一段代码到perforce上,那是一段结构清晰,并且能够完美使用正则表达式完成关键信息解析的Java代码。我使用了一百多个company进行测试,全部工作正常。实际上,直到最后发版,晓霞同学这段代码也没有发现任何bug。

当时晓霞同学在Jerry心中的形象和这位潇洒的警察一样:

 

这件事让Jerry从此对晓霞同学刮目相看,一直到现在。

下面是晓霞同学的正文。


大家好,我是郑晓霞,现在是SAP成都研究院Hybris Enterprise Commerce Platform开发团队的质量工程师(Quality Engineer, 下文简称QE)。今天我想和大家聊聊我在这个岗位上工作一段时间之后的一些心得和体会。

在敏捷开发模式下,团队需要有持续快速的交付能力。那么在持续交付过程中,如何保证产品质量呢?大家的答案可能是自动化测试。

但是自动化测试是否足够、有效,即使足够、有效,就能说明产品质量好吗?测试结果只是一个指标,这个指标代表的只是在当前的测试环境下,现有测试实例的运行结果,是我们保证质量的下限。

软件质量不是测试出来的,而是在开发过程中建立起来的。控制开发过程中的质量有助于提高产品的质量上限。

Shift Left Testing,通俗理解就是把位于传统软件开发流程中最后阶段的测试往前提。提到哪一步呢?开发?设计?需求?我个人的理解是越往前越好。这意味着在整个开发周期内需要持续测试,持续关注质量,这一切都是为了提高质量的上限。

 

这会带来什么好处呢?

 

1. 减少测试和开发的成本, 提高投入产出比ROI(Return On Investment)

在软件开发的整个过程中,越早发现问题,修复的成本越小。

 

试想在所谓的集成测试阶段发现一个bug,花时间部署测试环境,准备测试数据,执行测试,重现bug,跟开发人员沟通,将bug分配给开发人员后,他/她们可能需要重新部署开发环境,重新开发,重新做代码审查,最后再走一遍测试流程。如果能在代码审查或者单元测试阶段发现这个bug,得节省多少时间?

2. 提高测试效率

如果能在需求,设计阶段能发现并阻止bug,可以节约很多开发生命周期的反复,同时在理解需求、代码的基础上进行测试,可以更有重点和针对性地面向业务和风险测试,而不会陷入测试细节,有效提高测试效率。

3. 提高质量

在需求层面保证并优化需求以及需求传递的质量,在代码层面保证设计的灵活性,代码的整洁性, 在开发过程中控制质量,提高产品内部质量。

Shift Left Testing是需要整个敏捷开发团队作为一个整体去遵循的。那么在一个敏捷开发团队中,作为一位QE,在整个产品的开发生命周期中需要怎么和团队合作呢?

1. QE作为敏捷开发团队的一员,可以做任何能帮助团队提高质量的事情, 没有界限,目的是为了帮助团队发现问题,解决问题,提高产品交付质量。

QE要能做到没有界限地提供质量保证,需要自身做出两个重要的改变:

(1) 全方面地提高自己的技能

如果缺乏相关的技能,比如业务能力和一定的代码能力,很难想象QE能够高效地参与到各个开发环节的讨论中,更谈不上能给出建议和意见。当然这不意味着必须让QE成为一名全栈工程师。QE需要去找到学习的平衡点。有些技能可能不是必须的,但是如果具备这些技能,会让QE以更加高效的方式做事。

(2) 深入到软件开发生命周期的各个环节,紧跟团队的开发节奏

如果不深入到开发的各个环节,有些质量问题的根源没法找到,那么提前阻止bug也就无从谈起。只带着耳朵听,是没法深入的。需要思考,从质量的角度去思考,但是如果技能差距太大,能勉强跟上节奏也就不错了,谈不上思考。所以深入软件开发周期各个环节需要QE自身技能的支撑。

同时,QE在参与的过程中,需要把握好平衡,能发现问题,也需要让团队各个角色能够各司其责,维持健康的团队工作模式。

2. QE需要培训团队,让团队能够拥有测试技能和质量意识,并能够自己解决问题,同时不断提高质量。

产品质量由敏捷开发团队来保证,经常听到有同事说,”我们的QE还挺厉害的,测出了不少问题”。在一个敏捷开发团队中,只有一个QE,靠一个人的英雄主义,测这么多问题,如果QE休假了怎么办?能对团队的质量放心?

QE的成就感不在于“我有多么重要,测出了多少重要的bug”,而是“没有我,团队的产出仍然是高质量的”。要达到这个目标,QE的任务就是挖掘团队的质量需求,培训团队,让QE变得越来越“多余”,使团队成为一支“去QE化”的敏捷团队。

这两点看似矛盾,实则第一点(帮助团队发现问题)是为了有方向性地支持第二点(如何培训团队自己解决问题)。随着团队越来越成熟,这两点也就慢慢地越做越少。

那么质量是不是越高越好呢?质量是要付出代价的,需要控制成本和产出。举个温伯格提到的例子,MiniCozy公司的文字处理软件,在对一整本书进行排版时,会出现漏词的错误,而这个错误确实发生在一个作家的处女作上。但是MiniCozy公司的回应是,在数以十万计的用户中,或许都找不到十个人会把这样大规模的任务用单独的一个文件来组织,修正这个错误可能会花很多时间和成本,并且还有可能引发更大的错误,从而影响到几百甚至是几千位用户。MiniCozy认为他们的取舍是正确的。所以质量不是指毫无纰漏,而是有其相对性。

下面我列出了在软件开发生命周期的各个环节里,QE能够做的事情,但是QE不是一定需要参与,参与的目的是为了发现问题,最终是需要培训使得团队能够具备质量和测试相关的知识和思维,通过改进流程,行为让团队自己保证质量,并不断改进。

根据每个组不同的成熟度和QE技能的高低,事情可能会有所不同。

为了图表的简化,只列出了事情本身,下面会有简单说明做这些事情的目的。

 

Before coding - 开发开始前

1. Involve requirement discussion early

在做产品开发前,我们应该理解需求背后的原因,客户遇到什么问题,我们能够帮客户解决什么问题。我们测试的不仅仅是产品功能,更是业务价值。提前参与需求的讨论对决定测试的重心,优先级都有极大的帮助,避免陷入辛苦的测试细节中。这样我们就可以有效的利用Pareto的20/80原则,提高测试效率。

2. Ask negative questions

每个人都可能受惯性思维影响,我们可以通过问负向问题来优化功能性需求和非功能性需求的测试, 比如产品标准和GDPR(General Data Protection Regulation)等。

3. Collaborate with testable and executable acceptance criteria

Acceptance criteria主要关注的是业务价值,建立user story的功能范围,并能指导开发。通过各个角色合作讨论的方式列出acceptance criteria,能够避免对需求范围的误解,同时参与的每个人都能很清楚的知道要测什么,要怎么测。

4. Work out test plan in sprint

在敏捷开发的每一个sprint内,我们也需要基于sprint目标制定测试计划,包括哪些功能需要手动测试,哪些功能需要自动测试,哪些功能需要回归测试,是否需要做性能测试/安全测试等。同时还需要计划对之前的测试做维护。这个测试计划会影响到sprint planning meeting对任务的分解和时间估算。

5. Join estimation proactively

在sprint planning meeting中,基于制定的测试计划,积极参与对任务的分解和时间估算,包含相关测试的开发、维护和执行时间。

6. Design and prepare test points with good test data including automation test

这些实际是传统的瀑布开发模式需要的测试相关的专业知识,同样也适用于敏捷开发模式。通过各种方法论的使用,设计出测试点,来指导、优化测试执行,提高测试效率。在敏捷开发模式下,QE需要让所有成员都具备这种测试设计技能。

7. Define KPI/Dashboard

团队需要定义如何来度量质量,KPI(Key Performance Indicator, 关键绩效指标)的度量值能直接反馈出团队的外部质量,并可以通过根源分析帮助团队认识问题,解决问题。

During coding - 开发过程中

1. Join or familiar with design

虽然敏捷开发模式并不像瀑布开发模式那样具有专门的软件设计阶段,但是小的功能点设计在每个sprint确实存在。不同的设计有不同的测试考虑,比如通过事件来触发订单流程,或是通过后台作业来触发订单流程,测试要验证的点肯定是不一样的。如果采取后台作业方式,还需要验证作业信息和计划的执行时间是否正确等等。

同时我们需要在设计时考虑可测试性。软件的可测试性是指软件发现故障并隔离、定位其故障的能力特性,以及在一定的时间和成本前提下,进行测试设计、测试执行的能力。James Bach 这样描述可测试性:软件可测试性就是一个计算机程序能够被测试的容易程度。

比如,为了测试一个类的方法,首先我们需要创建这个类的实例,需要引用必须的内部依赖,同时还要隔离外部依赖。有的场景下做到这些并不是那么简单,由于开发人员容易局限于考虑自己负责的功能的具体技术实现而忽略了设计的可测试性,而QE参与功能设计则可以提高开发人员对确保其设计的可测试性的意识。

2. Guide/coach/pair to develop testable code and effective test code

可测试的代码是写测试代码的前提条件。测试代码的作用绝不仅仅是用来满足测试覆盖率的,测试代码需要基于测试设计和测试数据来测试软件的功能,所以需要QE能和开发人员一起保证测试代码的有效性。一旦发现bug,除了修复bug本身,还需要评估是否需要改进现有的测试代码来覆盖这个bug。

3. Go through code for both functional code and testing code

以QE的角度检查代码,比如需求是否匹配,是否考虑了SAP产品标准等等,从这个角度检查既有助于发现问题,同时可以提高测试效率。比如,代码添加了新方法来获取当前时间,时间和格式是否做了本地化处理?这个新方法是否被调用了?如果都没有符合,那还需要继续功能测试吗?在这些缺陷弥补之前,当然没有必要进行功能测试了。后面我们还会追溯为什么会有这种情况发生。

4. Safeguard DoD compliance

因为我们是做产品,只有满足了DoD(Definition of Done, 完成的定义,敏捷开发里的一个术语,表示工作是否完成),user story才能算完成。我们必须要严格遵循,这样才能持续交付,并且避免技术债务。

5. Utilize continuous integration environments

通过集成各种代码扫描工具,利用持续集成来发现问题,提供质量的快速反馈。

6. Test an uncompleted user story

通常一个user story不会太大也不会太小,在团队还不够成熟的时候,QE还是需要测试user story。为了不在sprint末期出现测试的“惊喜”和大量测试任务的涌现,我们可以和开发商量,讨论出哪部分功能可以先开发。等这部分功能开发结束后就可以开始测试,即使这个user story还没有完成。

7. Provide fast feedback

除了持续集成之外,QE需要对开发的bug提供及时快速的反馈,因为开发人员熟悉业务和代码,能够比较快速地解决问题。另一方面这也可以作为考虑如何提高质量的on-job培训的一部分。

After coding - 开发结束后

1. Test user story based on business value and risk

在团队还不够成熟的情况下,QE还需要基于业务价值和风险来测试user story,测试的粒度和范围可以根据团队的具体情况进行调整。

2. Hold another bug hunt or other manual exploratory testing session

基于user story的KPI,重要性和风险程度,我们需要决定是否再需要一轮测试。

3. As problem solver to analyze issue and find how to resolve issue

QE发现了bug,报告给开发后,QE的任务就完成了吗?QE可以通过现象,日志等分析问题,定位问题,提高问题的解决效率。

4. Reflect AC/DoD/Test plan/test case/test data

回顾之前做的一切和测试相关的活动,从中总结经验教训,做到持续改进。比如上个sprint的test plan实际执行情况如何?设计的test case覆盖到了所有场景吗?准备的测试数据质量如何?测试活动中有哪些方面下个sprint可以做得更好?

以上仅仅是个人观点,欢迎共同探讨学习。

下面是我在思考自己作为一个QE在团队中定位过程中参考的一些网站和博客。

相关阅读

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

 
0
0
分享到:
评论

相关推荐

    基于众包的聊天机器人的研究.pdf

    天机器人的研究主要集中在自然语言处理、机器学习和深度学习领域。自然语言处理是聊天机器人核心技术之一,它涉及语音识别、语义理解、对话管理等多个子领域,旨在使机器人能够理解人类的语言并作出恰当的回应。机器...

    基于单片机的LED流水灯控制与简述.pdf

    本设计中,开发者运用了Proteus软件进行电路仿真,参考了相关的技术文献,如乔建华等人关于Proteus在单片机教学中的应用分析,郑晓霞的基于AT89S51的实验开发系统设计等,以深入理解和掌握单片机控制LED流水灯的技术...

    人工智能生成作品的权属认定研究.pdf

    在这篇题为《人工智能生成作品的权属认定研究》的文章中,作者郑晓霞深入探讨了强人工智能创作的作品权属问题,特别是当这些作品在形式和内容上能够与自然人创作匹敌时,如何确定其权利归属。 首先,作者对人工智能...

    后勤智能管理系统-.. (2).pdf

    后勤智能管理系统-.. (2).pdf

    Markdown.Monster.v2.0.9.0-CRD.rar

    Markdown.Monster.v2.0.9.0-CRD

    毕业设计-主成分分析算法Python代码.rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    四川大学期末考试试题(开卷).docx

    四川大学期末考试试题(开卷).docx

    c#入门之实现计算器源码

    c#入门之实现计算器源码

    Python项目-游戏源码-10 植物大战僵尸.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    基于ssm的期末考试考务管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    主要需求:3个权限 该系统功能模块主要为三部分,即学生模块、教师模块、管理员模块。 学生模块包括:查看考试安排信息(随机安排就行)、学生 缓考在线申请(教师查看)、在线签订承诺书(学生签字); 教师模块包括:查询监考表、考试违纪学生信息录入; 管理员模块包括:考试时间地点管理、 调整排班信息、信息管理等(主要是增删改查) 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    springboot-基于SpringBoot的小型民营加油站管理系统.zip

    springboot-基于SpringBoot的小型民营加油站管理系统.zip

    framework-all

    framework_all

    【Ubuntu】【交叉编译】实现跑马灯并以开发板为服务器通过cgi实现远程控制.html

    【Ubuntu】【交叉编译】实现跑马灯并以开发板为服务器通过cgi实现远程控制.html

    基于ssm的学生宿舍管理系统设计与实现源代码(java+jsp+mysql+说明文档+LW).zip

    实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理常用语句管理、常用语句收藏管理、常用语句留言管理、成语学习管理、成语学习收藏管理、成语学习留言管理、字典管理、论坛管理、基础管理、基础收藏管理、基础留言管理、情景学习管理、情景学习收藏管理、情景学习留言管理、诗词学习管理、诗词学习收藏管理、诗词学习留言管理、用户管理、管理员管理等功能。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7

    RTMPOSE rtmpose-m-2xb64-210e-mpii-256x256-A5000

    RTMPOSE rtmpose-m-2xb64-210e-mpii-256x256-A5000

    jdk-17.0.4.1

    jdk-17.0.4.1

    户外广告全球市场研究报告:2023年市场规模约为14121.8亿元

    户外广告全球市场研究报告:2023年市场规模约为14121.8亿元 在数字时代,户外广告作为传统与现代的交汇点,正以独特的魅力吸引着全球广告主的目光。从繁华都市的霓虹灯到偏远乡村的路牌,户外广告无处不在,以其直观、生动的形式,精准触达消费者的生活与出行场景。然而,在激烈的市场竞争中,如何把握市场趋势,实现精准传播,成为广告主面临的一大挑战。 市场概况 近年来,全球广告市场在经济周期动荡中展现出强大的韧性,不断触及新高度。据QYR最新调研,2023年全球广告市场规模已增至约9044.9亿美元,其中户外广告市场占据了一席之地。作为全球广告市场的重要组成部分,中国广告市场规模同样在快速扩张,2023年市场规模约为14121.8亿元,稳居世界前列。户外广告市场更是表现抢眼,2023年全球户外广告市场规模约为547.8亿美元,中国市场规模则达到约820.5亿元,展现出强劲的增长势头。 技术创新与趋势 随着数字化技术的广泛应用,户外广告的形式和内容不断升级,从传统的平面广告到如今的视频广告,再到未来的智能互动广告,户外广告正逐步走向智能化、个性化。视频广告以其音频视觉双重刺激的特点,通过故事情节、

    基于ssm的班主任助理系统的设计与实现+jsp源代码(完整前后端+mysql+说明文档+LW).zip

    学生信息管理: 添加学生信息:录入新学生的信息到系统。 修改学生信息:对现有学生信息进行更新和修改。 请假管理: 新增请假记录:记录学生的请假信息。 审批请假:对学生的请假申请进行审批。 请假统计:对请假记录进行统计分析。 申请假统计:可能是对请假申请的统计,可能包括未批准的请假。 成绩管理: 新增成绩:录入学生的成绩信息。 修改成绩:对学生的成绩进行修改。 删除成绩:从系统中移除学生的成绩记录。 家长信息管理: 新增家长信息:录入家长的联系信息。 修改家长信息:更新家长的联系信息。 删除家长信息:移除家长的联系信息。 学业预警管理: 新增学业预警:对可能存在学业问题的学生设置预警。 修改学业预警:更新学业预警信息。 删除学业预警:移除学业预警。 实习管理: 新增实习信息:录入学生的实习信息。 修改实习信息:更新学生的实习信息。 删除实习信息:移除学生的实习信息。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11...

    基于ssm的学生请假系统+jsp源代码(完整前后端+mysql+说明文档+LW).zip

    系统实现: 老师信息管理:老师信息的查询管理,可以删除老师信息、修改老师信息、新增老师信息。 学生信息管理:学生信息的查询管理,可以删除学生信息、修改学生信息、新增学生信息。 请假信息管理:学生的学院、专业、班级、请假类型进行条件查询,还可以对请假数据进行修改、审批、驳回、删除等功能,学生可以进行申请请假信息操作等等。 留言信息管理:对学生添加的留言信息进行回复功能,只有管理员和老师可以进行回复。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    喜来登五星酒店酒店数字客房管理系统.pdf

    喜来登五星酒店酒店数字客房管理系统.pdf

Global site tag (gtag.js) - Google Analytics