《自动化测试最佳实践》讲座总结
2016年11月26日 - 27日,参加了为期两天的自动化测试最佳实践。讲师是业界大牛陆宏杰。他在微软工作了5年,后来又在Photoshop工作了5年。
自动化测试是软件工程中非常重要的一部分,所以这次课程涉及了很多项目管理中其它内容。在此我针对部分内容做了总结。
0. 为什么要做测试自动化(Why)
测试自动化是为了做持续集成。而持续集成则是为了更早地发现并解决软件缺陷,同时生成项目数据报表(Dashboard)。这些都是为了更好地管理项目。
1. 自动化测试能做什么(What)
1.1 自动化测试能做什么
自动化测试是为了预防缺陷。
# 为什么不是用自动化测试“发现”bug ?
因为bug有个属性——“版本号”(如:2.1.0)。而自动化测试主要是在提交代码前检查是否有缺陷,这时候还没有生成版本。
(各位想一下自己平时在使用缺陷管理系统(如:Bugzilla)创建bug记录时,是否有个版本号之类的属性)
1.2 自动化测试在系统测试中的应用
系统测试是复杂耗时的组织行为。它有几个特点:
a. 它需要大量的准备工作,如测试环境的搭建(要尽可能地模仿真实的用户环境)
b. 它需要项目组全体成员参与,扮演真实环境中的各种角色
c. 因为代价高昂,为了更充分地利用这些投入成本,一般会安排饱和的测试任务(稍稍溢出最大工作量,肯定无法全部完成)
而自动化测试目的决定了它应该适合简短快速的测试用例,不适合漫长复杂的场景。所以自动化测试不适合大规模地应用于系统测试。一般在系统测试中,可以将自动化技术用于测试环境和测试数据的准备工作,以及为重复耗时的工作开发小工具等。系统测试的主要流程还是由人工把控。
1.3 人工测试与自动化测试的关系
人工测试是自动化测试的需求来源,对自动化测试提出新的需求。同时自动化测试会替代简单重复性的劳动,推动人工测试朝综合性的以价值为导向的方向发展。
2. 如何开展自动化测试
2.1 如何实现测试自动化
没有银弹。任何一款工具,无论是商业的还是开源的,都不能满足具体项目的需求。因为只有充分控制工具本身,才能去控制被测程序。所有自动化工具都要自己写。
# 如何操控被测系统?
测试程序与被测程序运行在同一进程中,直接控制被测程序的行为。
模拟鼠标键盘操作的自动化成本太高,难以维护,不可持续发展。
2.2 如何保证代码级控制模式的正确性
# 测试人员,即测试代码编写者,如何知道调用哪些开发代码以及如何调用?
由开发人员提供相应信息。
# 如何保证这种调用方式和真实键鼠操作的触发效果一致?
由开发人员做好设计,来保证效果一致。
# 如何做好项目组中不同角色之间的合作?
靠良好的流程制度(做好需求与设计)。
2.3 项目的典型流程
一般,一个项目会分成多个迭代版本;每一个迭代中又会涉及多个模块;每个模块都会有业务人员、测试人员和开发人员参与。这个划分不一定会所有项目完全吻合,但下面针对需求和设计的做法是绝大多数项目值得借鉴的。
需求文档、开发设计文档和测试设计文档是项目得以正常进行的重要保障;如果没有通过评审,后续工作无法开展;一旦通过评审,原则上不再更改。
# 强调文档是否违背了敏捷开发的理念?
敏捷并不是纯粹的快速响应需求作出代码变更。敏捷要求“同一件事,做一遍就通过”,减少因需求质量差导致的频繁返工。所以敏捷非常需要良好的需求和设计。这需要强制的流程管理来实现。
3. 如何衡量缺陷预防工作的有效性
比对迭代之间bug数量和自动化测试用例数量之间的差别。
根据发现阶段的不同将bug分为:
a. 开发期间发现的bug
b. 开发完成后发现的bug(即测试人员发现的bug)
c. 测试完成后发现的bug(即production环境中用户发现的bug)。
根据完成阶段的不同将自动化测试用例分为:
a. 开发代码完成时实现的case
b. 测试代码完成时实现的case。
下图是讲师提供的一个示例。根据之前的流程,在需求和设计上加大投入后,在production环境中出现的bug明显减少,绝大部分自动化用例在开发代码完成时已就绪。
4. 其它
4.1 我对代码级白盒自动化测试的理解
我对讲师提到的代码级白盒自动化测试的理解就是“用单元测试的技术去做集成测试”,即需要被测程序的架构对测试友好,同时借助Mocking技术做到关注点分离,提高测试效率。
4.1 性能测试如何做
目标:找到性能瓶颈
方法:确定性能敏感点,对存在敏感点的模块逐个做性能测试
点评:
我对该方法的评价:该方法适合具有良好代码级白盒自动化测试的项目,重在预防性能问题。其优点是执行速度快,可以对其它服务或网络解耦。
讲师的点评:对于缺乏此基础又需要在短时间内解决性能问题的系统,建议使用类似LoadRunner之类的工具。当然其它可以统计代码级运行时间的性能测试工具也可以,方法不唯一,只要能找到性能瓶颈就行。
4.2 用更少的case覆盖更多的场景
找到模块拓扑中的关键节点,以小部分集成替代完整集成。(据说该方法的有效性经过数学原理上的证明,我没有深究)
例如,在下图中模块B是关键节点,A类模块和C类模块的集成必须经过模块B。
如果用完全集成,需要9个case,即“A1_B_C1”,“A1_B_C2”,“A1_B_C3”,“A2_B_C1”,“A2_B_C2”,“A2_B_C3”,“A3_B_C1”,“A3_B_C2”,“A3_B_C3”。
如果用部分集成,则只需6个case,即“A1_B”,“A2_B”,“A3_B”,“B_C1”,“B_C2”,“B_C3”。
4.3 代码覆盖率
代码覆盖率针对代码块和代码分支的覆盖率,不是针对代码行。代码经编译后会形成多个块与分支。计算代码覆盖率就是通过在编译时标记这些代码块与分支(插旗),并在执行时搜集执行路径上遇到的这些标记(取旗),从而得到覆盖率。
4.4 处理带有破坏性的测试
有些测试活动可能会破坏环境,一旦case fail可能导致无法执行后续的case。例如安装测试一般会与操作系统产生直接联系,需要检查环境、删除及拷贝文件、读写注册表等。有些软件删除不彻底会导致无法进行下一次安装。而且有些安装测试需要不断监测大量的环境状态,非常耗时。对于这类测试,需要一个沙盒程序(sandbox)伪装成操作系统,来接管被测程序与操作系统之间的通信。(还是Mocking ^-^)
4.5 系统发布标准
首先代码得写完,Code Complete。在此基础上测试通过率,Pass Rate,得达标。但如果有关键的case没测或有严重的bug,即使case通过率达标也不行。所以还得满足Case Level和Bug Level的标准。在这基础上还要进行全民找bug活动,Zero Bug Bounce,已获得较稳定的版本(很有微软特色)。此外这些测试活动还得达到一定的代码覆盖率,Code Coverage。
4.6 单元测试谁来写
谁来写对项目进展有利,就让谁来写。讲师在微软工作时,项目组开发与测试人员的比例为1:1,单元测试由测试人员完成,开发人员只需负责功能开发。他们奉行的一个项目管理原则是“累死一小部分,造福绝大多数”。
4.7 自动化测试初创
很多项目在初创时并未对系统的可测性给予应有的重视,导致代码累积一段时间后很难直接从单元测试自底向上地开展自动化。对于这种情况,讲师建议先让测试环境和测试数据的准备工作自动化。
我的经验见解是,让开发人员完全背负质量问题的责任,尽量不要往人工测试上追加投入,迫使开发组设计出易于测试的系统。
4.8 版本控制
讲师建议版本控制应当“只有一个主干”,尽量避免在分支中开发。分支合并的代价很高,现实中真正需要分支开发的项目也很少见。
4.9 管理(分配)任务的原则:DACI
每个任务一般会包含4种角色:
a. Driver:任务的推动者。这是任务的Owner,任务成败由其负责,有且只有一个。
b. Approver:任务的批准者,赋予Driver权力,不参与任务的执行细节。
c. Contributor:任务的执行者,但不对任务的成败负责。
d. Informer:提供对任务的指导或其它相关信息(真的只是帮帮忙的角色)。
我的体会:
我们都讲责、权、利三者要统一。所以任务的发起人,即批准者,要对任务有一个比较内行的了解,才能找对Driver,赋予Driver合适的权力。有些东西再努力也没用。例:如果测试人员没有权力去强制开发人员设计易于测试的系统,开发人员又没有完全背负质量问题的责任,那么测试人员费再大劲也不可能创建一个良好的自动化测试体系。
每个任务中,所有这4种人(DACI)都要对自己的角色定位和他人的角色定位非常清楚,绝不能模糊,否则大家都会成为Informer:“我只是好心,来帮帮忙的”。
4.10 计划四要素:Owner、时间节点、预期结果、执行方法
4.11 微软的高层也要每天看bug,对项目非常负责,非常了解
讲师说有一次他在测印度团队写的程序时,发现对方在代码设计上做得不够好,没有做到应有的继承抽象,导致自动化测试代码也不得不写得很丑,于是提了一个Testability Bug。结果第二天美国那边的高层就在bug管理系统里发现了这个bug,马上就发信质问印度团队。印度团队回了封催人泪下的邮件,表明自己有多么努力多么不容易。美国高层对此的反应非常简洁,大意是:
a. 你们有没有按照流程先做设计再编码?(有没有做)
b. 如果你们遵循了流程,是不是做得足够严肃认真?(做的态度)
c. 是不是你们严格遵守了流程,但还是写出了这么烂的代码?(能力)
d. 如果以上回答都是Yes,You can be fired!
于是印度同事老老实实回去重新设计。
4.11 职业化
讲师对职业化的定义:一个模块对其它模块负责,一个人对其它成员负责。
4.11 价值微笑曲线
(老生常谈了)对一个项目要Fully Own,把需求也抓在自己手里,不要只做执行者。
- 大小: 11.5 KB
- 大小: 14.8 KB
- 大小: 16.1 KB
- 大小: 11.2 KB
- 大小: 37.6 KB
- 大小: 44.4 KB
- 大小: 8.8 KB
- 大小: 6.8 KB
分享到:
相关推荐
这个压缩包文件可能包含一系列关于自动化的讲座笔记、PPT演示文稿、代码示例和其他相关资源,旨在帮助学习者深入理解和掌握自动化技术的核心概念、工具和最佳实践。 自动化作为一个广泛的概念,包括了多个层次和...
10. **最佳实践**:分享行业内的测试最佳实践,如早期介入测试、充分的测试资源分配等。 以上内容构成了测试基础知识的核心,对于初学者来说,理解和掌握这些概念是迈进软件测试领域的第一步。通过不断的实践和学习...
自动化测试工具如JUnit、Mocha和Selenium可以帮助我们高效地完成这一任务。 7. **部署和监控**:完成开发和测试后,新业务需要部署到生产环境。使用持续集成/持续部署(CI/CD)工具如Jenkins或GitLab CI可以帮助我们...
- **Visual Studio Team System (VSTS)**:现在已更名为Azure DevOps Server,它提供了一套完整的解决方案来支持敏捷项目管理、版本控制、构建自动化、测试管理和部署。在VSTS上创建实践可以帮助团队更有效地协同...
10. **最佳实践**:分享业界的测试最佳实践,包括敏捷测试、DevOps文化以及TDD(测试驱动开发)等。 这份“ST&QA NIIT PPT(软件测试质量控制)”资料对于希望深入了解软件测试和质量控制的IT专业人士来说,无疑是一...
单元测试是一种编程实践,通过编写自动化测试用例来检查程序的各个部分,确保每个组件都能独立地正常工作。这有助于早发现错误,提高代码质量和可维护性。 2. **TDD(Test-Driven Development)与BDD(Behavior-...
例如,自动化测试工具可以帮助提高测试效率,减少手动测试的工作量,同时提高测试覆盖率。这类工具包括单元测试框架(如JUnit、PyTest)、集成测试工具(如Selenium、Appium)以及性能测试工具(如JMeter、...
9. **持续集成与版本控制**:介绍如何将DELPHI项目整合到Git或其他版本控制系统中,以及如何设置自动化构建和测试流程。 通过阅读"Delphi iOS程式讲座-PPT.pdf"这份资料,开发者不仅可以系统地学习DELPHI iOS开发的...
- Frank: 是一个开源的自动化测试工具,可以配合Cucumber一起使用,支持iOS应用的自动化测试,不需要编写额外的测试代码。Frank还具有server模式,这意味着可以通过自然语言描述测试步骤。 - KIF(Keep It ...
这个讲座可能深入探讨了如何利用Travis CI来实现JavaScript项目的自动化测试和部署。 **DevOps** 是一种开发和运维的协作文化,它强调开发人员和运维人员之间的紧密合作,通过自动化流程来提高软件交付的速度和质量...
总之,"autotests-course-yandex"是一门深度学习JavaScript自动化测试的课程,通过理论与实践相结合的方式,帮助学员掌握自动化测试的关键技术和最佳实践。通过这个课程,学员不仅可以提升自身的技术能力,也能更好...
“测试”(Testing)部分可能涵盖了单元测试、集成测试、压力测试等不同层次的测试策略,以及持续集成和自动化测试工具的使用,以确保产品质量。至于“架构”(Architecture),可能深入讨论了微服务、分布式系统、...
6. **持续集成与自动化测试**:使用工具如Maven、Jenkins等进行构建和测试,确保代码质量。 这份J2EE讲座讲义将带领学习者逐步探索这些知识点,从基础到高级,帮助开发者构建高效、稳定的企业级应用。通过学习和...
1. **指导开发**:Maven提供了符合最佳实践的项目结构模板,开发者可以快速搭建项目框架。 2. **自动编译**:Maven不仅负责源码编译,还包括测试、打包、部署等一系列构建任务。 3. **依赖管理**:自动解决和管理...
这要求有严格的自动化测试和监控,以确保部署不会对系统稳定性造成影响。CD的目标是实现一键式部署,减少人为操作带来的风险。常见的CD工具有AWS CodePipeline、Azure DevOps和Google Cloud Build等。 CICD的关键...
总结起来,实现高效软件交付的关键在于规范化流程、自动化工具的使用、团队间的良好沟通以及开发运维的无缝对接。通过云效等平台,可以有效地整合资源,提升团队协作效率,实现快速、高质量的软件交付。同时,随着...
6. **自动化测试**:在Symfony项目中实施单元测试、集成测试和功能测试,理解测试驱动开发(TDD)和行为驱动开发(BDD)的重要性。 7. **Symfony Flex**:了解Symfony Flex如何简化项目配置,以及如何通过Composer自动...
《PCB布线设计讲座2》是一份深入探讨印刷电路板(Printed Circuit Board, PCB)布线设计的专业资料,其核心内容旨在帮助工程师们掌握PCB设计的关键技术和最佳实践。在电子工程领域,PCB布线设计是至关重要的环节,它...
"Building Quality Software - Best Practices, Unit Test and TDD 10142013.pptx",虽然无法查看具体内容,但根据文件名可以推测这是一个关于构建高质量软件的最佳实践、单元测试和TDD(测试驱动开发)的讲座材料。...