变和不变总是永恒的主题。先说说我看到的不一样的地方。

1、大的不同是互联网的产品很多都是自己来部署和运营,用户只要用一个瘦客户端能使用。

这里的瘦客户端是一个浏览器,一个App,或者一个需要安装的client,但是核心的数据和业务逻辑主要在互联网公司的机房里面,在IDC,在云端。这里和以前的C/S, B/S架构的企业系统的主要区别在于为多大范围的人来服务以及谁来运营和运维这样的系统。所以自然的,多了很多的这方面的工作。

缩小范围到测试这个方面,需要考虑现网的问题。比如有下面的这些方面:

a、如何来监控现网功能的可用性。

这个需要和运维一起来做,但是运维针对的是比较通用的部分,比如机器的资源使用情况、流量和带宽的情况,但是偏产品业务层面的,比如哪些功能是否可用,可能需要业务测试人员来设计和开发自动化的系统来监控了。

b、如何来发布功能到现网

测试完了一般直接发布了,所以不像传统的软件有那么长的测试周期,包括internal beta,external beta等过程,而且我了解到的情况,很多基于web的互联网产品平均有多个发布,可大可小。所以发布可能成了测试人员的工作,当然有相关的系统的支持。 这里还需要考虑的问题是常见的基于各种条件的灰度发布,先让部分用户用起来。发布完了之后还要做现网的验证。

c、如何来保证或者验证测试环境和现网是同步的

一旦是互联网的这种模式,测试环境的问题会变得比较突出,因为常常牵涉的系统比较多,有些和外部系统的接口可能很难以自己搭建或者用mock。另一方面如果保证测试环境是好的,到现网也是好的。需要相应的机制和工具来验证和同步。

2、互联网产品的节奏都很快

不像传统的一个客户端或者服务器的软件产品,可能周期是半年,一年,甚至更长。这样有比较充足的时间来做项目计划,需求评审,然后是概要/详细设计,进而有测试设计文档,开大量的测试用例,然后有不同的测试cycle,同时也可以有很多的时间来准备测试环境和自动化测试。

目前来看,互联网的产品这样做不太现实。这样对测试人员也是很大的挑战,可能看到一个需求过几天要开测了,用例是临时开出来的,根本来不及自动化,也没有很多的时间来做测试设计,然后测两天这个功能上线了。

不切身的感受很难体会到这种速度带来的差异。所以如何在这么短的时间里面来保证测试的覆盖度和质量,如果减少遗漏?

这是现实的问题,或者说是要求,有一些措施,但是其实也没有很好的答案。

3、有更多的人参与到测试里面来

互联网公司里面,测试vs开发的比例都很低,1:6,1:7都是很常见的,甚至更高,在这样的配比的情况下,如果来保证质量?必须有更多的方法。比如:

a、开发人员的自测。

测试耗费更多时间很多时候是因为代码的质量不够好,有很多bug,有很多讨论,很多的拉代码的次数。所以提高开发提交的代码质量是一个很重要的方面。有些公司是通过开发人员的强制的单元测试来保证的,有些是通过功能级别的自测来保证的。这些可以借助一些数据来反映,比如同一个版本拉代码的次数,或者测试用例的通过率等等。

b、产品或者运营人员的体验。

很多互联网的产品不像传统软件产品,不是一个产品经理来提所有的需求。产品,或者称为产品经理,是一个团队,每人负责一块来提出需求。另外很多需求可能是来自于运营团队,和business相关,或者是不同系统的打通。每个产品经理或者运营,需要在开发人员实现了相应的功能之后到体验环境里面来试用产品,是所谓的体验,看这些功能是不是他们想要的。这样可以在测试人员测试之前保证没有明显的需求理解的问题,避免浪费测试的人力和时间。

c、发布之前的评审。

不同的角色进来看对于一个已经测完的工作还有没有问题,以及发布的时候需要注意的问题,环境的问题,配置的问题,数据的问题等等。

上面的一些做法可能都有帮助,但是如何来推动,如果来检验都是需要流程和工具来支撑。

4、有一些是免测试的

不是所有发布到现网的东西都需要测试,有些改动是不需要测试的。这个没有一定的标准,取决于具体发布的情况,以及产品和团队的成熟度等因素。比如一些临时活动的页面,一些小的图片或者样式的改动,一些小的修复等等。只需发布完了之后到外网去验证。

有哪些可以走免测,这其实是一个很复杂的问题,当然风险也是有的,但是因此而带来的效率的提高也是很明显。

5、海量的用户带来的挑战

其实有很多,这里列举几个

a、如何来保证或者验证性能

