Monday, February 1, 2016

自动化测试简介

为什么要做自动化测试?

自动化测试可以做到人类无法做到的快速验证和反馈,从而提高软件质量和降低修复成本。
想象一下如果不写脚本去做压力测试,会是什么情形?

测试总类繁多,包括但不限于:

通过几十年的技术积累,上面所诉的90%都有相应的技术做自动化支持。由此可见业界对于测试自动化的推崇。


根据测试金字塔原理:


图:测试金字塔

金字塔越下层,说明运行速度越快,编写成本越低,应该在所有测试中占比最多。
金字塔越上层,说明运行速度越慢,编写成本越高,应该在所有测试中占比最少。

由此引出保障软件产品质量的三个基本测试:单元测试、集成测试和功能测试。

底层单元测试:

我们推荐的单元测试编写方法是TDD。通过TDD帮助我们理清需求,想清设计,从而编写更高质量的代码。你得到高覆盖率的单元测试仅仅是额外的奖励。
Java中我们用到的测试框架通常是JunitMockito
Scala我们会用Specs2

测试的编写应该从需求出发,每个测试都表达一个功能点,而不是从代码的角度去讨论单元测试,这点同时应该在方法名中体现。比如在猜数字的练习中,我们的测试描述应该写成 "should_tell_how_much_numbers_are_matched_when_I_guess",而不是"test_method_guess"。

另外为什么先写测试?
试着回答两个问题:先有需求还是先有代码?如何验证代码的正确性?
答案显而易见:先有需求,“实现了的需求”是检验代码正确性的唯一标准。
因此,我们应该根据需求编写相应的测试,并通过所有测试,以此来证明我们写的代码是可靠的。

具体写法,请参考示例

中间层集成测试:

在Restful应用中,集成测试通常是测试服务API。这种测试可以对某个服务进行端到端的测试,同时又避免了处理UI的复杂性。
API的测试,基于Java最常用的就是RestAssured,再加上Spring Test内存数据库等技术,使API测试能独立、可重复的运行。


上层功能测试:

功能测试也就是应用测试,是对产品整体的验证。功能测试只关心用户能接触到的内容,模拟用户使用产品,验证产品是否能解决用户问题,符合场景预期等。
最常见的就是UI测试,通过Selenium来模拟实际页面操作来验证产品功能。



所有测试都应遵照以下流程:

  1. 准备测试环境和被测对象
  2. 给定输入
  3. 验证输出

所有测试都应该符合以下标准:

  • 独立性:测试应能够清楚的表明一个功能或场景
  • 可重复性:测试应可重复运行,且都以同样的形式成功或失败
  • 自我验证:测试要无歧义的表达成功或失败
  • 完整性:测试应该不需要人为参与做类似于调整数据的操作

最后,要学会如何写自动化测试,重点是多练。可以从基础的题目开始练起,用自己擅长的语言。重点训练自己的测试思维,即我们是在验证用户价值,这样才能使测试真正有效。


Resources:
Kata练习题:http://codingdojo.org/

Books:
程序员的职业素养:http://book.douban.com/subject/11614538/

No comments:

Post a Comment