发布新日志

  • 高性能性能测试开发方法

    2018-04-20 08:53:15

    1. 背景技术

    1、 关于软件的性能测试:通常的做法是编写性能测试代码(脚本),性能测试代码实质上就是自动执行的客户端程序,可以简称为性能测试客户端。然后建立起性能测试进程,在进程内并发运行多个性能测试客户端访问应用服务,这样就达到了模拟多个客户端的工作压力进行性能测试的目的。

    2、 互联网应用的兴起, 对性能测试提出了越来越大的挑战。 海量用户同时在线使用是互联网应用的显著特征,因此,互联网应用的性能测试要求测试场景中能够保证有大量的性能测试客户端同时运行,这样才能够达到充分真实模拟的目的。

    现有方案一及其缺陷: 现有的性能测试方法绝大多数的情况下都是在使用某一种性能测试工具, 以被使用最多、评价最好的loadrunner 为例,其测试方法的过程如下:

    · 测试代码的生成: 测试代码由2种方式得来,录制被测试应用客户端的行为,然后做参数化处理;或者直接开发出此类代码供使用

    · 测试代码的特点:只模拟一个客户端的行为;所有代码都被设计成在一个线程内顺序执行。

    · 测试执行:loadrunner提供测试进程,进程内为每一个性能测试客户端提供一个独占的线程。假如控制多台测试机(m台)、每台测试机启动多个测试进程(n个),每个测试进程包括多个测试线程(t个),这样,同时参与测试的客户端个数是 m*n*t 个。

    现有方案示意图:

    高性能性能测试开发方法

    注:白色区域为测试人员开发的代码

    缺陷:

    从软件设计性能的角度来考虑, 以上设计不是一个高性能的方案,测试机线程个数、cpu使用率、内存等系统资源随测试压力的增加很快就会成为性能瓶颈。所以这样的方案只能测试一些低压力的场景,如果测试互联网业务,测试进程的性能问题会导致测试无法进行或者时间、资金、人员等成本十分高昂。

    在设计过程中没有考虑到测试客户端互相通信的需求,比如性能测试客户**谀掣霾馐允笨桃笮阅懿馐钥突Ф薆完成某个功能或变更某种属性,这是无法办到的,因为某个性能测试客户端在设计上是封闭的,导致测试场景设计上不够灵活。

    优点:

    测试进程、进程的内线程都由测试工具来控制,测试代码无需关心,测试代码独立、无互相通信的需求,这样都保证了测试代码简单易开发,易上手,低技术级别的人员也可以完成性能测试任务。这样的设计结构也保证了商业的性能测试工具能够容易的控制license,保护其商业利益。

    2. 技术方案描述

    要解决的技术问题:

    极大地提供测试进程承载性能测试客户端数量的能力。提供性能测试客户端互相通信的支持

    整体思路:

    从纯粹软件的视角来考察测试进程,可以定义为:包括多个测试客户端,每个客户端可以自动运行测试业务。

    进一步分析,可以发现测试进程除了测试业务必须自动执行以外,其它方面和一个应用服务程序没有本质差异,也包括大量内存对象,也需要高并发、高吞吐量地处理请求和应答消息。

    所以,为了实现高性能的测试进程,必须摒弃测试代码只是完成一个客户端功能的思路,摆脱测试工具对线程的控制,以设计互联网高性能应用服务的思路来解决问题。

    在设计高性能服务程序时,线程池几乎是一个必选项,测试进程也需要引入线程池做为提高性能的必要手段。

    测试客户端离开了依附的线程如何能够自动的执行下去,也需要一个方法得到保证。

    方案一:

    1. 测试进程继续由**的测试工具提供或者由开发者自己开发。

    2. 必须由性能测试开发人完成的部分包括以下部分:

    a. 性能测试客户端代码:不再只是一段顺序执行的代码;而是一个包括必需的客户端属性和业务行为代码合集,在面向对象的语言中,称为“类”。所有客户端对象存储在同一个数据结构中,比如数组、哈西表等。

    b. 线程池:提供线程完成性能测试客户端的业务行为;每开始一次业务操作前从池中申请一个空闲线程、业务操作结束后归还。

    c. 调度定时器: 周期性地选择多个性能测试客户端和下一步他们需要执行的业务操作、为每个客户端和对应的业务操作从线程池选择空闲线程,执行。

    示意图如下:

    高性能性能测试开发方法

    注:白色区域为测试人员开发的代码

    优点:

    线程池引入极高地提高了性能。

    测试客户端转变了编程方式和存储方式、统一调度定时器的引入,能够更灵活方便地控制测试过程、控制场景、特别是当测试客户端需要协调调度的时候;测试客户端之间的通信需求通过进程内的过程调用就可以完成。

    3. 技术方案的关键点和保护点

    本技术方案与现有方案不同的部分,为了达到有益效果不可缺少的部分,可以是一个或多个。如果是多个的话,按重要程度从高到低的顺序列出。

    重新定义测试进程的结构引入线程池极大提高了性能

    重新定义测试进程的结构引入调度定时器配合线程池使用

    性能测试客户端由原来的一段顺序执行的代码转变为属性和行为构成的单元(在面向对象的编程中称为“类”),并且存储在一个数据结构中。


  • python开发工具pycharm快速入门

    2018-04-16 22:10:19

    本教程是关于什么的

    本教程旨在引导您完成创建,运行和调试一个简单的Python项目,使用PyCharm一步一步 - Python的IDE有一整套完整的生产性的开发工具。

    本教程不是关于哪些的

    Python编程超出了本教程的范围。要了解更多关于Python语言,请参考官方网站。

    在开始之前

    请确保:

    § 您正在使用PyCharm 2.7版或更高版本

    § 至少有一个Python解释器,版本从2.4到3.3是正确安装在您的计算机上。

    下载和安装PyCharm

    如果您还没有PyCharm,从这里下载这个页面。要安装PyCharm,按照说明,根据您的平台。

    启动PyCharm

    有很多方法来启动IDE,根据您的操作系统。

    § 如果你有一个桌面快捷方式图标 ,只需双击它。

    § 根据您的PyCharm安装的bin目录下,双击pycharm.exe或pycharm.bat(Windows)中,或pycharm.sh(MacOS和Linux)的。

    PyCharm启动并显示欢迎屏幕:

    创建于PyCharm一个简单的Python项目

    要创建一个新的项目,单击该链接Create New Project。你看,Create New Project对话框中,在那里你必须定义所有新项目进行必要的设置。

    需要注意的是,你可以创建一个新的项目随时...为了做到这一点,使用File → New Project的主菜单上。

    首先,指定项目名称 - 让它成为MySimplePythonApplication。需要注意的是PyCharm默认情况下显示的项目位置。您可以接受默认位置,或单击浏览按钮,找到一些合适的地方你选。

    接下来,选择项目类型。PyCharm提出了不同类型的应用程序(Django的,谷歌的AppEngine等)的发展的几个项目模板。当PyCharm建立从项目模板创建一个新的项目,它产生相应的目录结构和具体的文件。

    不过,在这里我们的任务是创造Python的一个项目。在这种情况下,我们选择的类型的空项目-它是纯Python编程最合适的。在这种情况下PyCharm不会产生任何特殊的文件或目录。

    最后,让我们选择一个Python解释器。正如你看到的,PyCharm通知您的Python解释器尚未选定。因为你至少有一个Python解释器在您的处置,让我们把它定义为项目的解释。

    要做到这一点,点击旁边的浏览按钮。在Python Interpreters对话框中,单击,选择本地...,然后选择从文件系统中所需的解释:

    当所有必要的设置完成后,OK按钮变为可用-所以点击它,并让你的项目做好准备。

    探索和配置项目结构

    您可以查看在最初的项目结构Project工具窗口:

    如你所见,该项目只包含项目的根,和Python解释器,你在所指定的External Libraries节点。

    接下来,让我们来探讨和详细配置项目结构:单击主工具栏上,然后选择Project Structure页面:

    根据该项目的根目录,你看.idea目录-它包含MySimplePythonApplication.iml文件,反映了项目结构,和几个XML文件,每一个负责其自己的一套设置,可以通过它们的名字被识别:encodings.xml,VCS的.xml 等。需要注意的是.idea目录是不是在Project工具窗口可见。

    接下来,让我们添加源根,所有的工作将被实际执行。在同一个Project Structure页面,用鼠标右键单击项目根目录,然后选择New Folder的右键菜单上:

    接下来,输入目录名:

    最后,让我们来庆祝这个目录为源根:选择的src目录下,点击你看到的src目录,现在标有

    图标。单击确定应用更改并关闭Settings/Preferences项对话框。

    请注意,其实这一步是可选的。你可以创建在项目根目录的文件,它会被视为源,因为默认情况下,该项目的根目录是源根。

  • 使用 email-ext 替换 Jenkins 的默认邮件通知

    2018-04-16 09:15:12


    简述

    众所周知,Jenkins 默认提供了一个邮件通知,能在构建失败、构建不稳定等状态后发送邮件。但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容、无法定义发送邮件的格式、无法定义灵活的邮件接收配置等等。在这样的情况下,我们找到了 Jenkins Email Extension Plugin。该插件能允许你自定义邮件通知的方方面面,比如在发送邮件时你可以自定义发送给谁,发送具体什么内容等等。本文不会告诉你如何安装该插件

    配置

    它主要包含两个部分:全局配置和项目配置。

    2.1全局配置

    当然,在一个项目中应用 email-ext 插件之前,您必须做一些全局的配置。现在先跳转到 Jenkins 系统设置页面,如下图:找到标题为“Extended E-mail Notification”的片段,你就能配置一些全局的 email-ext 属性。这些属性必须匹配你 SMTP邮件服务器的设置。这一节不仅能配置成 Jenkins 原有邮件通知的镜像(虽然有很多配置是一样的,但这是个不同的扩展点)而且还增加了一些额外的功能。输入框中名为 Default Subject  Default Content 的项允许你在全局级别配置邮件的内

    容。这样做的话,可以使您为所有的项目按您的需求做更好的、更简单的配置。如下图。


  • 性能测试的原则和方法

    2018-04-12 21:28:02


    什么是性能问题

    性能问题表现第一种

    小规模使用的时候性能表现很好,在大规模使用的时候,性能变得很差,业务响应时间随业务压力变得越来越慢

    原因:代码中对资源使用产生的瓶颈,后续的请求在资源(cpu、内存、锁、线程池)上排队

    例子: 没有索引的表的查询 随着业务量增加,表的行数快速增加,查询越来越慢

    性能测试解决的大部分问题是这种类型

    性能问题表现第二种

    在一定压力情况下,应用的性能突然变差或者不可使用

    原因:应用突然进入了一个异常逻辑,占用了很多资源,并且无法从异常状态下退出

    例子:fetion 后台 初期版本中使用同步的socket连接,网络单点异常的时候,全网的服务都不可用。

    性能测试很难解决这种类型的性能问题。很难定位异常逻辑是什么。

    性能问题表现第三种

    在压力大于某个阀值的情况下,总会出现少量业务错误

    原因:业务逻辑考虑不严密,导致少量流程不是按照期望发生

    例子:取一个值做uniquekey值,锁保护不够导致,取值不唯一。

    性能测试能够很好的解决这类问题。

    一些基本概念详细解析

    响应时间

    Response time是性能测试中考察被测试软件性能的一个指标;

    Response time包括从客户端请求发出开始,到reponse 应答回来后的时间总和,可能包括:

    网络传输

    cpu上可执行队列的等待时间

    cpu计算

    线程执行sleep语句的时间

    锁、闩的等待时间

    磁盘io等待时间等。

    吞吐量tps

    吞吐量 tps是考察性能的另一个指标;

    单位时间内完成业务量的多少,tps 是一个具体的常用的指标,每秒钟完成的业务个数。

    性能测试的原则和方法

    通常的误会是认为response time一定会影响tps,这个不一定成立

    并发

    并发是指同时被处理的请求个数,同时处理可以有2个含义

    同时都在线程堆栈上的请求

    指在正在cpu上处理的请求

    这里指得是后者。

    那么最大的tps = Concurrency*1000 /请求在cpu上的处理时间(ms)

    思考时间

    Think Time思考时间 Think time是在测试代码中出现的概念,为了在测试代码中模拟时间用户的思考时间而加的sleep时间,2个作用

    第一作用是控制测试代码的业务执行速度,完美地执行出预计的场景

    模拟实际用户执行的思考时间

    有状态的服务 很重要

    无状态的服务 不重要

    测试压力 business load

    测试压力是什么?或者是客户做了什么导致服务器产生压力

    对于无状态服务器,客户端的压力来源于客户端的请求数/秒

    对于有状态服务器,客户端的压力是客户端的在服务器的留存信息和rps。

    数据库是一个有状态的服务器

    有状态的服务器更容易有性能问题

    性能测试过程

    完美的测试过程

    完美的性能测试就是软件在现网上实际运行的过程

    实验室状态下永远也无法完全模拟

    性能测试无法找到所有的问题

    性能测试方案

    定义了在影响软件运行性能的各个方面采用什么样的方法和策略模拟真实的情况,达到尽量真实模拟的目的。

    非常重要, 决定了测试的成败

    基础数据 : 测试之前,测试环境中已有的数据总和

    关于基础数据的原则

    必须调查或者预测出数据库表中每个表应该有多少行的数据。

    而且数据取值要实际情况一样丰富。

    数据长度和实际情况相同

    基础数据决定着数据库server的cpu、内存、io使用或其他多种资源的使用逻辑。

    测试数据: 从基础数据中选取的,参与到性能测试中的数据

    选择原则

    在应用合理范围内随机挑选数据、挑选足够的量。

    挑选数据的方式通常影响数据库的内存和io,有状态服务的cpu和内存,线程、锁等。

    业务模型

    测试完成哪些业务?完成速率?

    建立业务模型的原则

    最好是实际用户行为的统计,如果没有借助同类软件的用户行为统计,再没有,根据有经验人员的预估。

    把用户所有可能使用业务按使用频繁程度排序,频繁程度越高就越应该纳入测试场景。

    查看业务消耗计算资源的程度,预计消耗程度越大的越应该纳入测试场景

    建立业务模型的原则

    多个业务在一起的复杂场景:把所有业务的在周期内的tps放在一起考察,一般情况下所有业务会有一致性的行为,即tps变化一致,取峰值阶段的tps为测试通过标准。

    如何有明显不一致,需要取2到多个典型场景分别测试

    测试场景

    多大测试压力(多少在线用户或者rps是多少)

    预估和实际预测的结果

    测试多长时间?

    无状态的几个小时

    有状态的几天

    硬件资源选择的原则

    大型分布式软件的中每个角色都需要负载均衡的设计才能够平滑扩展。 那么测试环境只需要取得这样一个环境的小的集合就可以了。

    单个硬件设备最好使用上线后用的机器,因为不同设备之间的差异很大,无法但从cpu、内存、tpcc等指标来分析硬件之间的差异。

    使用差异很大的设备测试只能定性的说明问题,无法定量

    如何编写测试代码


    能和实际的客户一样完成业务功能。这是最基本的能力,也是性能测试的基础,必选

    对每次与服务器的交互做严格的结果正确性检查,保证功能执行的正确性。性能测试的目标不仅仅是提供测试的工作压力,而且要保证测试功能的正确性,必选。

    提供出错日志功能,这对于初步分析性能问题,或者测试代码、被测试软件的功能问题都是非常好的手段,可选

    测试代码在设计时要意识地保证数据库的数据量的稳定性,可选。

    提高测试代码可配置性,保证在多种不同的测试场景下,测试场景可迅速建立,可选。

    测试执行人的能力要求

    测试人需要按照测试方案的要求,配置测试代码和使用测试工具建立起方案中的测试场景,必选。

    按照方案选择合理的测试数据,必选。

    测试人必须完全了解测试代码的每个细节,如果在测试中发现测试任何错误,如果这个错误是测试代码或者场景设置的问题,测试人有能力解决,必选。

    判断测试的结果分析是否有性能问题,必选。

    对于服务方的问题,提供当时的上下文环境供开发和优化人员分析,可选。

    能够解决被测试软件方由于配置错误等引起的简单问题,可选。

    软件优化的基本步骤

    性能问题有哪些? cpu的瓶颈、内存的瓶颈、磁盘io的瓶颈、网络io的瓶颈、线程之间同步的瓶颈等等

    软件优化好以后应该是什么样?特征

    Tps 基本上和cpu使用率正相关

    响应时间1-50 ms, tps 几百几千几万

    参考测试设备 cpu等资源的情况

    业务完成过程的复杂度

    如果有性能瓶颈

    首先排查其它瓶颈,保证tps和cpu正相关。

    察看是否有cpu滥用的现象

    “所有高cpu的问题都是不必要的循环引起的”---个人体会

    没有索引的表的查询

    应用本地没有缓存,反复从数据库或者其它应用获取。

    线程数太多,导致过多的上下文切换。

    性能测试的原则和方法

  • python中logging会重复写日志的问题分析

    2018-04-07 17:47:02


    现象


    重复写日志的情况,如下


    原因



    当第二次调用log的时候,根据getLogger(name)里的name获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,也就是说这个logger里有了两个同样的handler,所以就会出现调用几次就会有几个handler


    解决方案


    在日志记录完之后removeHandler

    例如:logger.removeHandler(streamhandler)


    除此之外你也可以去判定下,如果logger.handlers列表为空,则添加,否则,直接去写日志,例如


    if not logger.handlers:
        xxxx
    logger.error
  • LoadRunner性能测试基础知识问答

    2018-03-07 07:43:18

    Q1:什么是负载测试?什么是性能测试?

    A1:负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下,系统所能承受的最大负载量的测试,例如,访问一个页面的响应时间规定不超过1秒,负载测试就是测试在响应时间为1秒时,系统所能承受的最大并发访问用户的数量。

    性能测试:指在一定的约束条件下(指定的软件、硬件、网络环境等),确定系统所能承受的最大负载压力。

    Q2.性能测试包含了哪些测试(至少举出3种)

     A2:性能测试包含负载测试、压力测试、大数据量测试、疲劳强度测试等。

    Q3.简述性能测试的步骤

      Q4.简述使用Loadrunner的步骤

    A4:制定性能测试计划—>开发测试脚本—>设计测试场景—>执行测试场景—>监控测试场景—>分析测试结果

      Q5.什么时候可以开始执行性能测试?

    A5:功能测试通过;一般需要进行性能测试的系统,都是用户量比较大、业务使用比较频繁、比较重要的功能模块。

      Q6.LoadRunner由哪些部件组成?

    A6:主要有三部分组成:

    Q7.你使用LoadRunner的哪个部件来录制脚本?

    A7:使用Virtual User Generator录制测试脚本

     Q8.LoadRunner的哪个部件可以模拟多用户并发下回放脚本?

    A8:LoadRunner的Controller组件。

     Q9.什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?

    A9:在性能测试过程中,需要模拟大量用户在同一时刻,访问系统并同时操作某一任务,可以通过配置集合点来实现,多个用户同时进行某操作;

     集合点可以在服务器上创建密集的用户负载,使LoadRunner能够测试服务器在负载状态下的性能。

      设置集合点函数:lr_rendezvous("Meeting"); // Meeting是集合点名称

    Q10.什么是场景?场景的重要性有哪些?如何设置场景?

    A10:场景用于模拟用户实际业务操作;

    LoadRunner中场景有手工场景和面向目标的场景。

    设置场景:选择场景类型、设置运行时设置、模拟用户数、加减压方式、持续时间,配置负载生成器。

    Q11.请解释一下如何录制web脚本?

    A11:利用Virtual User Generator录制测试脚本,录制步骤:

    1、选择合适的协议

    2、设置录制选项

    3、开始录制

    Q12.为什么要创建参数?如何创建参数?

    A12:LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端 发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提交不同的数据,或者使用多个不同的值进行循环输入。 这时,在LoadRunner中就可以进行参数化设置,以使用多个不同的值提交应用请求。

    【参数化】:使用指定数据源中的值来替换脚本录制生成的语句中的参数。

    【参数化好处】

    ● 减少脚本的大小

    ● 提供使用不同的值执行脚本的能力,更加真实的模拟现实应用。

    【参数化步骤】

    ● 用参数替换Vuser脚本中的常量值

    ● 为参数设置属性和数据源

     Q13.什么是关联?请解释一下自动关联和手动关联的不同。

     A13:【关联的定义】简单的说:就是把脚本中某些写死(固定)的数据,转变成动态的数据,或者说将前面语句的结果数据保存下来,然后在后面的语句提交请求时使用这些数据。

      【需要关联的前提条件】:

      客户端需要从服务器端返回数据中获取部分数据,并将这些部分数据处理后作为自己下一次请求的一部分发出。

    【自动关联与手工关联的不同】:自动关联是在脚本录制过程中,VuGen会根据已经制定好的规则,自动找出需要关联 的值或脚本录制完成后,执行脚本一次,通过Correlation Studio自动找出需要关联的数据,并建立关联;而手动关联是需要录制两份相同业务流程的脚本,输入的数据要相同,利用WinDiff工具,找出两份脚 本之间不同之处,也就是需要关联的数据,再通过web_reg_save_param函数手动建立关联,将脚本中用到关联的数据参数化。

      Q14.你如何找出哪里需要关联?请给一些你所在项目的实例。

      A14:

    1、录制两份相同业务流程的脚本,输入的数据要相同

    2、利用WinDiff工具,找出两份脚本之间不同之处,也就是需要关联的数据

    3、通过web_reg_save_param函数手动建立关联,将脚本中用到关联的数据参数化。

    示例:

    通过录制两份脚本,进行对比,可知jsessionid、sap-ext-sid、sap-wd-cltwndid、sap-wd-tstamp需要进行关联。

      Q15.你在哪里设置自动关联选项?

      A15:录制选项中进行设置,如下图所示:

      Q16.哪个函数是用来截取虚拟用户脚本中的动态值?(手工关联)

      A16:Web_reg_save_param函数主要根据需要做关联的动态数据前面和后面的固定字符串来识别、提取动态数据,所以在做关联时,需要找出动态数据的左、右边界字符串。

    1.函数原型:

    int web_reg_save_param (const char *ParamName, <List of Attributes>, LAST);

    2.参数说明:

    ParamNam:存放动态数据的参数名称

    List of Attributes:其它属性,包含Notfound、LB、RB、RelFrameID、Search、ORD、SaveOffset、Convert、SaveLen。

    ● Notfound:指当找不到要找的动态数据时,怎么处理。

    ● Notfound=error,当找不到动态数据时,发出一个错误信息,为LoadRunner的默认值。

    ● Notfound=warning,当找不到动态数据时,不发出错误信息,只发出警告,脚本会继续执行下去不会中断。

    ● LB:动态数据的左边界字符串,该参数为必选参数,并区分大小写。

    ● RB:动态数据的右边界字符串,该参数为必选参数,并区分大小写。

    ● ORD:指提取第几次出现的左边界的数据,该参数为可选参数,默认值是1。假如值为All,则查找所有符合条件的数据并把这些数据存储在数组中。

    ● Search:搜寻的范围。可以是Headers(只搜寻Headers)、Body(只搜寻Body部分,不搜寻Headers)、 Noresources(只搜寻Body部分,不搜寻Header与Resource)或是All(搜寻全部范围,此为默认值),该参数为可选参数。

    ● RelFrameID:相对于URL而言,欲搜寻的网页的Frame,此属性可以是All或是具体的数字,该参数为可选参数。

    ● SaveOffset:当找到符合的动态数据时,从第几个字符开始才存储到参数中,该参数为可选参数,此属性值不可为负数,其默认值是0.

    ● Convert:可能的值有两种:

    ● HTML_TO_URL:将HTML-encoded数据转成URL-encoded数据格式。

    ● HTML_TO_TEXT:将HTML-encoded数据转成纯文字数据格式。

    ● SaveLen:从Offset开始算起,到指定长度内的字符串,才储存到参数中,该参数为可选参数,默认值为-1,表示储存到结尾整个字符串。

      Q17.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志?

      A17:在测试场景执行时,关闭日志,因为日志信息过多,也会影响性能测试结果;在调试测试脚本时,可以选择标准或扩展日志,用于输出调试信息。

    可以在运行时设置中,进行日志设置,如下图所示:

      Q18.你如何调试LoadRunner脚本?

      A18: 通常采用以下方法调试LoadRunner测试脚本

    ● 断点

    【方法】在脚本的任意一行上按右键菜单或F9增加断点。

    ● 单步跟踪

    【方法】通过菜单命令VUser—>Run Step by Step或F10,可以控制脚本以语句为单位执行。

    ● 日志输出

    【方法】通过日志输出函数lr_message、lr_log_message、lr_output_message输出。

    ● 对话框输出

    综上,在实际测试工作中,基本上使用前三种方法,对话框输出基本上没用过。

      Q19、你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。

      A19:在编写用户自定义函数之前,需要首先为函数创建外部库(DLL)文件,将这些库文件放在bin目录下,一旦库文件已经被添加并且将用户自定义函数作为参数,函数应该为以下格式:__declspec (dllexport) char* (char*, char*)

      Q20.在运行设置下你能更改那些设置?

      A20:可以修改Run Logic、pacing、Log、Think Time等,见下图;可以测试实际需要,修改相关选项。

      Q21.你在不同的环境下如何设置迭代?

      A21:在“运行时设置”中设置,如下图所示:

      Q22.你如何在负载测试模式下执行功能测试?

      A22:在负载测试模式下,可以通过同时运行数个虚拟用户,通过增加虚拟用户数,确定服务器在多大的负载量下,仍然可以正常运行,我一般进行核心功能操作,验证核心功能运行是否正常。

      Q23.什么是逐步递增?你如何来设置?

      A23:虚拟用户数随着负载时间逐渐增加,可以帮助确定系统响应时间减慢的准确时间点。

    可以在“加压”选项卡中进行设置:如下图所示,将设置更改为:“每 30 秒启动 2 个 Vuser”

     Q24.以线程方式运行的虚拟用户有哪些优点?

      A24:以线程方式运行的虚拟用户,在默认情况下,Controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将共享父进程的内存,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。

  • Appium自动化测试之微信h5元素识别和代码实战

    2018-02-26 14:15:56

    引子


    总会有人问微信的自动化测试怎么做。其实我不太明白,为啥你要对ta做自动化测试啊,除非你们公司产品是基于微信做的开发否则没必要。即使一个公众号我也觉得没必要做自动化测试,基本功能点下没问题就可以了,毕竟都是配置的,除非你后台配置错了。(有时候真搞不懂这胡乱的测试,你咋不把整个微信都测一遍啊)


    微信的本质


    微信其实就是一个混合的app,客户端里嵌入的webview,明白这个就好说了。大家一定要注意,app中的native可以用uiaotumator来查看元素,但webview里的ta是不行的可以使用chrome来查看,这个是很多初学者不明白的地方。


    如何查看微信webview中的元素


    几个前提:

    1、手机打开【开发者模式】

    2、app必须是debug模式(别问我怎么弄,自己问开发去)

    3、手机通过USB连接电脑,且能够识别出来手机(不会的自己google去。。。)

    4、可以翻墙。。。你懂的


    有了这几个前提之后就可以正式开始了,敲黑板。。。。

    1、打开微信,在任意对话框中输入debugx5.qq.com并发送

    blob.png

    2、点击发送成功的debugx5.qq.com,稍等片刻进入设置页面

    3、切换到【信息】,勾选【是否打开tbs内核】,如图

    blob.png

    4、退出设置

    5、进入【发现】>【看一看】

    6、打开chrome,地址栏输入chrome://inspect/#devices,可以看到设备或者你访问的资源(看不到的自己google,很多文章介绍)

    7、随便点击【看一看】里的一篇文章,在chrome中会自动显示出来,如下图中的专题就是点击之后出来的

    blob.png

    8、点击对应的【inspect】就可以看到页面了,接下来就可以轻松识别元素了,和用f12查看元素没有区别,如果你还不会请自行面壁去吧

    (此处需要翻墙,否则显示的是白页)

    blob.png


    代码实战


    上面这些搞定了,在Appium里写代码就简单了,先说下关键的几个点:

    1、#必须加上此句

    desired_caps['chromeOptions']={'androidProcess': 'com.tencent.mm:tools'}

    小强提示:

    微信的package name=com.tencent.mm,activity=com.tencent.mm.ui.LauncherUI,不要问我怎么知道的。。。


    2、#可以通过下面的语句输出webview的名称

    contexts=driver.contexts

    print('contexts=',contexts)


    3、#使用下面的语句切换到指定的webview里

    driver.switch_to.context('WEBVIEW_com.tencent.mm:tools')


    4、切换到webview里面,剩下的定位方式和web一模一样,就是上面讲的元素识别方法


    5、#如果想返回原生态的view,可以用下面的语句

    driver.switch_to.context("NATIVE_APP")#参数固定


    #以打开微信>点击【发现】>点击【看一看】>获取文章列表中某个文章的标题为例,其中进入【看一看】之后就是webview了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    查看(1493) 评论(0) 收藏 分享 管理

  • 职场中哪些人最欠打?

    2018-02-22 16:36:37

    都说明骚易躲,暗贱难防,93年的小鲜肉都已毕业走上职场,永远18岁的你,是不是还在贱人360°夹击下举步为艰? 年轻人!

    贱人们每日打卡花式表演,加班花式表演,认真工作?抱歉,他们其实是演员。眼看小人得志,贱人横行,辛苦做事的“走地鸡”们哀鸿遍野,为了地球和平,人类安宁,齐姐姐只好带着水兵月的责任心,代表月亮传授绝学,望众生早日KO贱人,“出任CEO, 走上人生巅峰”!


    点炮王


    你说红色美,他就说红色妖;你说西瓜好吃,他就说西瓜含糖量高;点炮王与生俱来的优越感堪比金三胖,三句话会有一个炮点,五句话必有一个意见。在提案会议上,你说一个提议,他分秒驳回。无论你说的是中文还是法语,他早已用看穿一切的眼神蔑视众生,仿佛维基百科都装在他小脑仁里。

    KO心法:

    点炮王对全世界都意见,实际就是存在感缺失,这种患者不是富二代就是负二代。要是王思聪,你就玛丽苏他,总有一天霸道总裁爱上我。要是犀利哥,你就于谦他,捧哏会吗?哦,咦,嗯,啊。继而忽闪着大眼睛说:“我不太明白您的意思呢,要不,您来?


    情绪娘娘


    三月伤春,十月悲秋,出门遇狗咬,停车被贴条,还配合着天气预报发圈文“阴天,在不开灯的房间”。情绪娘娘每天的内心都几乎是崩溃的。没交涉两句,无由来的怒气撒你一脸,一起工作就好似行走宫廷深深,时刻提防对方暴走,项目进度跟随她内分泌周期而决定。

    KO心法:

    稳住对方情绪,快速结束战斗才是主要矛盾 。熊孩子一哭,你就塞他一块糖。So,一见面就随便找个由头夸她:“哎呦您这鞋子真好看!最近又瘦了啊,气色红润万人迷啊?呵呵哈哈哈哈哈,您看这个项目我们如此处理了吧….”。


    口号侠


    这是一出场便自带新闻联播背景音乐的侠,头顶圣骑士光环的侠。无论什么会议,他一定要醍醐灌顶:“市场大好,领导体恤,人民勤劳,在党和国家的关怀下,我们必须完成任务!”(此处有掌声)。

    然后,就没有然后了。对,口号侠从不干活!NEVER!

    KO心法:

    口号侠基本是皇亲国戚,活不干但意见要发,事儿不做但功劳要拿。他发言你就鼓掌,他喊话你就叫好。用捧角儿的心捧着他,邮件封封CC他,会议场场邀约他,每每交谈,眼神中充满“崇拜”,大型汇报必提“口号侠”。妥了,坐等口号侠变历史人物吧。


    事儿妈


    打听隐私散播传闻,是她人生的一剂**,只要八卦在手,必定春风满面,跟她聊五分钟就能知道,大刘家喝的奶粉是澳洲还兰州的,小美的手镯是第几个备胎送的,以及老王小学同学的外甥女儿的男友他数学老师其实是CEO的小姨子!

    KO心法:

    职业归职业,生活归生活,谁也不想昨夜刚泡妞被拒,今天就在早会被提起,明星都要请人打理公众形象,更别提普通人的你。遇到事儿妈,请闭嘴,请闭嘴,请闭嘴,重要的事情说三遍!不讨论,不传播,不插话,远离娱乐圈,早日得道修仙。


    唐三藏


    三藏带队精兵强将,还有实现和平的梦想。三藏说起话来没逻辑没套路,自从看了驰骋的C罗,他就爱上了科比。三藏爱叨逼叨,却一直叨不到点上。一秒不差的说两小时,基本可以概括为“你好,我好,大家好”。三藏自知没有旷世奇才,只能用紧箍咒管理统治,无论他说的是啥,你必须听下去……

    KO心法:

    能发邮件尽量不发信息,能发信息尽量不发语音,能发语音尽量不打电话,能打电话尽量不面对面。实在要面对面,请脑海自动Replay 年度大剧《小时代4》。总而言之,躲远点,对自己负责,对家庭负责,对生命负责。


    挖掘机队长


    挖掘机技术哪家强?他绝对胜过蓝翔。挖掘机队长面带微笑,没有一丝顾虑的出现,鼓舞人心又勇敢无畏。 短短几周,业绩涨停翻番,队长封侯拜相。直到他拍拍屁股把工作交接给你的那天,你才发现在光鲜亮丽之下,无数大坑等着后来者填平。

    KO心法:

    前面的贱人都只是添堵,挖掘机队长会让你真丢饭碗。他爱讲大话,你就写好会议纪要。他爱拍胸脯,你就做好推进表。记住,谁污染来谁治理。问他细节、问时间推进,跟他权责分明,所以口头协商变成文档,签字画押才有效!


    假菩萨


    他笑脸呵呵从不发飙,手上佛珠是蜜蜡的,桌上茶具是汝窑的。你以为遇上了高人?图样!你跟他谈工作,他跟你谈哲学,你跟他谈管理,他跟你谈梦想。你申请涨薪,他跟你讲格局决定未来,你申请升职,他告诉做人要胸怀天下。只要不落到实质上,他什么都可以谈!

    KO心法:

    请移步各大招聘网站。嗯,深藏功与名!


    讲真,职场不是战场,巧妙的处理才是KO关键,红遍网络的“职场卸膊操”,每一句,你一定会听到,会用到。拿走不谢!

  • 思考|自动化测试面试题第一波

    2018-02-12 08:57:26

    本内容为企业面试关于自动化测试的考题,大家可以自己思考下如何作答,欢迎把答案留言到本文下方哦。

    问题1:请详细阐述接口测试和UI测试在测试活动中是如何协同测试的?

    问题2:在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?

    问题3:依赖于第三方数据的接口如何进⾏测试?

    问题4:接口测试中依赖登录状态的接口如何测试?

  • 性能测试loadrunner使用共性问题汇总

    2018-02-11 08:45:49

    2.3 共性问题

    2.31 虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?

     如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选 项。

    另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。

    2.32 thinktime与pacing的设置对脚本及场景的影响

    在我测试的过程中在稳定性测试场景中有一次我对场景中的一个脚本取消了pacing设置,结果导致VU退出,出现了内存冲突的错误。

    在我们测试中BancsLink_C63601_C63603_短信功能定制和删除、 BancsLink_C60422_C60423_活期与定期批次转出关联、BancsLink_C67050_C67000_修改客户信息提示等交易,不加thinktime时也会报错。

    首先我们要明确设置他们的意义。

    Pacing是通过设置两次迭代之间的间隔时间,来调整各个action之间的步调。从定义上来看,它是和iteration绑定在一起的。Pacing的设置可以调节系统压力的大小,影响系统处理事务的能力。在场景运行中pacing的设置是很重要的。

    Think time是通过设置思考时间,来模拟真实用户在操作过程中的等待时间。从定义上来看,它是在iteration内部的某个action中各个步骤的间隔时间,主要目的在于模拟真实用户操作情况,在测试中使虚拟用户对业务的操作更接近实际。

    示例:假设用户进行一次操作会消耗5秒钟的时间,即完成整个迭代需要5秒钟。如果用户不停顿,继续第二次重复操作,则同样耗费约5秒左右的时间。但是真实世 界中肯定是有停顿的。一个真正的用户,做完一系列操作后,会间隔一段时间。假定用户停顿了5秒,再第二次重复操作,则一共耗费10秒钟时间。映射到 loadrunner中,就需要在一次iteration中,设置一个thinktime = 1秒,然后在两个iteration之间,设置一个pacing为5秒。

    2.33 在运行场景中两个vu并发时交易出现错误,在脚本中没有出现这种情况。

    查看日志发现两vu所使用的参数值是一样的,所以在接收报文时VU不能对应的找到自己的接收报文。

    解决办法

    1、在场景中修改VU家在策略,有一次全部加载改为逐步加载。

    2、改变取参策略,把数据分块,然后分到固定的VU。

    2.34 题描述Deleted the current transaction ... since response time is not accurate

    出现这个问题时TPS大幅下降,VU并没有掉。这个问题不多遇见,在调试稳定性测试场景中遇到几次。一般出现在压力机器上发生ping值为负数时,可以重新启动pc机或者打补丁,如果还不行把场景另存.

    2.35 日志缓存过小:to Log cache is too small to contain the message.

    由于场景中Auto Log cache默认设置为1k,但是遇到报文较长的交易时自动日志缓存的容量就太小了我们就得手动修改。

    2.36 运行中掉VU。

    1、出现Action.c(35): Error : save param parameter is invalid. Error code : 9005. Error -- memory violation : Exception ACCESS_VIOLATION received.

    内存冲突的问题很普遍,有些程序设置之间的冲突也会导致这个错误,就脚本里来讲,HTTP录制的脚本里面关联错误会导致内存冲突;在socket协议的脚本里判断成功时我们一般采用字母、数字与存储在缓冲区里的报文做匹配,但是我们存在缓冲区里面的报文是二进制格式的,所以在场景中也会造成内存冲突,最后掉VU。可能一个很小的问题就会引起内存冲突。

    2、内存资源不足:脚本中的事务执行后没有释放buffer,最好在每个事务结束后就释放buffer。

    3、压力过大:压力过大导致本地存储收回报文的存储空间不足,写不了日志也会掉VU

    4、参数取值不正确也可能导致掉VU

    5、系统自身原因。

    总体来说,解决方法就是调整脚本、分成多台压力机进行测试。

    2.37 为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?

    在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。

      (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。

      (2)找到Windows关键字,Windows关键字如下所示:

      %SystemRoot%\system32\csrss.exe bjectDirectory=\Windows

      SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1

      ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2

      ProfileControl=Off MaxRequestThreads=16

      SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。

      (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。

      通过对注册表的更改,系统将允许运行更多的线程,因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。

    2.38 问题描述open many files

    问题一般都在压力较大的时候出现,由于服务器或者应用中间件本身对于打开的文件数有最大值限制造成,解决办法:

    1、修改操作系统的文件数限制,aix下面修改limits下的nofiles限制条件,增大或者设置为没有限制,尽量对涉及到的服务器都作修改。

    2、方法一解决不了情况下再去查看应用服务器weblogic的commonEnv.sh文件,修改其中的nofiles文件max-nofiles数增大,应该就可以通过了,具体就是查找到nofiles方法,修改其中else条件的执行体,把文件打开数调大。修改前记住备份此文件,防止修改出错。

    3、linux上可以通过ulimit –HSn 4096来修改文件打开数限制,也可以通过ulimit -a 来查看。

    4、linux上可以通过lsof -p pid | wc -l 来查看进程打开的句柄数。

    2.38 LoadRunner与服务器连接时遇到的问题

    (1)ERROR:sck connect Aborted

    这种错误一般是软件造成连接中断。由于软件错误,造成一个已经建立的连接被取消,比如LoadRunner自身的bug,在发报文时多位。典型情况下,这意味着连接是由于协议或超时错误而被取消的。

    (2)ERRORFailed to connect to server

    这个问题一般是客户端链接到服务失败,原因有两个客户端连接限制(也就是压力负载机器),一个网络延迟严重,解决办法:

      1、 修改负载机器的tcpdelaytime注册表键值,将其改小改小;

      2、 检查网络延迟情况,看问题出在什么环节;

      为了减少这种情况,最好测试中有个干净的网络环境,每个负载机器的压力测试用户数不易过大,尽量平均每台负载器的用户数,这样以上问题出现的概率就会减小。

    (3)ERROR:has shut down the connection prematurely

    分为以下三种情况:

    1.应用访问死掉

       小用户时:程序上的问题或数据库的问题 ,应该查看一下sql执行效率和JAV的垃圾回收情况,具体定位问题。

       2.应用服务没有死

       应用服务参数设置问题

      例如:

      在许多客户端连接Weblogic应用服务大部分被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25%。  Java连接池的大小设置,或JVM的设置等

      3. 数据库的连接

      在应用服务的性能参数可能太小了

      数据库启动的最大连接数(跟硬件的内存有关)

    (4)ERROR: connection refused.

    这种情况比较复杂,需要检查几个地方,不同的操作系统也会有不同的操作方式。

    1.首先检查是不是连接weblogic服务大部分被拒绝,监控weblogic的连接等待情况,可能与上面的一样需要增加AcceptBacklog,如果没有解决问题,还要增加增加连接池,调整线程数,(连接池数*Statement Cache Size)的值应该小于数据库连接数的最大值。

    2.查看服务器的操作系统中是否对连接数做了限制,AIX下可以直接编辑limit文件,修改连接数、端口数的限制以及tcp连接等待时间的间隔大小。若是windows系统,则要修改其注册表,修改TcpTimeWaitDelay(默认值30s)和MaxUserPort(可以调到小于最大值)项,键值在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Tcpip\Parameters\。因为当负载生成器的性能很好时,发数据包特别快,服务器响应也很快,从而导致负载生成器的端口在没有timeout之前就占满了。端口没有可用的时候就会出现错误,。执行netstat-na命令,可以查看端口。如果调整了TCP的timeout,情况会好点,在端口还没有占满前就有释放的了。

  • LoadRunner socket脚本开发问题合集

    2018-02-07 08:01:21

    1.2 socket脚本开发问题

    1.21 接收报文为空

    一般来说socket接收报文为空主要因为发送报文不正确而出现接收为空。解决办法也很简单,检查参数化是否有问题或者重截报文。

    参数化的一般原则是:

    1、参数化文件尽可能少,因为参数是放在内存中的,占用了内存的资源;

      2、参数化文件与脚本分离;

      3、参数文件的路径应该以相对路径来取;

      4、一些时候为了使参数更具有真实性,参数应该从数据库中来获得;

      5、参数类型的选择;

      6、参数的数据一般要由业务决定;

    1.22 运行脚本时出现跳参

    在执行建立账户时出现跳过参数导致交易失败的问题。可能是Thinktime设置过小导致的,时间延长后还是存在,只是减少了许多。

    1.23 出现运行脚本错误,会出现如下提示,另存脚本也报错。

    LoadRunner socket脚本开发问题合集

    这种情况可能是在移植脚本时数据丢失,另一种原因是在上次打开或脚本执行时系统里面有了该脚本的死进程。

    解决办法:首先查看脚本的各个部分是否正确,最好点一下程序编译检查错误,如果没有错误,新建脚本把里面的东西拷贝过去。也可以先看看系统是否有死进程结束掉或者重启机器。

    1.24 有些脚本在lr中运行一段时间会被卡死

    A、报文接收长短不一致。如:60480客户查询交易,以前总是迭代到二百次左右时会被卡死,经查看是接收报文长度不一样造成的,后来用LR自带的EndMark函数进行截取接收报文中的有效信息,就可以解决这个问题。

    B、数据量过大造成脚本卡死。由于LoadRuuner自带的Bug,所以在脚本运行时间较长、数据量大时会出现ERROR错误,程序无法终止,点击一下error脚本迭代一次,造成效率大幅下降。后来只能结束进程。原脚本也因为有些进程死掉不能再运行。然后另存新脚本才能继续运行。

    1.25 对run-time setting 设置失败

    打开run-time setting会弹出Failed to load run logic file

    LoadRunner socket脚本开发问题合集

    点击确定会出现run-time setting设置窗口,对其设置之后会提示设置保存失败。

    LoadRunner socket脚本开发问题合集

    此问题出现的原因是配置loadrunner加载运行时设置的default文件丢失。把其脚本的default文件拷贝过来一个放在脚本里目即可。

    1.26 使用IP欺骗出现的问题

    问题描述:The IP wizard does not support DHCP-enabled network cards.

      Your cards are either DHCP-enabled or configured with invalid settings.Please contact your system administrator.

    解决办法:首先,本地的IP设置不能为“自动获取”,必须指定一个静态IP。其次,所添加的IP只能是局域网内的网段只能添加192段,127段,10段IP地址

  • LoadRunner录制HTTP脚本问题合集一

    2018-02-06 08:57:29

    1 录制脚本问题

    1.1 HTTP 脚本问题

    1.11 LoadRunner录制脚本时为什么不弹出IE浏览器?

    1.一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。

    启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题

    LoadRunner录制HTTP脚本问题合集一

      提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。

    2.在系统中安装了多个浏览器需在“program to record”中指定需要启动的浏览器的可执行文件。

    LoadRunner录制HTTP脚本问题合集一

    3.览器的版本应与loadrunner的版本一致。

    LR 8--------àIE6

    LR9---------àIE7

    LR11--------àIE8

    4.操作系统有关

    windows server 在有数据执行保护,应将vugen.exe加入不受系统的保护项。

    LoadRunner录制HTTP脚本问题合集一

    1.12 录制脚本为空

    LR录制是客户端与服务器的数据交互,只有在有交互的时候才可以录制到脚本。

      A、(1) 交互方式若是通过客户端的server进行交互,则在script中选择最后一个track processes created as COM local servers ,把script里的最后一个选项选上就好了。

    LoadRunner录制HTTP脚本问题合集一

    (2)若是非客户端与服务器的交互操作,在页面上点前进或后退,如果页面是从缓存中取出来的,那么也就没有和服务器数据交互,所以也录制的为空脚本。 在windows注册表中禁用缓存就好了.

    (3)协议选择错误,b/s不一定走http协议,还可能是https(hypertext transfer protocol over secure socket layer)协议。

    LoadRunner录制HTTP脚本问题合集一

    B、选择internet选项里的连接里的局域网设置的代理不能选,因为LR在录制的时候会动态选择。

    C、网页里的恶意代码,检测的时候响应LR录制脚本[用工具检测恶意代码,然后卸载恶意代码,例如:Ad_Aweare] ,这个可能性不大。

    D、防病毒软件和防火墙,在录制时暂时关闭。

    E、 因为LR自身原因报错或者有些脚本不能录制下来,录制时最好选用view script,此时会报错,但能录下脚本,是因为LR无法解析,可以手工修改,而view tree 就直接停止了。

    1.13 录制Web脚本时,生成的脚本中存在乱码该如何解决?

    第一步:

    LoadRunner录制HTTP脚本问题合集一

    录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选“Support charset”,然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。

    第二步:服务器响应报文中显示乱码

    若是录制的脚本在切换到Server Response中,所有的中文全部变成乱码,如“勌缞仫訆”。

    原因是服务器端没有把响应的编码设置为gb2312,在IIS中找到Web.Config文件,在<system.web>….</system.web>节加入<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312"/>后再次录制脚本,乱码变中文。

    还有另一种情况:是录制的脚本里有乱码,但是不影响回放,测试中需要对其进行参数化,我们可以通过字符串编码转换的函数lr_convert_string_encoding( const char *sourceString, const char *fromEncoding, const char *toEncoding, const char *paramName)进行转换:

    lr_convert_string_encoding(lr_eval_string("{name}"),LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"str");

    strcpy(tmp,lr_eval_string("{str}"));

    第三步:回放过程中,LR的快照中显示乱码

    解决方案:

    在Run-time settings下Browser Emulation中点击change。。按钮

    LoadRunner录制HTTP脚本问题合集一

    在User-Agent对话框中更改Browser的类型和版本。

    1.14 ERROR:not found the correlation ParameterMemorry violation

    1.关联错误,检查关联的内容是否正确,左右边界取值是否准确很多时候,在关联的左右边界中是不分大小写的。

    2.关联较多时如果左右边界不唯一,会出现左右边界分不清的情况,参数值也会取不到。

    解决办法有两种:一、左右边界可以取长点直到可以唯一标识关联参数时;二、如果需要的关联很多,可以利用ORD控制(ord用来确定第几次出现的值,是要关联的值 ,默认值为1,就是第一次出现的值为关联的值,而设置成ALL则表示关联全部存在于左右边界的值,ord=all时可以使用参数数组)。在9.x的版本中提供了三个关于Ord的主要函数:

    lr_paramarr_len

    lr_paramarr_idx

    lr_paramarr_random

    1.15 关联报错:Action.c(20): Error -26377: No match found for the requested parameter "xxxxxx". Check whether the requested boundaries exist in the response data. Also, if the data you want to save exceeds 1024 bytes, use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-26377]

    这个问题是因为存放参数的缓冲区大小默认为1024个字节,也就是1k,比较小。应该根据需要进行调整。

    解决方法:

    web_set_max_html_param_len()函数可以自定义关联返回值存放的参数的最大长度,且一定要写在关联函数前面.

    1.16 问题描Error-27257: Pendingweb_reg_save_param/ reg_find/create_html_param[_ex] request(s) detected and reset at the end ofiteration number 1

    解决方法:web_reg_save_param位置放错了,应该放到请求页面前面。且在插入文本检查点时,正确写入 web_reg_find的参数值,通常TextPfx和TextSfx中会包含特殊字符如:双引号,等特殊字符,需要进行转义(用斜杠)例如:

    web_reg_find("Search=Body",

    "SaveCount=Welcome",

    "TextPfx=欢迎<a class="drop" id="viewpro" nMouseOver="showMenu(this.id)">",

    "TextSfx=</a>",

    LAST);

    1.17 为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?

    由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time Setting。

    LoadRunner录制HTTP脚本问题合集一

      进入“Run-time Setting”对话框,依次进入“Internet Protocol→Preferences”,勾选Checks下的“Enable Image and text check”选项即可。

      检查执行结果时推荐使用web_reg_find方法。

    1.18 一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?

    这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。

    由于脚本迭代时,init和end只能执行一次,如果每次都模拟一个新的用户并清除缓存,则用户登录信息将一并删除,迭代式可能会出现问题。

    LoadRunner录制HTTP脚本问题合集一

    1.19 LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止。

    错误现象:Action.c(41): Error -27979: Requested form. not found [MsgId: MERR-27979]

    Action.c(41): web_submit_form. highest severity level was “ERROR”,0 body bytes, 0 header bytes [MsgId: MMSG-27178]”这时在tree view中看不到此组件的相关URL。

    错误分析:所选择的录制脚本模式不正确,通常情况下,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、使用HTTPS安全协议,这时则使用“URL-based script”模式进行录制。

    解决办法:打开录制选项配置对话框进行设置,在“Recording Options”的“Internet Protocol”选项里的“Recording”中选择“Recording Level”为“HTML-based script”,单击“HTML Advanced”,选择“Script. Type”为“A script. containing explicit”。然后再选择使用“URL-based script”模式来录制脚本。

    LoadRunner录制HTTP脚本问题合集一

    注: HTML-based 方式和URL-based 方式的区别

    HTML-based 方式对每个页面录制形成一条语句,对LoadRunner来说,在该模式下,访问一个页面,首先会与服务器之间建立一个连接获取页面的内容,然后从页面中分解得到其他的元素(component),然后建立几个连接分别获取相应的元素。

    URL-based 方式将每条客户端发出的请求录制成一条语句,对LoadRunner来说,在该模式下,一条语句只建立一个到服务器的连接,LoadRunner提供了web_concurrent_start和web_concurrent_end函数模拟HTML-based的工作方式。

    如何决定选择何种录制方式?

    1、如果应用是WEB应用,首选是HTML-based方式;

    2、如果应用是使用HTTP协议的非WEB应用,首选是URL-based方式;

    3、如果WEB应用中使用了java applet程序,且applet程序与服务器之间存在通讯,选用URL-based方式;

    4、如果WEB应用中使用的javascript、vbscript脚本与服务器之间存在通讯(调用了服务端组件),选用URL-based方式。

    1.20 在录制一个应用的过程中,需要进行查询操作,若查询的返回结果过多,引起后续的脚本无法继续录制。

    这是由于loadrunner所能处理的数据条目小于返回的数据条目,导致了loadrunner不能处理返回的值。可以通过修改vugen.ini文件中的CmdSize=xxxxxxx的值,使得loadrunner所能处理的数据条目大于查询返回的数据条目。

  • 小白学习大数据测试之hadoop hdfs和MapReduce小实战

    2018-02-04 11:44:30

    在湿货|大数据测试之hadoop单机环境搭建(超级详细版)这个基础上,我们来运行一个官网的MapReduce demo程序来看看效果和处理过程。

    大致步骤如下:

    新建一个文件test.txt,内容为

    Hello Hadoop

    Hello xiaoqiang

    Hello testingbang

    Hello http://xqtesting.sxl.cn

    将test.txt上传到hdfs的根目录

    /usr/lib/hadoop/hadoop-2.7.4/bin/hdfs dfs -put /root/install/test.txt /

    然后浏览器访问可以看到刚才上传的文件,如下图

    运行官方的一个wordcount程序来统计字符数量,命令如下:

    /usr/lib/hadoop/hadoop-2.7.4/bin/hadoop jar /usr/lib/hadoop/hadoop-2.7.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount hdfs://localhost:9000/test.txt hdfs://localhost:9000/out

    解释下这个命令,大致意思是用hadoop执行一个叫hadoop-mapreduce-examples-2.7.4.jar的wordcount 方法,其中输入参数为hdfs上根目录的test.txt 文件,而输出路径为hdfs跟目录下的out目录

    PS:我这里没有把hadoop配置成环境变量,所以命令很长,你可以配置下,这样命令就会短很多了,至于怎么配置,自己悟~

    执行过程如下:

    执行完成之后再次刷新浏览器可以看到out目录和结果了

    点击part-r-00000,在弹出的页面点击download

    这时候下载会出现404,我们只需要在URL里的localhost改为你服务器的ip地址就可以下载了。下载之后用编辑器打开,内容如下:

    PS:你也可以用命令查看,如下图

    到这里,我们既完成了hadoop环境的搭建,也完成一次MapReduce的执行。其实也算是对hadoop功能的测试。如果你都成功了,那么恭喜你!如果你没有成功,那么也恭喜你,因为你发现了自己的不足!

    最后,大家请多多转发本文,每一步都是小编自己做的,耗费了很多脑细胞~转发才是对小编的最大支持哦

  • 部门日报系统部署备忘录

    2018-02-02 15:29:41

    引子


    部门里难免都会要求大家去写日报,其实这个是繁琐的工作,以前一直都是邮件或者excel,觉得查看和统计不方便。无意中网上看到了一款开源的日报系统,部署一下试试,这里就记录下步骤。


    部署步骤


    1、基本的linux和apache环境


    2、安装nodejs

        a、官网下载

        b、解压之后进入bin目录

        c、./node -v 可以看到版本

        d、设置全局,命令如下:

        ln -s /opt/node-v6.10.3-linux-x64/bin/node /usr/local/bin/node

        ln -s /opt/node-v6.10.3-linux-x64/bin/npm /usr/local/bin/npm


    3、安装redis

        a、官网下载、解压、进入目录

        b、make && make install

        c、redis-server 运行


    4、部署日报系统

        a、把dailyReport放到/opt/apache2/htdocs下

        dailyReport下载地址:https://github.com/WalterShe/dailyreport/zipball/master

        b、进入该目录运行:npm install

        c、vi config.js,修改app的端口为8888

        d、运行nohup node app.js &,之后看到输出'Express server listening on port '8888' 则表示服务器启动成功。

        如果想让它在后台永久运行则需要这样做:

         npm install -g forever

        forever start /opt/apache2/htdocs/dailyReport/app.js

        e、浏览器地址栏输入http://你的域名/install,会看到设置默认管理员账户成功页面,按照提示进入网站登陆界面,

        输入管理员账户名 adminn,密码1234567则可以登陆成功

        f、手机版访问地址是:http://你的域名/m


    浏览日报界面

  • 小白学习大数据测试之ETL

    2018-02-01 17:47:26

    之前发布过一篇关于ETL的文章,无奈被人说太简单。。。。唉,小编也是刚接触啊,自然不能那么高深,所以只是对学习的过程做了记录转换为文章分享给大家,如果对你有帮助,不要吝啬点赞+转发,如果对你没有帮助,那就请转身离开。。。。或者你写一篇更详细的给我,我申请红包给你(邪恶的笑~)


    好啦,回归正题,这次作为补充在详细介绍下。ETL是什么?其实ta指的是一个过程,就是大数据中对数据处理的过程(抓取>转换>装载),并不是一个技术!


    小编也是慢慢的学习大数据测试的知识,一直有个问题也困扰着我,就是怎么能判定数据的正确性?是,可以有多种手段去判定,但没办法保证100%的正确吧?(明白的朋友可以告诉我哈~)

    反正,总而言之ETL测试的核心就是要保证数据的正确性、一致性,其他都是浮云~


    常见的ETL测试方法(主要就是对数据处理中的各个关键点进行验证)


    那么,怎么测试呢?莫急,看~

    1、数据量。这个应该不用多说,你从源头拿来多少,存到目标表里又是多少,是否一致,是否正确

    2、转换。主要是对数据格式的合法性进行验证。参考点为:

    • 源中的时间、数值、字符等数据的处理,是否符合数据仓库规则,是否进行统一的转换

    • 是否有超出维表或者业务值域的范围

    • 是否捕获字段空值,或者需要对空值进行替换为其他含义值的处理

    • 主键是否唯一

    • 特殊符号或者乱码符号的处理规则

    • 脏数据的处理

    3、抽样。在转换完成之后要对转换之后的关键字段验证,还有源表和目标表的映射是否正确

    4、加载。这块比较麻烦,有全量加载(先清空再插入)和增量加载(目标表仅更新源表变化的数据)。选择哪种方式要看实际的系统是怎么设计的,没有标准。实际应用中,增量加载用的比较多,下面我们就说说ta。


    触发增量加载的方式(此处内容部分来自于网络的收集,自己做了下总结)



    触发器方式

    在要抽取的表上建立需要的触发器,一般要建立插入、修改、删除三个触发器,每当源表中的数据发生变化,相应的触发器就会将变化的数据写入一个临时表,抽取线程从临时表中抽取数据,临时表中抽取过的数据被标记或删除。


    优点:数据抽取的性能高,ETL 加载规则简单,速度快,不需要修改业务系统表结构,可以实现数据的递增加载。


    缺点:要求业务表建立触发器,对业务系统有一定的影响,容易对源数据库有倾入。


    时间戳方式

    在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。当进行数据抽取时,通过比较上次抽取时间与时间戳字段的值来决定抽取哪些数据。


    有的数据库的时间戳支持自动更新,即表的其它字段的数据发生改变时,自动更新时间戳字段的值。有的数据库不支持时间戳的自动更新,这就要求业务系统在更新业务数据时,手工更新时间戳字段。


    优点:同触发器方式一样。


    缺点:时间戳维护需要由业务系统完成,对业务系统也有很大的倾入性(加入额外的时间戳字段),特别是对不支持时间戳的自动更新的数据库,还要求业务系统进行额外的更新时间戳操作;另外,无法捕获对时间戳以前数据的delete和update 操作,在数据准确性上受到了一定的限制。


    全表删除插入方式

    这个就比较好理解了,每次ETL 操作均删除目标表数据,由ETL 全新加载数据。


    优点:ETL 加载规则简单,速度快。


    缺点:不可以实现数据的递增加载


    全表比对的方式

    ETL 工具事先为要抽取的表建立一个结构类似的临时表,该临时表记录源表主键以及根据所有字段的数据计算出来,每次进行数据抽取时,对源表和临时表进行的比对,如有不同,进行Update 操作,如目标表没有存在该主键值,表示该记录还没有,即进行Insert 操作。


    优点:对已有系统表结构不产生影响,不需要修改业务操作程序,所有抽取规则由ETL完成,管理维护统一,可以实现数据的递增加载,没有风险。


    缺点:ETL 比对较复杂,设计较为复杂,速度较慢。与触发器和时间戳方式中的主动通知不同,全表比对方式是被动的进行全表数据的比对,性能较差。当表中没有主键或唯一列且含有重复记录时,全表比对方式的准确性较差。


    PS:说了这么多,可能会有朋友问那用什么进行ETL测试啊!答案:手工或ETL测试工具Informatica(后续有机会我们会介绍该工具如何使用,如果有朋友很熟悉了,也欢迎投稿给我们哈,有红包奖励哦!)或Hivetest

  • 大数据测试之hadoop单机环境搭建(超级详细版)

    2018-01-30 11:08:14

    友情提示:本文超级长,请备好瓜子

    Hadoop的运行模式


    单机模式是Hadoop的默认模式,在该模式下无需任何守护进程,所有程序都在单个JVM上运行,该模式主要用于开发和调试mapreduce的应用逻辑;

    伪分布式模式下,Hadoop守护进程运行在一台机器上,模拟一个小规模的集群。该模式在单机模式的基础上增加了代码调试的功能,允许你检查NameNode,DataNode,Jobtracker,Tasktracker等模拟节点的运行情况;

    单机模式和伪分布式模式均用于开发和调试的目的,真实Hadoop集群的运行采用的是完全分布式模式

    单机模式安装步骤


    一个干净的linux基础环境(重要,这个环境如果有问题后续就全是问题了)

    为了方便大家我已经安装好了一个,大家只需下载导入到vm里即可使用。

    链接:https://pan.baidu.com/s/1qXRjaK8 密码:xjfk

    关闭防火墙(适用于centos7,低版本不适用)

    分别执行如下两条命令:

    systemctl stop firewalld.service

    systemctl disable firewalld.service

    修改host name

    vi /etc/hosts

    然后把自己虚机的名字追加到两行的末尾,如果用的是我们提供的虚机,名字就是linux,追加之后的效果如图

    重启网络:/etc/rc.d/init.d/network restart

    设置无密码登录(用于hadoop启动)

    cd ~ #进入当前用户的目录

    mkdir -p /root/.ssh #我们用的root用户

    cd ~/.ssh/

    ssh-keygen -t rsa #如有提示,直接按回车 cat id_rsa.pub >> authorized_keys # 加入授权

    安装jdk1.8并配置环境变量

    tar解压

    cp解压后的包到/usr/lib/java/(如果没有java目录就创建一下)

    vi /etc/profile,末尾添加如下内容:

    export JAVA_HOME=/usr/lib/java/jdk1.8.0_11

    export JRE_HOME=/usr/lib/java/jdk1.8.0_11/jre

    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

    export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    执行source /etc/profile使得环境变量生效

    验证是否成功,如下图

    安装hadoop2.7.4

    tar解压

    cp解压后的包到/usr/lib/hadoop/(如果没有hadoop目录就创建一下)

    设置hadoop-env.sh

    vi /usr/lib/hadoop/hadoop-2.7.4/etc/hadoop/hadoop-env.sh

    找到# The java implementation to use.这句话,在下面添加如下内容:

    #export JAVA_HOME=${JAVA_HOME}

    export JAVA_HOME=/usr/lib/java/jdk1.8.0_11

    export HADOOP_HOME=/usr/lib/hadoop/hadoop-2.7.4

    export PATH=$PATH:/usr/lib/hadoop/hadoop-2.7.4/bin

    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

    执行source /usr/lib/hadoop/hadoop-2.7.4/etc/hadoop/hadoop-env.sh,使得环境变量生效

    验证是否成功,如下图

    配置相关的xml文件

    vi /usr/lib/hadoop/hadoop-2.7.4/etc/hadoop/core-site.xml(hadoop全局配置)

    内容如下:

    <configuration>

    <!--指定namenode的地址-->

    <property>

    <name>fs.defaultFS</name>

    <value>hdfs://127.0.0.1:9000</value>

    </property>

    </configuration>

    vi /usr/lib/hadoop/hadoop-2.7.4/etc/hadoop/hdfs-site.xml(hdfs配置)

    内容如下:

    <configuration>

    <!--指定hdfs保存数据的副本数量-->

    <property>

    <name>dfs.replication</name>

    <value>1</value>

    </property>

    </configuration>

    cd /usr/lib/hadoop/hadoop-2.7.4/etc/hadoop

    cp mapred-site.xml.template mapred-site.xml

    vi mapred-site.xml(MapReduce的配置)

    内容如下:

    <configuration>

    <!--告诉hadoop以后MapReduce运行在YARN上-->

    <property>

    <name>mapreduce.framework.name</name>

    <value>yarn</value>

    </property>

    </configuration>

    vi yarn-site.xml(yarn配置)

    内容如下:

    <configuration>

    <!-- Site specific YARN configuration properties -->

    <!--nomenodeManager获取数据的方式是shuffle-->

    <property>

    <name>yarn.nodemanager.aux-services</name>

    <value>mapreduce_shuffle</value>

    </property>

    </configuration>

    格式化hdfs文件系统

    初次运行hadoop时一定要有该操作,命令如下:

    /usr/lib/hadoop/hadoop-2.7.4/bin/hadoop namenode -format

    执行期间可能需要确认是否继续,如果有,就输入y回车即可

    当你看到如下的内容时证明成功了

    如果看到的是exiting with status 1,那么请运行如下命令,之后在进行hdfs的格式化

    mkdir -pv /tmp/hadoop-root/dfs/name

    启动hadoop(hdfs和yarn)

    sh /usr/lib/hadoop/hadoop-2.7.4/sbin/start-all.sh

    sh /usr/lib/hadoop/hadoop-2.7.4/sbin/stop-all.sh #停止

    如果没有报错说明就成功了

    使用jps命令查看进程,如果出现下面的内容就说明确定以及肯定成功啦

    PS:如果修改了上面的xml文件需要重启服务哦

    使用web查看Hadoop运行状态

    http://你的服务器ip地址:50070/

    使用web查看集群状态

    http://你的服务器IP地址:8088

    可能会遇到的问题

    如果你多次进行了hdfs的格式化操作,可能会无法启动datanode,原因是id不一致,一般的解决方法为将namenode clusterID和datanode clusterID改成一样的就行了。修改的文件为/tmp/hadoop-root/dfs/下的name or data文件下的VERSION里的内容

  • 测试开始与结束通知邮件模板

    2018-01-25 10:34:30

    测试开始通知邮件模板

    Hi all,

    根据XXX项目的情况,将从2009-4-24 11:30 至 18:00进入第XX轮XX测试,测试结束前请开发人员不要修改测试环境,保持环境的稳定。

    测试计划如下:

    测试版本

    tags/xxxx

    测试环境

    登录地址:

    登录后访问: 

    hosts设置:

    测试范围

    1 回归上轮缺陷;

    2 进行本轮测试,除feed、通知内容之外的全部功能:

    测试策略

    本阶段测试完成后,立即进入缺陷评审,以确定后续工作计划.

    测试人员

    缺陷管理

    1. 欢迎大家参与测试

    为避免重复或无效,除测试和产品工程师在JIRA填报提案外,发现的问题请直接发信给xxx

    2. 缺陷分配

    -  需求无异议的缺陷直接分配给xxx,由他安排解决

    -  需要产品确认的缺陷分配给xxx,经确认确实是bug的提案,分配给xxx

    3. 缺陷填报

    -  缺陷库:JIRA中的“xxx-APP -缺陷库”

    -  版本选择:xxx 第一次集成测试

    -  组件选择:xxx

    测试结束通知邮件模板

    Hi all,

    XXX第X轮系统测试(之冒烟测试X)结束。

    测试版本

    xxx

    测试时间

    XX月XX日 XX:XX – XX月XX日 XX:XX

    测试范围

    测试人员

    测试工程师+产品工程师+客服人员

    测试结论

    本轮新报出的缺陷分析

    1、缺陷按优先级划分:

    本轮新发现X个提案,其中B级X个,C级X个,D级X个,E级X个;

    2、缺陷按模块划分:

    XX模块:XX个缺陷,其中C级缺陷X个;

    3、缺陷按状态划分:

    开放中:XX个;

    已解决:XX个

    4、高权重问题分析:

    影响说明(XXXX)  (列举相关提案)

    回归缺陷分析:

    本轮共验证提案X个:其中验证通过X个,重开X个(包括验证不通过后又被修改的提案)

    测试结论及风险

    [测试未通过]

    1.  当前系统尚未达到上线标准。

    2.  修改全部新发现的缺陷和重开缺陷,构建新的版本以进入第四轮系统测试。

    3. ……

    [测试通过]

    1.  当前系统可以达到上线标准。建议所有未验证、未修复提案均延迟处理,冻结代码。

    2.  发布版本:举例:xxxx

    3.  测试报告将于上线后给出。

    附件:缺陷列表

  • 湿货|小白学习大数据测试之Hive和Hbase

    2018-01-25 08:37:49

    作为初学者经常会对Hive和Hbase产生疑问,不知道两者是干啥的,有啥区别,总觉得都是存储数据的。其实他们还真是有本质区别的,请听我慢慢道来~

    Hbase是nosql数据库,以key-value形式存储数据的,主要用于海量数据的实时查询,比如日志信息。

    Hive是数据仓库,而非数据库,主要是用来解决数据处理、计算的。开发人员能够通过SQL来计算和处理HDFS上的结构化数据,适用于离线的批量数据计算

    两者一般都是配合使用的,为了方便大家理解我简单画了下数据流图。

    最后来一点小科普:

    数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。

    • OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。

    • OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

    像我们上面讲的Hbase就属于OLTP,Hive属于OLAP


  • 关于selenium webdriver chromedriver下载的问题

    2018-01-23 12:14:54

    引子


    经常有童鞋问这样的问题:

    1、chromedriver哪里可以下载?

    2、为啥我配好了chromedriver但chrome启动不了啊?


    解决方案


    今天我们就来解决他们。

    1、chromedriver官网下载地址:http://chromedriver.storage.googleapis.com/index.html

    这里有所有的版本,点击某个版本目录之后可以看到详细的内容,后缀为win32的就是windows下的,后缀为mac64的就是mac下的


    2、为啥我配好了chromedriver但chrome启动不了啊?

    因为你chromedriver和chrome的版本不一致啊。解决方法分三步走:

    • 查看自己chrome的版本,不要问我怎么看。。。。比如:我的是60

    • 访问chromedriver官网,一般版本越高的对应的chrome版本也越高,经过查找chrome 60对应的是chromedriver 2.33。如何确定的呢?其实你进入版本目录里点击notes.txt,里面就会告诉你的,如下图

      blob.png

    • 把对应版本的chromedriver复制到你的python根目录下就万事大吉了

  • python3.x操作csv文件的实战

    2018-01-16 22:49:49

    说明


    python3.x集成了对csv文件的操作,直接引入包即可,但python2.x则需要单独安装。


    实战


    1、读取csv文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #引入包
    import csv
    #打开文件
    csvfile = open('xiaoqiang.csv',newline='')
    #获得对象
    csvReader = csv.reader(csvfile)
    #读取内容并打印
    for content in csvReader:
      print(content)
       
    #关闭。这个经常有小伙伴忘了,今天在群里就有人遇到这个问题了
    csvfile.close()


    2、写入csv文件