传统软件的性能测试相对要单纯一些,可以比较容易搭建一套环境,流量也比较容易模拟。而互联网的一个产品可能有几百上千台甚至更多的服务器,多地多层部署,受到各种因素的影响,比如广告促销活动,一下子流量可以冲到很高。所以这方面的做法也会有所不同,全量的模拟不太现实,而且如上面所说,发布非常快,也没有那么多的时间去反复的做性能测试。所以如何来做比较轻量级的性能测试也是一个很大的课题。

b、浏览器的兼容性。

用户使用的浏览器种类可能非常多,包括大家都在骂的IE6,还有IE9的n种模式,版本更新速度火箭一般的Chrome和Firefox,以及很多种国产的浏览器。要一一覆盖是一个很大的挑战,其实不可能,但是产品团队肯定希望测试能够覆盖更多。对于一些企业级的产品可以宣称支持很少的几种,但是互联网产品很难这样做,那等于放弃一些用户。如何来设计策略?有没有技术手段?

c、一个小的改动引起的问题可以影响到无数的用户,而且很多时候马上会被发现,那个压力还是非常大的。整个修复的过程也是带电操作,没有那么多环境和时间来在内部慢慢调整,如何来保证修复的质量?

6、问题的修复

互联网的产品相比传统的产品的一个优势或者说是特性是问题的修复比较快,因为很快可以影响到用户,而不需要等用户一个个去打hotfix或者patch,甚至安装新版本。有很多时候,这种问题的发生到修复的时间很短,真是绝大部分用户都没有感知。有时候这个也会成为quick & dirty的一个借口,不过一般都会把现网的问题列为一个考核的指标。而且有些问题不是小问题,会构成事故。其实对于这样的产品,测试人员对于漏测的压力更大了。

7、测试工具和技术选择上的差别

大概是因为互联网自身产品的一些特点,各大公司都在大量的使用开源的,以及内部开发的平台和系统。相应的,测试方面用到的平台和工具主要也是这两种,要么是开源的工具(也可能做一些改造),要么是内部自己开发的工具。相比而言,传统软件行业更会去购买一些商业的测试工具,比如用于性能测试、覆盖率或者代码检查的工具,还有是测试用例和缺陷的管理平台。 目前我了解到的情况,国内几大互联网公司都是改造和自研的比较多,所以在简历里面列一堆大的工具的使用经验不一定有多大优势。而对于新人来说需要花不少时间来学习和熟悉这些平台。

以上列举了一些相比传统软件行业的不同的地方吧,但是对测试人员来说,也有很多相同或者类似的地方。

1、一样的需要非常了解产品和业务

对于测试人员来说,如果不了解产品和业务,测试工作很难开展,因为连基本的对错(是不是bug)都很难判断,当然除了一些明显的错误,比如js出错这样的信息,这种缺陷产品体验的时候能够发现或者等到被用户发现了。所以我们还是需要花很多的时间和精力来熟悉产品业务。从这个角度看,没有很大的变化,只是换了一个不同的领域而已,这个差别是不同的产品带来的,而不是因为传统软件或者互联网的差别带来的。

2、一样的需要了解产品的技术

这个其实和上面有点类似,测试人员需要去了解产品开发用到的技术,这对深度的测试,甚至和很多测试技术和工具的应用有很大的关于,比如性能分析,内存泄露的发现,覆盖率的分析等等。不去学习和了解这些,很多工作没有办法开展。从方向上来看没有变化,我们也要去学习和实践这些东西才能更好的了解。但是具体的技术可能有所不同,比如互联网web的产品可能会常用到JS,PHP, Java, C++等语言,还有各种web服务器,cache,代理等等。

3、具体的测试技术

上面说到了一些产品开发的技术,其实还有一块是测试方面的技术,其实这一块细化来看和传统的软件开发有很多相似甚至相同的地方。比如如果来做静态代码的扫描、局部的性能测试方法和工具、覆盖率的工具、自动化的一些工具和框架、一些监控的工具等等。

从这个角度来看,技术的差异并没有很大,当然互联网有一些特别,比如很多基于web的系统、分布式的、多层的,会对工具提出一些要求,这个差别其实倒不是很大,因为很多传统的服务器软件也是这样。

4、测试设计的方法

上面提到,因为产品发布节奏的差异,使得整个流程必须更轻更快,但是针对于一个具体功能的测试的时候,用例的设计和执行上需要考虑的问题其实和传统的没有太大的差别。因为这个时候大家面临的问题是一样的,如何测这个软件的这个功能。所以一些思路和方法还是能用得上。

综合以上来看,局部的差异反而比较小,但是涉及到大的形态和流程方面的差异会比较大。

也可能正是因为这样的原因,很多从传统软件到互联网的人也很快能够融入并开始发挥作用,而且退回几年来看,现在各大互联网公司里面的人大部分也都是来自于所谓的传统软件企业。