软件的研发流程
项目经理组织人员,安排工作。
产品经理开始收集整理需求,开发开始准备项目所需要的开发环境。
产品经理组织大家进行需求评审会议,在会议上把整理出来的需求告诉大家,让所有人都看看这个需求有没有不合理的地方。如果有不合理的地方或者不明白的地方就可以在会上提出来,让产品进行解释或者修改。
需求已经明确了,后端开发开始编写代码,UI设计人员根据需求开始去画图,测试人员开始去深入的熟悉需求,编写对应的文档。
UI的图出来了后,前端开发也开始编写代码了。
当后端的代码完成后,运维人员准备测试环境,测试开始做集成测试。
完成了集成测试后,前端的代码也完成了,测试人员就开始系统测试。
系统测试结束后,测试人员就开始做上线的准备,这个时候也开始进入验收测试阶段。
在预生产环境上面去搭建环境,然后检查是否没问题。
运维把软件上线,发布到生产环境上面去,如果有APP的话,还需要把APP发布到应用商城里面去。
运营人员开始高活动,吸引更多的用户来使用,并且收集反馈的内容。
测试拿到反馈,判断是需求还是BUG,产品会根据市场的反馈和变化,修改或者新增新的功能,然后循环上面的所有的步骤。
测试流程
测试流程是属于研发流程里面的一部分。
需求分析阶段
我们要测试一个软件,在最开始的时候我们就必须先搞明白这个软件的需求,然后才能够知道每个功能,对应的预期结果是什么,然后我们才可以对它做测试。
测试设计阶段
我们就要去设计我们的测试过程,等待开发的软件出来,我们就可以按部就班的开始测试了。
测试执行阶段
找BUG
测试总结阶段
评估软件的质量
研发模型
所谓研发模型是一个理论知识,所有的各种流程都是根据实际的需要,在研发模型的基础上,然后设计出来的一个实际的流程。
瀑布流模型
瀑布流就是说它的流程和瀑布一样,是一个从上到下,不可逆转的一个过程。
需求->计划->设计->研发->测试->验收->交付
缺点:因为整个过程不可逆,并且每个不同的阶段是互相独立,所以瀑布流的过程的推进十分的缓慢。并且中间的任意环节出了问题,都需要从头再来。
优点:瀑布流的每一个环节都十分的严谨,虽然做的慢,但是做出来的东西,质量很高。
V字型
V字型是在瀑布流的基础上延申出来的一个模型,所以它的本质和核心依然是瀑布流。
V字型在瀑布的基础上,让前面的过程和后面的过程做了对应的关系,让不同的步骤之间不是独立的关系,让我们在工作的时候有了一定的参考,提高了工作的效率。
需求 交付
需求分析 验收测试
概要设计 系统测试
详细设计 集成测试
编码 单元测试
W模型
在V字型的基础上又搞出来了W模型,W模型又叫做双V模型。W模型就把开发的工作和测试的工作互相拆分了,让线性的一个过程,变成了并行的一个过程。所以W模型极大的提高了工作的效率了。现在绝大多数的公司的研发流程,都是基于W来的。
开发 测试
需求分析 需求分析 系统安装 验收测试
概要设计 测试计划 系统构建 系统测试
详细设计 测试用例 集成 集成测试
编码 单元测试
螺旋模型
H型
敏捷模型
敏捷模型是目前整个行业中最火的一个模型,但是很多公司都是口头上的火,实际上也就那么一回事。
敏捷模型和之前的模型都不一样,因为敏捷不是一个流程上的模型,而是一种工作的理念。
敏捷模型中所做的任何事情都是围绕这个效率和快速来进行的。
简单的来说,只要你所做的事情能够提高工作的效率,那么都算敏捷。
但是敏捷经过了这么多年的推演,已经有了一些比较成熟的模式了。
比如:
快速迭代
传统的开发模式中,一个软件都是从头到尾逐步的进行的,所以想要看到这个软件的最终表现是需要花费很长的时间的。所以在敏捷中,就会把一个系统进行拆分,变成多个小的系统,我们就围绕着这些小的系统按设计的顺序,逐个的来进行开发。每完成一部分的内容,我们就可以看到这部分的最终表现了。如果有不正确的地方也方便快速的调整。
站立会
早上的早会,开会这个事情,在IT行业很常见,每天都会开会,开会这个事情如果是坐着开会,那么随便一个会议都要一两个小时。所以就让大家站着开会,大家站着都不舒服,就想快点结束,所以站立会效率很高。在早会的时候,每个人说明自己负责的工作,进度,问题,解决方案。分配每个人当前的工作是什么。
今日事今日毕
看板
在办公室里面,有一个展板之类的东西,上面会写清楚每个人负责的内容是什么,进度是什么。短期目标是什么。这样子每个人都可以一目了然的知道所有的进度以及负责的内容,当我们需要协作的时候,就很容易找到对应的负责人。
日报
每天下班前,上报自己的工作内容,让管理者可以清晰的知道大家的状态和情况。
集中办公
以前互联大公司,不同的部门可能分布在不同的地点甚至不同的城市,大家一起做项目,沟通的时候,都是只能通过网络来进行。就十分浪费时间。如果大家都在一个办公室里面,那么有什么事情,站起来吼一嗓子就沟通完了。
。。。
敏捷模型,对于开发来说就是敏捷开发,对于测试来说,就是敏捷测试。
敏捷模型要在公司正常的落地执行,对管理的能力要求很高。有的公司管理人员的能力很棒,那就是真的敏捷,有的的公司没有管理能力,那敏捷就是瞎几把乱搞。甚至有的公司喊着敏捷的口号,压迫员工加班。
测试左移和测试右移
这个是测试行业目前比较流行的工作理念。
在正常的工作流程中,测试的工作属于是一个承上启下,最中间的一个环节。
在测试开始之前,是产品和开发在工作。所以测试插手他们的工作的内容就是测试左移。
在测试结束之后,是运维发布,上线,监测,运营收集反馈,所以测试插手他们的工作内容就是测试右移。
测试左移和测试右移这些事情,一般只有在toB的项目上才会这么搞。
测试左移
在测试左移所做的事情都是偏技术的。
需求的整理和确认
软件的基础就是需求,如果需求在设计的时候就不正确,那么就会导致后续的所有的事情都是无用功,所以我们测试人员最好是可以直接参与到需求分析和确认的过程中去的,在需求阶段,我们就发现找出需求的设计的问题,就可以避免后面的很多事情。如果我们测试人员要实现这种效果的话,那么我们必须要对当前项目所涉及到的业务非常的精通,能够站在市场的角度,站在甲方的角度,站在用户的角度上去提出问题,补充遗漏的点,纠正错误的内容。要达到这样子的层次,起码高低得是一个业务专家。
开发编码
开发的代码写错了,是会直接的影响这个软件的质量的。虽然开发会自己去做测试(开发自测),但是开发的思维逻辑和测试的思维逻辑是有一些不同的,所以开发不能发现存在的很多的问题,如果我们测试能够直接参与到这个代码审查的环节或者单元测试的环节中,那么是不是就可以从编码的阶段,避免问题的出现。我们测试如果要参与这个事情,那么是不是就要求了测试必须得对编程能力有点精通才行。
开发发布版本
开发写完了代码后,需要对代码进行编译打包,然后交给测试。测试人员在测试环节中运行起来,然后才可以进行测试。如果版本的发布需要靠开发去编译打包,那么我们测试什么时候可以测试,全部都由开发人员决定了,他心情好就早点给我们打包,心情不好等到下班前,才给我们打包说可以测试了。所以我们不能让开发来决定这个事情。并且开发在打包的时候,如果是人工编译打包,还可能会导致打包的代码没有合并啊,或者不是最新的代码呀之类的问题,就导致打包出来的软件不正确。所以在这个编译打包发布版本这个事情上,要尽可能的避免人工的操作。也就是说,在这个过程中,我们需要引入持续集成的平台,把打包和部署这个事情,集成到平台上面,让平台可以自动的完成这个过程,避免人工的操作导致的问题。通过持续集成的过程,发布版本这个环节的效率和正确率都可以提升。所以测试要参与到这个环节中,我们就必须掌握持续集成的相关的操作。
测试右移
在测试右移的过程中,更多的是和人打交道。
灰度发布
灰度发布就是在测试人员已经完成了系统测试后,我们需要模拟一下在正式环节中发布会不会有问题,所以灰度发布就是把软件在预生产环境(灰度环境、UAT)上运行的一个过程。灰度发布这个过程和发布版本这个事情很类似,如果是人工去操作的,就很容易因为一些人为因素导致问题,所以这个过程我们还是需要借助持续集成来做。我们借助持续集成我们就可以自动的发布到预生产环境,并且在发布成功后,自动的触发自动化测试的过程,这样可以快速的确认灰度发布有没有问题。在这个环境中,我们测试人员都必须掌握自动化测试的技能,然后才能集成到平台中,实现这个过程。
线上监测
软件在生产环境上运行,运维人员是需要实时的关注软件的运行的过程的,防止服务器宕机,防止有人恶意攻击之类,防止软件出现重大的BUG。如果线上出现了这些问题,那么用户在使用的时候,是可以很直观的感受到的。用户才不会管你什么原因导致的问题,总之用户用的不爽,那就是你的问题。所以这个监测线上的过程就可以让我们第一时间知道系统出故障了,方便我们第一时间去处理问题。如果线上出了问题,运维人员也会第一时间通知测试,因为需要测试人员去定位到底是什么原因导致的问题。运维转发这个事情给测试,就会浪费时间,并且测试人员经常会被项目经理、其他领导询问系统的运行状态,所以我们需要要在第一时间知道系统的运行状态,所以我们测试人员需要参与到这个事情中去,也就是说,测试人员需要有看到监测过程的权限。并且还需要配置自动监测异常,自动通知的功能。那么我们才可以第一时间知道。
意见反馈
意见反馈这个事情正常情况都是运营或者售后人员去处理的。但是他们对这个的熟悉程度不如测试人员的,所以他们无法第一时间回复客户的问题,那一样的会让客户觉得你们不专业,那么就等于你们的软件的质量不行。所以最好是测试人员可以直接去对接客户。那么我们就可以第一时间给到用户的反馈结果。
持续集成
持续集成指的是把研发的工作中的一些人工重复操作的内容,用程序搞到一起,这个过程就是持续集成。然后持续集成完成后,就会有一个软件平台,然后我们就可以直接在软件平台上面操作,比如点击一下发布的按钮,就可以自动的把代码编译成软件包,并且可以自动的部署到测试环境上面去。
比如,jenkins就是目前比较流行的持续集成的平台,利用这个平台的功能,就可以实现上面所描述的过程,当然除了手动的点击按钮实现自动的过程,也可以根据我们设置的条件,自动的完成上述的过程。
在持续集成的过程中,可以做的事情很多,除了发版,搭建环境,还可以自动测试等等。
测试的常识
测试要介入的越早越好
软件在研发的过程,越早的发现问题,解决问题的成本就越低。
软件测试的目的是为了保证软件的质量
我们做测试,找BUG只是为了保证软件的质量的其中一种手段而已。
软件的质量不仅仅是开发写的代码来决定的,在我们整个的研发环节中,从需求到最后的运营每一个环节出了问题都会影响软件的质量。
互联网公司的人员结构
项目经理/PM
项目经理负责的就是整个项目的人员、工作、项目进度、项目质量等等所有和项目有关的任何事情。也就是说,我们在工作中,一半我们的直接汇报对象就是项目经理。比如现在公司要求我们去开发一个软件,这个事情就会直接交给项目经理去负责,然后项目去组织人员,安排工作,然后才会开始。
产品经理/PM
产品经理虽然名字里面带了经理两个字,但是一定要注意这是他的岗位的名字,不代表他是一个领导。产品经理和开发、测试、运维之类的都是同样的级别的,只是大家所负责的工作不同而已。产品经理主要负责的事情就是对整个项目的需求进行分析、收集、整理,也就是说,一个软件要做成什么样子,有些什么功能都是由产品经理说了算的。我们测试人员和产品打交道的时间很多,我们在做测试的时候,软件的预期结果就来自于产品。所以当我们对某个功能的预期结果不是很确认的时候,我们就需要去找产品经理做确认。
开发
前端开发
前端开发就是负责对软件的前端进行开发,比如WEB、APP、小程序等等内容。
后端开发
后端开发就是负责对软件的后端进行开发,以Java为例,我们在tomcat中运行运行的jar包、war包就是后端程序员做的。
测试
测试人员负责整个软件的质量,我们平时做测试、找BUG,只是为了保证我们的软件的质量的一种手段而已。
运维
运维简单的理解的话就是公司的网管这样子的一个角色。运维需要对公司的网络、设备、环境进行维护和管理,以及运维人员需要监测生产环境上面的软件的运行的过程。
运营
运营其实都不能算研发人员,但是运营人员和我们测试的工作是关系的,所以我们才写到了这里。当一个软件上线后,就需要运营人员去搞推广,吸引更多的人来下载使用我们的软件,在这个过程中,运营就会收集到很多关于用户、客户的反馈。运营收集到了用户的反馈后,因为运营人员不懂技术的,所以很多时候他都无法去判断反馈的内容是BUG还是建议,所以运营就会转发给我们测试,测试人员去判断是BUG还是建议,如果是BUG测试就需要去复现这个BUG。确定了BUG后再通知开发去解决,如果是建议,我们就需要转发给产品,让产品自己去考虑是否要修改或者增加对应的功能什么的。
UI设计
UI设计就是画图的,我们的软件的页面应该怎么设计,怎么排版,都是UI设计给搞出来的。他会根据产品对这个软件的功能的要求,去设计出具体的页面。然后前端开发就会根据UI的页面设计图,进行代码的编写。
不同的编程语法的作用
我们使用的软件就是通过编程语言的代码写出来的,但是最开始的时候代码文件,是可以进行编辑的那种文本文件,大多数的语言都是需要通过编译的过程,然后才能变成对应的可以在电脑上运行的软件。
比如,我们使用vue编写网站,在写代码的时候,文件的格式就是vue格式,通过编译,就可以把vue格式的文件,变成html之类的文件,然后就可以在浏览器里面运行了。
C
C语言是一个很古老的编程语法了,C语言主要用于底层的软件的开发、比如驱动程序之类的。我们平时所使用的应用软件一般不会使用C语言来开发。
C++
C++是C语法的升级版,C++一般用于桌面应用的开发,比如我们使用QQ、LOL之类的桌面应用软件就是C++做的。
C#
C#和C++的作用差不多,C#是java的一个竞品,但是C#发展的不如Java,差的很远,所以C#用的也不多。
Java
java一般现在就用于后端的开发。java有几个比较常用的框架,spring、spring-boot。
python
python是万能的,但是其实python不能作为主力的编程语言去使用,但是用来干一些辅助性的事情非常的好用。flask、django是python的web开发框架。
php
一般用于web的开发,后端的开发。thinkphp是php最出名的框架。
golang
golang也叫做go语言,是一门比较年轻的语法。目前很火,用的公司逐渐的在增多。一般用于开发后端的服务。
.net
全程asp.net,是微软公司开发的编程语言,是用来做网站,但是现在也是被淘汰了。
Android
Android即使一个操作系统,也是一门编程语言的名字。用来开发Android的APP用的。
kotlin
Android的替代品,也是用来开发Android系统的APP的。目前主流的。
object-C
用来开发苹果的软件的。
swift
用来开发苹果的软件的。是object-c的替代品,目前是主流的。
html
html不是编程语言,它是用来写网站的。一个网页排版结构就是html来编写的。
css
css也不是编程语法,也是用来写网站的。一个网站的颜色、展示效果等等就是CSS来实现的。
nodejs
nodejs不是编程语言,是JavaScript和typescript的运行环境,nodejs相当于是把浏览器里面运行代码的功能的这部分单独的给提取出来了。
vue\react\anglure这些都是nodejs的开发框架,开发者可以使用这些框架去编写代码,然后通过一个叫编译的过程,把写好的代码,转换成html\css\js。最终形成了网站。
基于nodejs的框架就很多了,比如小程序的开发、H5页面的开发、甚至APP的开发都有对应的框架,通过这个框架就是把代码变成可以在小程序里面、在Android、IOS、甚至Windows电脑上运行的程序。
JavaScript
js就是JavaScript的简称。js是运行在浏览器里面的一种语言,js可以去操作浏览器。我们的网站上的各种功能就是js做的。
typeScript
ts是js的一个超集,本质上js和ts是一样的,但是ts有更丰富的特性给开发者使用。
总结
在忽略非主流的用法的情况下,可以这么区分。
前端的语言:
JavaScript、typescript、kotlin、swift、Android、object-C、C#
后端的语言:
asp.net、python、Java、php、golang
搭建测试环境
搭建步骤
1、确认要运行的这个软件,需要哪些东西。
比如一个典型的前后端分离下项目,后端就需要mysql\redis\tomcat\程序包。前端就需要nginx\网页、APP的安装包。
2、先搭建后端。
2.1、安装配置mysql,根据要求设置账号。创建对应的数据库。
2.2、安装redis,根据要求设置redis。
2.3、安装tomcat(要先安装jdk)。
2.4、把程序包(war包),放到webapps中,然后启动tomcat,后端就启动完成。
3、搭建前端。
3.1、安装nginx
3.2、把nginx的代理的地址,写到前端的代码中,然后编译代码,输出我们这个测试环境所对应的网页文件,目的是为了让前端的网站能够连接上代理的地址,然后通过代理夹就可以连接后端了。
3.3、把网页放到服务器中,然后在nginx中创建对应的server、完成网页的运行。
3.4、把nginx代理的地址或者后端的地址,给到APP这边的程序员,让他们打包APP。目的是为了让APP能够连上我们的后端。
3.5、把APP安装到手机上。
4、访问项目,开始测试。