精华内容
下载资源
问答
  • TOEFL教训

    2010-06-13 23:33:00
    作文比较好,终于摆脱了上次GRE机考的恶梦,我之前背的模板果然很有用,终于有所写的了。但独立写作有些时间不够。 总的说来,这是一场轻敌了的战斗,也有一点小小的遗憾吧。 坐等成绩,bless…… 转载于:...

    今天终于裸考完了,4个小时下来,感觉不太好。出来之后我的第一感觉就是:我不该藐视托福的,四个小时的战斗终究是要一定的实力,至少要有足够的练习吧。

    3-5篇的阅读,我的是5篇,感觉鸭梨不小,但其实我不怕阅读,都读了几本“影印版”了,对付这个还是可以的,但今天好像状态不怎么好,有几篇读的时候有些恍惚,甚至有想到了过完这几个小时就可以轻松加码了,想到了我可是花了1K5报名的啊,可能是考场不如自习室安静吧。

    听力比模考的难一些,其中吉大的耳麦质量也是个因素。阅读之后几乎没有休息就接着听了,有些注意力不集中。还有我看对面那个人稿纸上记了很多,我也就跟着记一记,结果效果不太好,有些句子就错过了。之前我都是不用笔记的。所以听力有可能做得很不好。

    口语就尴尬了,我平时几乎都没开过口说英语,说起来很不顺畅。后来回想起来,我好像一个定语从句都没用,光一顿I think了,汗……

    作文比较好,终于摆脱了上次GRE机考的恶梦,我之前背的模板果然很有用,终于有所写的了。但独立写作有些时间不够。

    总的说来,这是一场轻敌了的战斗,也有一点小小的遗憾吧。

    坐等成绩,bless……

    转载于:https://www.cnblogs.com/rockuw/archive/2010/06/13/1758037.html

    展开全文
  • 上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇。其实我们在这条路上已经走了一年多,从16年初到现在。在使用Spring Cloud之前我们...

    上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇。其实我们在这条路上已经走了一年多,从16年初到现在。在使用Spring Cloud之前我们对微服务实践是没有太多的体会和经验的。从最初的开源软件云收藏来熟悉Spring Boot,到项目中的慢慢使用,再到最后全面拥抱Spring Cloud。这篇文章就给大家介绍一下我们使用Spring Boot/Cloud一年多的经验。

    在开始之前我们先介绍一下几个概念,什么是微服务,它的特点是什么? Spring Boot/Cloud都做了那些事情?他们三者之间又有什么联系?

    技术背景

    什么是微服务

    微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”。

    微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

    微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

    微服务架构优势

    复杂度可控:在将应用分解的同时,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,每个微服务可由一个小规模开发团队完全掌控,易于保持高可维护性和开发效率。

    独立部署:由于微服务具备独立的运行进程,所以每个微服务也可以独立部署。当某个微服务发生变更时无需编译、部署整个应用。由微服务组成的应用相当于具备一系列可并行的发布流程,使得发布更加高效,同时降低对生产环境所造成的风险,最终缩短应用交付周期。

    技术选型灵活:微服务架构下,技术选型是去中心化的。每个团队可以根据自身服务的需求和行业发展的现状,自由选择最适合的技术栈。由于每个微服务相对简单,故需要对技术栈进行升级时所面临的风险就较低,甚至完全重构一个微服务也是可行的。

    容错:当某一组件发生故障时,在单一进程的传统架构下,故障很有可能在进程内扩散,形成应用全局性的不可用。在微服务架构下,故障会被隔离在单个服务中。若设计良好,其他服务可通过重试、平稳退化等机制实现应用层面的容错。

    扩展:单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。

    什么是Spring Boot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架(不知道这样比喻是否合适)。

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。Spring Boot的核心思想就是约定大于配置,多数Spring Boot应用只需要很少的Spring配置。采用Spring Boot可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。

    Spring Cloud都做了哪些事

    Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

    以下为Spring Cloud的核心功能:

    • 分布式/版本化配置
    • 服务注册和发现
    • 路由
    • 服务和服务之间的调用
    • 负载均衡
    • 断路器
    • 分布式消息传递

    我们再来看一张图:

    通过这张图,我们来了解一下各组件配置使用运行流程:

    • 1、请求统一通过API网关(Zuul)来访问内部服务.
    • 2、网关接收到请求后,从注册中心(Eureka)获取可用服务
    • 3、由Ribbon进行均衡负载后,分发到后端具体实例
    • 4、微服务之间通过Feign进行通信处理业务
    • 5、Hystrix负责处理服务超时熔断
    • 6、Turbine监控服务间的调用和熔断相关指标

    Spring Cloud体系介绍

    上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架!

    Spring Cloud 工具框架

    1、Spring Cloud Config 配置中心,利用git集中管理程序的配置。 
    2、Spring Cloud Netflix 集成众多Netflix的开源软件
    3、Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化 
    4、Spring Cloud for Cloud Foundry 利用Pivotal Cloudfoundry集成你的应用程序
    5、Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。
    6、Spring Cloud Cluster 基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举和平民状态模式的抽象和实现。
    7、Spring Cloud Consul 基于Hashicorp Consul实现的服务发现和配置管理。
    8、Spring Cloud Security 在Zuul代理中为OAuth2 rest客户端和认证头转发提供负载均衡
    9、Spring Cloud Sleuth SpringCloud应用的分布式追踪系统,和Zipkin,HTrace,ELK兼容。
    10、Spring Cloud Data Flow 一个云本地程序和操作模型,组成数据微服务在一个结构化的平台上。
    11、Spring Cloud Stream 基于Redis,Rabbit,Kafka实现的消息微服务,简单声明模型用以在Spring Cloud应用中收发消息。
    12、Spring Cloud Stream App Starters 基于Spring Boot为外部系统提供spring的集成
    13、Spring Cloud Task 短生命周期的微服务,为SpringBooot应用简单声明添加功能和非功能特性。
    14、Spring Cloud Task App Starters
    15、Spring Cloud Zookeeper 服务发现和配置管理基于Apache Zookeeper。
    16、Spring Cloud for Amazon Web Services 快速和亚马逊网络服务集成。
    17、Spring Cloud Connectors 便于PaaS应用在各种平台上连接到后端像数据库和消息经纪服务。
    18、Spring Cloud Starters (项目已经终止并且在Angel.SR2后的版本和其他项目合并)
    19、Spring Cloud CLI 插件用Groovy快速的创建Spring Cloud组件应用。

    当然这个数量还在一直增加…

    三者之间的关系

    微服务是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。Spring Boot是一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务;Spring Cloud是一个基于Spring Boot实现的服务治理工具包;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架。

    Spring Boot/Cloud是微服务实践的最佳落地方案。

    实战经历

    遇到问题,寻找方案

    2015年初的时候,因为公司业务的大量发展,我们开始对原有的业务进行拆分,新上的业务线也全部使用独立的项目来开发,项目和项目之间通过http接口进行访问。15年的业务发展非常迅速,项目数量也就相应急剧扩大,到了15底的时候项目达60多个,当项目数达到30几个的时候,其实我们就遇到了问题,经常某个项目因为扩展增加了新的IP地址,我们就需要被动的更新好几个相关的项目。服务越来越多,服务之间的调用关系也越来越复杂,有时候想画一张图来表示项目和项目之间的依赖关系,线条密密麻麻无法看清。网上有一张图可以表达我们的心情。

    这个时候我们就想找一种方案,可以将我们这么多分布式的服务给管理起来,到网上进行了技术调研。我们发现有两款开源软件比较适合我们,一个是Dubbo,一个是Spring Cloud。

    其实刚开始我们是走了一些弯路的。这两款框架我们当时都不熟悉,当时国内使用Spring Cloud进行开发的企业非常的少,我在网上也几乎没找到太多应用的案例。但是Dubbo当时在国内的使用还是挺普遍的,相关的资料各方面都比较完善。因此在公司扩展新业务线众筹平台的时候,技术选型就先定了Dubbo,因为也是全新的业务没有什么负担,这个项目我们大概开发了六个月投产,上线之初也遇到了一些问题,但最终还比较顺利。

    在新业务线选型使用Dubbo的同时,我们也没有完全放弃Spring Cloud,我们抽出了一两名开发人员学习Spring Boot我也参与其中,为了验证Spring Boot是否可以到达实战的标准,我们在业余的时间使用Spring Boot开发了一款开源软件云收藏,经过这个项目的实战验证我们对Spring Boot就有了信心。最重要的是大家体会到使用Spring Boot的各种便利之后,就再也不想使用传统的方式来进行开发了。

    但是还有一个问题,在选择了Spring Boot进行新业务开发的同时,并没有解决我们上面的那个问题,服务于服务直接调用仍然比较复杂和传统,这时候我们就开始研究Spring Cloud。因为大家在前期对Spring Boot有了足够的了解,因此学习Sprig Cloud就显得顺风顺水了。所以在使用Dubbo半年之后,我们又全面开始拥抱Spring Cloud。

    为什么选择使用Spring Cloud而放弃了Dubbo

    可能大家会问,为什么选择了使用Dubbo之后,而又选择全面使用Spring Cloud呢?其中有几个原因:

    1)从两个公司的背景来谈:Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司;Spring Cloud是大名鼎鼎的Spring家族的产品。阿里巴巴是一个商业公司,虽然也开源了很多的顶级的项目,但从整体战略上来讲,仍然是服务于自身的业务为主。Spring专注于企业级开源框架的研发,不论是在中国还是在世界上使用都非常广泛,开发出通用、开源、稳健的开源框架就是他们的主业。

    2)从社区活跃度这个角度来对比,Dubbo虽然也是一个非常优秀的服务治理框架,并且在服务治理、灰度发布、流量分发这方面做的比Spring Cloud还好,除过当当网在基础上增加了rest支持外,已有两年多的时间几乎都没有任何更新了。在使用过程中出现问题,提交到github的Issue也少有回复。

    相反Spring Cloud自从发展到现在,仍然在不断的高速发展,从github上提交代码的频度和发布版本的时间间隔就可以看出,现在Spring Cloud即将发布2.0版本,到了后期会更加完善和稳定。

    3) 从整个大的平台架构来讲,dubbo框架只是专注于服务之间的治理,如果我们需要使用配置中心、分布式跟踪这些内容都需要自己去集成,这样无形中使用dubbo的难度就会增加。Spring Cloud几乎考虑了服务治理的方方面面,更有Spring Boot这个大将的支持,开发起来非常的便利和简单。

    4)从技术发展的角度来讲,Dubbo刚出来的那会技术理念还是非常先进,解决了各大互联网公司服务治理的问题,中国的各中小公司也从中受益不少。经过了这么多年的发展,互联网行业也是涌现了更多先进的技术和理念,Dubbo一直停滞不前,自然有些掉队,有时候我个人也会感到有点可惜,如果Dubbo一直沿着当初的那个路线发展,并且延伸到周边,今天可能又是另一番景象了。

    Spring 推出Spring Boot/Cloud也是因为自身的很多原因。Spring最初推崇的轻量级框架,随着不断的发展也越来越庞大,随着集成项目越来越多,配置文件也越来越混乱,慢慢的背离最初的理念。随着这么多年的发展,微服务、分布式链路跟踪等更多新的技术理念的出现,Spring急需一款框架来改善以前的开发模式,因此才会出现Spring Boot/Cloud项目,我们现在访问Spring官网,会发现Spring Boot和Spring Cloud已经放到首页最重点突出的三个项目中的前两个,可见Spring对这两个框架的重视程度。

    总结一下,dubbo曾经确实很牛逼,但是Spring Cloud是站在近些年技术发展之上进行开发,因此更具技术代表性。

    如何进行微服务架构演进

    当我们将所有的新业务都使用Spring Cloud这套架构之后,就会出现这样一个现象,公司的系统被分成了两部分,一部分是传统架构的项目,一部分是微服务架构的项目,如何让这两套配合起来使用就成为了关键,这时候Spring Cloud里面的一个关键组件解决了我们的问题,就是Zuul。在Spring Cloud架构体系内的所有微服务都通过Zuul来对外提供统一的访问入口,所有需要和微服务架构内部服务进行通讯的请求都走统一网关。如下图:

    从上图可以看出我们对服务进行了分类,有四种:基础服务、业务服务、组合服务、前置服务。不同服务迁移的优先级不同

    • 基础服务,是一些基础组件,与具体的业务无关。比如:短信服务、邮件服务。这里的服务最容易摘出来做微服务,也是我们第一优先级分离出来的服务。
    • 业务服务,是一些垂直的业务系统,只处理单一的业务类型,比如:风控系统、积分系统、合同系统。这类服务职责比较单一,根据业务情况来选择是否迁移,比如:如果突然有需求对积分系统进行大优化,我们就趁机将积分系统进行改造,是我们的第二优先级分离出来的服务。
    • 前置服务,前置服务一般为服务的接入或者输出服务,比如网站的前端服务、app的服务接口这类,这是我们第三优先级分离出来的服务。
    • 组合服务,组合服务就是涉及到了具体的业务,比如买标过程,需要调用很多垂直的业务服务,这类的服务我们一般放到最后再进行微服务化架构来改造,因为这类服务最为复杂,除非涉及到大的业务逻辑变更,我们是不会轻易进行迁移。

    在这四类服务之外,新上线的业务全部使用Sprng Boot/Cloud这套技术栈。就这样,我们从开源项目云收藏开始,上线几个Spring Boot项目,到现在公司绝大部分的项目都是在Spring Cloud这个架构体系中。

    经验和教训

    架构演化的步骤

    • 在确定使用Spring Boot/Cloud这套技术栈进行微服务改造之前,先梳理平台的服务,对不同的服务进行分类,以确认演化的节奏。
    • 先让团队熟悉Spring Boot技术,并且优先在基础服务上进行技术改造,推动改动后的项目投产上线
    • 当团队熟悉Spring Boot之后,再推进使用Spring Cloud对原有的项目进行改造。
    • 在进行微服务改造过程中,优先应用于新业务系统,前期可以只是少量的项目进行了微服务化改造,随着大家对技术的熟悉度增加,可以加快加大微服务改造的范围
    • 传统项目和微服务项目共存是一个很常见的情况,除非公司业务有大的变化,不建议直接迁移核心项目。

    服务拆分原则

    服务拆分有以下几个原则和大家分享

    横向拆分。按照不同的业务域进行拆分,例如订单、营销、风控、积分资源等。形成独立的业务领域微服务集群。

    纵向拆分。把一个业务功能里的不同模块或者组件进行拆分。例如把公共组件拆分成独立的原子服务,下沉到底层,形成相对独立的原子服务层。这样一纵一横,就可以实现业务的服务化拆分。

    要做好微服务的分层:梳理和抽取核心应用、公共应用,作为独立的服务下沉到核心和公共能力层,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求

    服务拆分是越小越好吗?微服务的大与小是相对的。比如在初期,我们把交易拆分为一个微服务,但是随着业务量的增大,可能一个交易系统已经慢慢变得很大,并且并发流量也不小,为了支撑更多的交易量,我会把交易系统,拆分为订单服务、投标服务、转让服务等。因此微服务的拆分力度需与具体业务相结合,总的原则是服务内部高内聚,服务之间低耦合。

    微服务vs传统开发

    使用微服务有一段时间了,这种开发模式和传统的开发模式对比,有很大的不同。

    • 分工不同,以前我们可能是一个一个模块,现在可能是一人一个系统。
    • 架构不同,服务的拆分是一个技术含量很高的问题,拆分是否合理对以后发展影响巨大。
    • 部署方式不同,如果还像以前一样部署估计累死了,自动化运维不可不上。
    • 容灾不同,好的微服务可以隔离故障避免服务整体down掉,坏的微服务设计仍然可以因为一个子服务出现问题导致连锁反应。

    给数据库带来的挑战

    每个微服务都有自己独立的数据库,那么后台管理的联合查询怎么处理?这应该是大家会普遍遇到的一个问题,有三种处理方案。

    1)严格按照微服务的划分来做,微服务相互独立,各微服务数据库也独立,后台需要展示数据时,调用各微服务的接口来获取对应的数据,再进行数据处理后展示出来,这是标准的用法,也是最麻烦的用法。

    2) 将业务高度相关的表放到一个库中,将业务关系不是很紧密的表严格按照微服务模式来拆分,这样既可以使用微服务,也避免了数据库分散导致后台系统统计功能难以实现,是一个折中的方案。

    3)数据库严格按照微服务的要求来切分,以满足业务高并发,实时或者准实时将各微服务数据库数据同步到NoSQL数据库中,在同步的过程中进行数据清洗,用来满足后台业务系统的使用,推荐使用MongoDB、HBase等。

    三种方案在不同的公司我都使用过,第一种方案适合业务较为简单的小公司;第二种方案,适合在原有系统之上,慢慢演化为微服务架构的公司;第三种适合大型高并发的互联网公司。

    微服务的经验和建议

    1、建议尽量不要使用Jsp,页面开发推荐使用Thymeleaf。Web项目建议独立部署Tomcat,不要使用内嵌的Tomcat,内嵌Tomcat部署Jsp项目会偶现龟速访问的情况。

    2、服务编排是个好东西,主要的作用是减少项目中的相互依赖。比如现在有项目a调用项目b,项目b调用项目c…一直到h,是一个调用链,那么项目上线的时候需要先更新最底层的h再更新g…更新c更新b最后是更新项目a。这只是这一个调用链,在复杂的业务中有非常多的调用,如果要记住每一个调用链对开发运维人员来说就是灾难。

    有这样一个好办法可以尽量的减少项目的相互依赖,就是服务编排,一个核心的业务处理项目,负责和各个微服务打交道。比如之前是a调用b,b掉用c,c调用d,现在统一在一个核心项目W中来处理,W服务使用a的时候去调用b,使用b的时候W去调用c,举个例子:在第三方支付业务中,有一个核心支付项目是服务编排,负责处理支付的业务逻辑,W项目使用商户信息的时候就去调用“商户系统”,需要校验设备的时候就去调用“终端系统”,需要风控的时候就调用“风控系统”,各个项目需要的依赖参数都由W来做主控。以后项目部署的时候,只需要最后启动服务编排项目即可。

    3、不要为了追求技术而追求技术,确定进行微服务架构改造之前,需要考虑以下几方面的因素:
    1)团队的技术人员是否已经具备相关技术基础。
    2)公司业务是否适合进行微服务化改造,并不是所有的平台都适合进行微服务化改造,比如:传统行业有很多复杂垂直的业务系统。
    3)Spring Cloud生态的技术有很多,并不是每一种技术方案都需要用上,适合自己的才是最好的。

    总结

    Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当前Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

    展开全文
  • 在部门做自动化有好一段时间了,经历了自动化从无到有,然后到框架,到现在的平台,以及持续集成,回顾发现由于自己之前经验太浅,走过的弯路太多,现在也还在谨慎的前进着,上次又回顾了一遍”软件测试经验和教训”...

    序言:在部门做自动化有好一段时间了,经历了自动化从无到有,然后到框架,到现在的平台,以及持续集成,回顾发现由于自己之前经验太浅,走过的弯路太多,现在也还在谨慎的前进着,上次又回顾了一遍”软件测试经验和教训”里的自动化测试章节,发现早前很多懵懂的经验,现在稍稍清晰,于是想着结合自己的历程精简出一些经验吧。现在经验还是尚浅,如果有更深认识的朋友,互相讨论,谢谢

      一、所谓自动化是为了软件发布服务的,并不只是为了测试服务

      来源:自动化测试目标建设

      以前一直怀疑自动化测试的用处,我们之前花费大力气开发了大量的基于关键字方式的脚本,用来提高测试的覆盖率,每次测试耗费大量时间,但是发现的问题少之又少,虽然说,自动化测试不是用来发现问题的,是用来验证软件没有问题,但是有一个矛盾在于我如果不做自动化测试,问题还是那么少,那么做自动化测试我们难道只是为了追求一个心理感受吗?这个概率问题怎么平衡

      后来,这个经验是在与开发一起合作冒烟测试建设,到现在的持续集成建设,开始明白,自动化测试的好处是为了增强开发的灵活性和保证软件开发流程的有序性

      1)快速检测新版本的不稳定变更,即冒烟测试,能够快速验证当前build版本是否可以继续下一步或者提测,此处冒烟测试可以是单元测试、集成测试和基本功能覆盖测试,常用的框架和工具:Junit、TestNG和接口测试框架(soapui、httpClient等)、界面测试框架用于基本的界面测试(QTP、RFT、selenium)。

      2)尽可能的暴露回归程序的错误,即例行回归测试,测试部门在开发提测后,基于开发的测试单,手工重点测试变更内容,利用自动化有选择性的覆盖其他功能。此处更多的是到了系统测试层面。

      3)验收测试,在发布前应用自动化的各种手段进行一次基本功能验收测试,通过率在多少以上才可以提交发布,而且此处环节还可以加入非功能测试。

      所以说,我们做自动化测试的目标一切都是为了软件发布服务,也可以理解为部署软件生产流水线,在这里,推荐一本书,《持续交付-发布可靠软件的系统方法》

      二、不要事后去计算人工替代率,而是要参考自动化测试有效性

      来源:自动化测试度量和ROI分析

      之前在年底做自动化测试度量的时候,要求每个产品线将自动化测试执行次数和时间进行统计,这样做的目的是为了统计自动化测试执行时间,然后要求测试人员算出每个模块的人工耗时,然后进行换算,得到自动化替换人工的时间,后来算完后,发现这样的数据其实是没有意义的

      1)测试的本质是不可以比较的,一次手工测试执行有可能比自动化测试执行也许是更有意义的。

      2)大多数的人工耗时都是拍拍脑袋想出来的

      3)运行只是表明自动化测试被执行,但不能证明这次执行是有效的,只有真正本来需要手工的测试被自动化执行时才有意义。

      所以,在度量上,一定要保持维度一致,可以横向比对,即不同模块之间进行比对,有效性上可以从自动化测试模块的应用场景和执行次数、执行频率去评估,成本上,即是自动化测试开发和维护成本

    三、度量一个自动化测试的可实施性可以从其可控制性或者可测试性上来考虑

      来源:自动化测试可测性分析

      有的人说单元做自动化比较好,有人说接口测试做自动化比较好,但奇怪的是也有人说他们做界面自动化比较成功,其实说接口测试和单元测试比较好的人,单元测试往往是开发来定义的,所以开发来控制可测性,接口测试的话,接口协议都是约定好的,所以可控制性和可测性有保证,而界面的话,有些产品的界面可测性控制比较好,例如都有唯一的debug id,或者界面变动性很小,那么也是考虑可以用界面自动化的。所以说,我们在推广自动化测试过程中,不是人云亦云,而是要结合当时的环境,从可测性上去考虑自动化测试的开展。

      四、试点推进自动化测试

      来源:自动化测试推广

      自动化思路重要,但是做自动化本身也是具有一定机遇性的,其环境相关性很大,所以在开展自动化测试前,一定不要过度自信,铺天盖地的推广,而是要找好试点项目。之前做过一个接口录制工具给测试人员推广使用,由于不是试点分析,每个组的测试人员拿着这个工具开发了一堆一堆的线性脚本,导致存积了大量的接口线性脚本,然后后来由于脚本的维护性和不稳定,慢慢的流于形式,甚是可惜。如果采用试点分析的方式,先在小范围进行使用,并且跟踪效果。

      业内有一个分层测试的理念很好,可以基于IP和地域选择性的发布新产品,根据使用效果,然后再根据情况逐步推向全国。

      五、自动化测试框架的重要作用之一是为了职责分层

      来源:自动化测试推广和框架建设

      所谓软件框架功能,我觉得很重要的一点是能够将每一层次的责任细分出来,数据驱动框架就是将数据单独抽离,让测试人员能更有效的管理数据,例如:可以构造重复的、组合的、随机的或者大量的数据包;关键字测试框架就是将对象封装、任务封装、业务组装分层,这样,可以让代码能力稍强的人员面对对象和任务封装,让业务能力稍强的测试人员面对业务组装,这样可以通过框架将各个人员的职责细分,做自己所擅长的事。

      关键字框架推荐robot framework,利用其可视化界面ride,其中还有一些拓展包,例如selenium2Lib可以应用在web测试。

      六、可以的话,让开发一起参与自动化测试

      来源:自动化测试可测性分析

      曾几何时,我基于RFT和QTP都试点推行了公司的界面自动化,但是效果不佳,究其原因还是界面的变化太大,加上一些自定义控件或者一些自定义图片展示的动态搜索无法查找,只能用存储对象的方式,后来大力发展接口自动化,将界面自动化先搁置了一段时间,后来开发自己做了一部分自动化,说是效果甚佳,去学习才发现,他们有一些图形和事件是基于xml配置定义文件描述的,这样利用JDOM技术,解析出文件,然后根据QTP的脚本编写规范,生成QTP脚本,而测试动作基本上涵盖增删改查。这种情况是我们测试之前无法知道的,因为开发流程原因,我们无法知道开发所采用的开发技术,所以说,我觉得可以和开发一起来评估自动化测试。

      七、自动化测试是可以成为一种习惯的,尽早自动化

      来源:自动化测试推广

      之前,和几位华为的开发朋友聊天,问他们一个问题:你们自动化怎么样,我原来以为开发是不太了解自动化的,没想到他们给我的答案是,什么怎么样,这是必须做的工作呀。原来他们华为的持续集成过程,开发自己写测试脚本做冒烟测试,以前这是华为的规定,现在是他们开发人员的一种习惯。

      所以,我觉得,推广自动化不一定一开始就要大张旗鼓的,也不是所谓的等到一切时机成熟,自动化测试是一种辅助测试的方法,不同的情况可以采用不同的方式,几行脚本,一个bat部署文件,一个数据统计,也是自动化的一种应用。用另外一种说法:不管黑猫、白猫,能抓到耗子的就是好猫。

     八、自动化应该立即见效,见效后应该慎重评估

      来源:自动化测试推广

      有时候如果我们对目的不够清晰,不能抓好本质问题解决,就很容易走极端,有人说录制不好,我们就反对录制,有时候我们抓到一个录制工具就以为遇到了神器,孰知后面是一个一个的大坑;而我觉得,录制不是不好,而是如何将它用在合适的地方,录制的好处是无需编程技能即可快速上,但是他的缺点是相对脆弱,一旦UI或者接口变化测试就会受到影响,分散的脚本不可重用且难以维护,而且系统在测试前必须可用(也就意味着无法使用A-TDD方法)。因此这种方法并不适合大型自动化测试。而关键字驱动,将数据与关键字结合来描述如何使用数据执行测试,这种方法是具备数据驱动的优势,同时非编程人员也能建立新类型测试。所有测试由同一个框架来执行,无需不同的驱动脚本。然而初始成本很大,但是可以使用开源方案,因此非常适合大型项目。所以,我们刚开始的时候,选择合适的项目,可以采用脚本录制这种方式,让自动化测试立即见效,小范围推动项目进度,然后,就严格控制,开始设计框架,把握可测性。

      九、不要指望用自动化测试平台一下子解决所有的问题

      来源:自动化测试平台建设

      当年在作自动化测试过程中,遇到瓶颈,就想当然的认为要开发业内所说的自动化测试平台,即先弄出一个线,然后再想办法去线上发展每个点,后来历时几个月,加班加点的,总算基于STAF开发出了一套分布式的自动化测试平台,但是后来用着用着就不了了之了,分析出原因是问题本身和目的都没有明确,单纯的开发出了一个架子,然后再去找衣服强塞进去是不可行的,架子本身是为放衣服服务的,所以平台本身是为让自动化更有序的进行而服务的,之后我们大力发展点,而平台是等点都满足需求后,开始将点串起来,自然而然的形成了一条线,然后再加以修饰,就成为了平台。所以说,不要舍本求末,追求花哨,而要踏踏实实的做好每一个点,以需求为导向,自然而然的才能把架子搭好。

      在这里也推荐几个用来搭建平台的较好的工具和框架:STAF, Jenkins,selenium grid可以用来做分布式测试执行和测试节点管理,sonar可以用来做质量管理平台,更多的是面向白盒测试分析。Toast也是一款不错的自动化测试平台,我觉得它的理念更多的像项目管理+jenkins。

      十、将所有的测试资源都版本控制起来

      来源:自动化测试配置管理

      这个很重要,在我们的自动化建设过程中,因为我们是多产品线的,每个产品线的有些功能模块是共用的,我们的方法是将每个模块的功能抽象成关键字接口,所有产品线共用接口,只是实现上不一样,而这种方式前期的问题是版本管理的问题,因为一个产品线开发出一个模块后,各个产品线开始互相迁移,导致迁移混乱,还有一个问题是产品功能模块也在不断的更新,不同的产品版本要对应不同的测试脚本,所以后来,加入版本管理,而最终的测试脚本版本用V1.0.0进行跟踪,第一位表示接口版本、第二位表示产品特性,第三位表示当前产品线的脚本维护。

      版本控制中重要的两个概念就是分支与合并,随着开发的版本控制的不断深入,测试的版本管理也需要跟上,常用的版本控制工具是svn、cvs以及分布式版本控制git,和基于流的版本控制系统Clearcase,个人觉得,前期可以用手工的方式定义好版本,等到开发协作强大到一定程度后,可以采用这些版本控制系统。

      十一、时刻反省自动化测试过程

      来源:自动化测试推广

      自动化测试是一个长期的过程,我们即要低头走路,也要不时抬头看路,也需要不时的休息一下,回顾自己走过的路程,整理之后才可继续向前,所以需要我们每隔一个阶段,就要好好反省自动化测试的开展和推广过程,大家的时间都是很宝贵的,珍惜自己的时间,更要珍惜大家的时间。

      总结;因为时间仓促和水平有限,有些经验和教训不一定很全面,或者还有朋友在推广或者平时观察到有更好的自动化测试实践经验和教训,希望可以一起总结,总之,个人觉得,学习过程最有效的方式是理论和实践相结合,知行合一,在实践中发现问题,然后去推敲理论,解决问题,最终总结从而变成自己的东西。

    最新内容请见作者的GitHub页:http://qaseven.github.io/

    展开全文
  • 蓝桥杯一些血的教训

    2020-10-07 00:59:08
    因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。 c语言中只有局部变量在未赋初值时,才是随机数,全局变量和静态变量...

    第四届蓝桥杯省赛 智能灌溉系统

    1. 首先,新建一个keil工程
    2. 一定记得main.c,iic.c要添加到文件夹中…!

    图1
    图一
    否则文件将无法执行。
    (ps: 有时候是单片机板子的问题,如下图,当时的情况是led灯全亮了,smg不亮)(我有什么办法,俺只能挨个排查呀!!)(排查现有模块。发现中断√ smg√ 初始化√)(只有添加一些绝对正确的特征判断程序的执行情况,就比如让特定的LED灯亮)

    作用:可以判断程序执行了哪些语句,未执行哪些语句
    在这里插入图片描述
    如果发现LED灯不亮
    (只有两种可能:
    1.程序未执行到这里(不可能!!!!)
    2.板子坏了)然后再继续判断
    ······
    4. 遇见按键一次,自加多次的问题.
    你能看出是什么错误麽? 在这里插入图片描述

    在这里插入图片描述现状描述:
    这也太神奇了吧,同样都是damp–,
    一个按键一次,自减一次;
    另一个,按键一次,自减多次;

    真的过于神奇:没注释的部分会按键一次自减多次
    注释的部分就是正常的
    这里是答案和问题的分割线---------------------------------------------------------------

    揭秘:
    是因为把cont 错写成了count
    这是两个不同的变量
    由这个事件也可以得出
    以后百度搜不到的问题,也许你目前想的这里并没有问题
    再去顺藤摸瓜的寻找一下
    可能是其他可能的错误

    第五届 简易温度检测

    详细代码:https://blog.csdn.net/qq_45720531/article/details/108234886
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    多个 if 与 else if的问题

    1,从字面上理解if为如果,就是如果这种情况,如果那种情况。
    2,else if 不是上一个条件的前提下,如果是这个条件。
    3,区别1:if无论是否满足条件都会向下执行,知道程序结束,else if 满足一个条件就会停止执行。
    4,区别2:由于if都会执行一遍,则可能会同一个需要判断的事件,会进入2个if语句中,出现错误,而else if就不会发生这样的事情。
    在这里插入图片描述
    这样写成else if的形式,就不容易程序同时执行两次

    局部变量初始值的问题

    1. 有关按键不灵敏的问题
      在这里插入图片描述
      没有写key = 0,就死翘翘了…,后面的判断情况不起作用。
      原因:
      C语言中,定义局部变量时如果未初始化,则值是随机的,这是为什么呢?

    定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。

    c语言中只有局部变量在未赋初值时,才是随机数,全局变量和静态变量未赋初值时编译器会自动将其初始化为0。局部变量是分配在堆栈上的,而全局变量和静态变量是分配在数据段中的。这个跟程序的内存分配是有关系的。

    1. 灯光闪烁时间问题
      在这里插入图片描述
      灯光闪烁是一个状态,所以标志位只能用~ 取反符号
      也就是每隔200ms就从0变成1,1变成0…

    4.读温度的时间不能太长
    在这里插入图片描述12位分辨率的传感器,读一次温度需要750ms

    但这次的问题是由于
    800ms读不出来,我来试试300ms呢

    这是10ms读取一次的效果:

    在这里插入图片描述3000ms的读取效果:
    数码管无闪烁
    但是led几乎没亮

    在这里插入图片描述
    在这里插入图片描述
    偶然间发现没有空格就可以亮
    然而
    经过很多次的测验,发现很多时候不是空格的问题。

    因此,控制变量很重要,要记录下俩对应的程序和现象
    (不要同时更改两个地方的程序,除非你十分确定它是错的)
    在这里插入图片描述
    结果:
    400ms的不能亮,800ms能亮
    (猜测1:是读取温度需要750ms,恰好跳过了中断
    猜测2: 400ms太短,程序执行到这里来的时候,标志位又变了
    (大概程序就是再写了温度后,LED不太正常的亮了)
    {所以以后不能随意的更改代码,改一次,一定要记住更改内容,变化对象!)

    揭秘:
    在这里插入图片描述
    800 是200,400,800的公倍数,如果用if else语句,就会造成选择结构,满足其中一个,就不会进入另一个继续判断。
    就会造成flag标志位不产生变化。

    一个优秀的程序员对这些简单的语句用的是炉火纯青,淋漓尽致啊

    小问题:单片机进入中断后,关闭中断,这时如果已经进入中断,中断会继续执行吗?

    : 会

    第六届:温度记录器

    1在这里插入图片描述
    将10进制转化为BCD码,记得各位的数字是%16喔,不然会转换错误。

    2.switch某个符合条件的case后不加break,为什么会执行后面不符合case的语句?

    在这里插入图片描述
    下图才正确:

    在这里插入图片描述
    揭秘
    Switch-Case 语句中一旦匹配case条件,无论后面的case语句是否匹配,都会执行case后面的命令。不行可以试试喔~

    3. 程序烧录成功,但不执行main里面的语句

    你随便点亮LED灯都不行的情况!康康你的main 是不是写成了 mian

    温度读取值为0

    注意定义的变量都是unsigned char 有8个位
    所以只需要移动4bit <<4
    在这里插入图片描述
    得到:
    在这里插入图片描述

    下图为错误范例:low的位也移动错了

    temp = high<<4 | low>>4;  //正确的
    

    在这里插入图片描述

    第八届电子钟

    在这里插入图片描述

    第九届彩灯!

    在这里插入图片描述

    懵懂问题

    晶振频率 12T 1T是什么?

    举例: 一般我们用的晶振频率是12.000M或者 11.0592M(时序要求不严的程序时可以混用的,就是节拍快慢不同的问题)
    一个时钟周期就是晶振的倒数的时间

    而执行一个命令(语句)
    1T模式下:就是一个时钟周期
    12T模式下; 就是12个时钟周期的时间

    展开全文
  • 面试 技术 教训It was almost like a dream. I had taken 6 months off to go all in on coding and moving to Australia with my girlfriend, when I finally returned to Norway — and a job. 这几乎就像一个梦。...
  • 点击下方图片可了解Kubernetes培训详情。在Ridecell公司管理基础设施团队几年后,我想在停下来休息时记录下我的一些想法和经验教训。Kubernetes不仅仅是炒作我在Kube...
  • Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题。 今天简单整理一下,分享给各位小伙伴。 一、线上操作...
  • 在Ridecell公司管理基础设施团队几年后,我想在停下来休息时记录一些想法和经验教训。 1Kubernetes不仅仅是炒作 我在Kubernetes领域里活跃了很久,所以这并不出乎我的意料,但当某件事情被大肆宣传的时候...
  • 教训(1)

    2005-09-21 08:41:00
    完成了我的第二个项目,急急得交了上去,感觉这次代码方面应该不会出现类似于上次那样粗心大意的问题,当然,事实上也是这样。但是,却忽略了更重要的问题,我做的所谓的查询,实现方式却只有一种,确切地说,我只是...
  • 今天周一再到北京南站,吸取教训顺利到达积水潭吸取上次教训,在南站直接打车去换线地铁,从开阳路 执行到菜市口大街,接宣武门外大街,在宣武门东大街的交口,转入换线地铁【宣武门站】。搞定
  • 初次部署SCCM2007惨痛的教训 上次看岳老师部署了SMS2003,没什么大的问题,看老师做的挺简单的,自己按照老师的步骤试验了一下,也没有问题,注意一点:就是关机时的方式,不要非法关机,否则下次启动SMS服务器时...
  • openstack用户列表 OpenStack Foundation每六个月会报告一次用户调查的结果。 最近一次迭代的结果已于本月初在... 方法已经改变,结果的显示方式也发生了变化,使得本次调查与上次调查之间的侧面比较有些困难。 ...
  • 苏州移动实习二面惨痛教训

    万次阅读 2013-07-08 18:43:38
     上次一面发挥不好,还是侥幸通过,得到二面通知。在得知自己可以有二面机会后,询问去年在苏州移动实习的师姐和学姐,大概问的问题,都答没有技术问题,都是聊聊天,氛围很好。然后我就真的没有准备技术问题!!!...
  • 今天小编给大家分享一下运维人员必知的23个经验教训,值得读一读!一、线上操作规范1. 测试使用当初学习Linux的使用,从基础到服务到集群,都是在虚拟机做的,虽然老师告诉我们跟真机没有什么...
  • rt,一个 憨批 错误 我,作为一个宏使用狂热爱好者, ...又想起了上次 ans=MAX(ans, ++mp[t]) 也是这样的锅 所以,远离宏定义 转载于:https://www.cnblogs.com/santiego/p/11238259.html
  • 血的教训---ogg一定要用最新的版本

    千次阅读 2014-11-26 14:02:15
    血的教训---ogg一定要用最新的版本
  • 警惕引用,血的教训

    2009-12-05 16:07:00
    悲惨的又一次经历,和以前那个abs宏多次计算出现的错一样,同样耗时一天,不同的是上次自己慢慢调试出来的   最近事情太多,这次有点心不在焉,还是请教同事在找出来的。      特此备忘并警醒...
  • 记录一下总结下经验教训 第一次提交:正常提交,就不说啥了。。。 第二次提交:发现严重bug了。。。撤销再提,没什么说的。 第三次提交:被拒了,原因是我们有直播的内容,苹果向我们要“网络文化经营许可证”,重点...
  • 记一次uboot编译/经验/教训 - 最近学习uboot移植有关的知识,在了解原理后自己编译uboot,但是出现了好多各式各样的错误,最后换了几次系统环境之后才找到错误来源 1.准备源码与交叉编译工具链 环境:ubuntu19.04...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,469
精华内容 2,587
关键字:

上次的教训