qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

谈谈测试用例的分类

一般来讲,测试用例设计的时候可以采用二维的方式归类:
  横向:根据对用的FDD进行分类。
  纵向:根据测试类型进行分类。
  横向
  横向的分类主要根据功能模块进行划分。根据产品的不同而有所不同,但是一般每一个测试用例,都能追溯到一个具体的功能需求。具有类似功能需求的测试用例会放在一起,形成一个功能模块的测试集。
  纵向
  纵向的分类主要根据测试的类型进行分类。主要有以下几种类型:
  BAT(Build Acceptance Test)
  这类测试用例属于最基本的测试用例。一般都不复杂,但都是非常重要的基本用例。BAT测试用例具有很高的稳定性。BAT的测试用例大概会占测试用例的总数的30%左右。BAT里面的测试用例,往往都是作为Regression测试用例的。BAT的测试用例用例一旦fail, 意味产品有重大缺陷,基本无法发布。对应的测试用例发现的问题,往往为P1的Bug
  Core(Core Regression Test)
  这类测试用例和BAT的测试用例很相似,代表核心功能,重要级别会比BAT要低些。测试用例会比较复杂,一般占整个总数的20%左右。一般Core集里面的测试用例fail, 对应的Bug也往往都是P1。Core和BAT比较难以划分,但是可以将不属于BAT和Func的测试用例划入到这个里面。
  Func
  这类测试用例往往是对BAT和Core的补充。BAT和Core执行的主要路径的测试用例,那么分支的测试用例往往都设计在Func里面,这类测试用例相对比较多和复杂,占整个测试用例的比例为50%左右。Func集里面测试用例fail, 对应的Bug往往为P2或者P3。
  其他一般还会有,UI, Security, Performance, Localization等等。
  大致结构和设计如下图:

posted @ 2014-10-30 09:16 顺其自然EVO 阅读(268) | 评论 (0)编辑 收藏

Linux与BSD有什么不同?

Linux和BSD都是免费的,开源的,类Unix系统。他们甚至使用很多相同的软件。他们看上去简直就像是一个操作系统,那么,它们有什么不同吗?
  其实,两者之间的不同,远远超出了我们下面提到的这些,尤其是在构建完整操作系统和许可授权的哲学思想上,更是相差甚远。通过这篇短文将可以简单的了解它们之间的不同。
  基础
  许多人所称的“Linux”实际上不是Linux。Linux从技术上说只是Linux内核,典型的Linux发行版则包括了Linux内核和许多软件。这是为什么Linux有时被称为GNU/Linux。事实上,许多在Linux上使用的软件同样也在BSD上使用。
  Linux和BSD都是类UNIX操作系统。我们可以通过阅读类UNIX操作系统历史发现Linux和BSD有不同的谱系。Linux是由LinusTorvalds在芬兰上大学的时候开发的。BSD则代表“BerkeleySoftwareDistribution,伯克利软件套件”,其源于对加州大学伯克利分校所开发的贝尔实验室UNIX的一系列修改,它最终发展成一个完整的操作系统,现在有多个不同的BSD分支。
  内核vs.完整操作系统
  严格的说,Linux是只是一个内核。制作Linux发行版所要做的工作就是,汇集那些创建一个完整Linux操作系统所需的所有软件,将它组合成一个像Ubuntu、Mint、Debian、RedHat或者是Arch这样的Linux发行版。有许多不同的Linux发行版。
  与此相反的是,BSD这个名字则代表其内核和操作系统。例如,FreeBSD提供了FreeBSD内核和FreeBSD操作系统。它是作为一个单一的项目维护的。换句话说,如果你想要安装FreeBSD,就只有一个FreeBSD可供你安装。如果你想要安装Linux,你首先需要在许多Linux发行版之间选择。
  BSD包括一个名为Ports的系统,它提供了一种安装软件包的方式。Ports系统包含了软件包的源代码,所以您的计算机如果想安装软件的话,则需要先编译他们。(如果您曾经使用过以前流行的Gentoo,有点类似那样。)不过,软件包也可以是预安装的二进制形式,以便你不需要花时间和系统资源编译他们就能运行。
  许可证
  许可证是典型的差异,虽然它不会对大多数人产生影响。Linux使用GNU通用公共许可证,即GPL。如果你修改了Linux内核,并将其分发,你就必须放出您的修改的源代码。
  BSD使用BSD许可证。如果你修改了BSD内核或发行版,并且发布它,你根本不需要必须发布其源代码。你可以自由地对你的BSD代码做任何你想做的事情,你没有义务发布的你修改的源代码,当然你想发布也行。
  两者都是开放源码的,但是以不同的方式。人们有时会陷入关于哪种许可证是“更自由”的辩论。GPL可以帮助用户以确保他们可以拥有GPL软件的源代码,并限制开发人员迫使他们开放代码。BSD许可证并不能确保用户可以拥有源代码,而是给开发人员选择是否公布代码的权利,即使他们想要把它变成一个闭源项目。
 BSD分支
  以下是通常认可的三个“主流”BSD操作系统:
  FreeBSD:FreeBSD是最受欢迎的BSD,针对高性能和易用性。它支持英特尔和AMD的32位和64位处理器。
  NetBSD:NetBSD被设计运行在几乎任何架构上,支持更多的体系结构。在他们的主页上的格言是”理所当然,我们运行在NetBSD上”。
  OpenBSD:OpenBSD为最大化的安全性设计的——这不仅仅它宣称的功能,在实践中也确实如此。它是为银行和其他重要机构的关键系统设计的。
  还有两个其他的重要BSD操作系统:
  DragonFlyBSD:DragonFlyBSD的设计目标是提供一个运行在多线程环境中的操作系统——例如,计算机集群。
  Darwin/MacOSX:MacOSX实际上基于Darwin操作系统,而Darwin系统基于BSD。它与其他的BSD有点不同,虽然底层内核和其他的软件是开源代码(BSD代码),但操作系统的大部分是闭源的MacOS代码)。苹果在BSD基础上开发了MacOSX和iOS,这样他们就不必写操作系统底层,就像谷歌在Linux基础上开发android系统一样。
  你为什么会选择BSD而不是Linux?
  Linux显然比FreeBSD更受欢迎。例如,Linux往往会比FreeBSD更早提供新硬件的支持。BSD有一个兼容包可用,使之能像大多数的其他软件一样原生的执行Linux二进制程序。
  如果您使用过Linux,FreeBSD不会让你感觉到太大的不同。如果把FreeBSD作为桌面操作系统,你也可以使用相同的GNOME,KDE或Xfce桌面环境,你也可以在BSD上使用Linux上的大多数的其他软件。有一点需要注意,FreeBSD不会自动安装的图形化桌面,所以你要花相对于Linux更多的心思来照顾你的BSD。BSD更守旧一些。
  FreeBSD的可靠性和稳定性也许更适合作为服务器的操作系统。而厂商也会选择BSD而不是Linux作为其操作系统,因为这样他们就不必放出他们修改的代码。
  如果你是一个PC桌面用户,你真的不需要太过在意BSD。你可能会喜欢Linux,因为它具有更先进的硬件支持,更容易安装,具有现代操作系统的特点。如果你关注服务器或嵌入式的设备,你可能会更喜欢FreeBSD。
  我们可能会听到一些人说他们在桌面电脑上使用FreeBSD,你当然也可能是其中之一!但像Ubuntu或Mint一样的开源操作系统对于多数用户来说更体验良好和更先进些。

posted @ 2014-10-17 15:35 顺其自然EVO 阅读(377) | 评论 (0)编辑 收藏

2014非常好用的开源Android测试工具

当前有很大的趋势是转向移动应用平台,Android 是最广泛使用的移动操作系统,2014 年大约占 80% 以上的市场。在开发 Android 应用的时候要进行测试,现在市场上有大量的测试工具。
  本文主要是展示一系列的开源 Android 测试工具。每个工具都会有相应的简短介绍,还有一些相关的资源。Android 测试工具列表是按照字母来排序的,最后还会介绍几个不是特别活跃的 Android 测试相关的开源项目。
  本文提到的开源 Android 软件测试工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
  Android Test Kit
  Android Test Kit 是一组 Google 开源测试工具,用于 Android 平台,包含 Espresso API 可用于编写简洁可靠的 Android UI 测试。
  AndroidJUnit4
  AndroidJUnit4 是一个让 JUnit 4 可以直接运行在 Android 设备上的开源命令行工具。
  OSChina URL: http://www.oschina.net/p/androidjunit4
  Appium
  Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驱动苹果的 UIAutomation 库和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 协议。Appinm 的 iOS 支持是基于 Dan Cuellar's 的 iOS Auto. Appium 同时绑定了 Selendroid 用于老的 Android 平台测试。
  OSChina URL: http://www.oschina.net/p/appium
  相关资源
  * Appium Tutorial
  * Android UI testing with Appium
  Calabash-android
  calabash-android 是一个基于 Cucumber 的 Android 的功能自动化测试框架。Calabash 允许你写和执行,是开源的自动化移动应用测试工具,支持 Android 和 iOS 原生应用。Calabash 的库允许原生和混合应用的交互测试,交互包括大量的终端用户活动。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 应用和桌面环境的交互跟触摸屏应用的交互是不同的。Calabash 专为触摸屏设备的原生应用提供 APIs。
  OSChina URL: http://www.oschina.net/p/calabash-android
  相关资源
  * A better way to test Android applications using Calabash
  * Calabash Android: query language basics
  Monkey
  Monkey 是 Google 开发的 UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。
  OSChina URL: http://developer.android.com/tools/help/monkey.html
  MonkeyTalk
  MonkeyTalk 是世界上最强大的移动应用测试工具。MonkeyTalk 自动为 iOS 和 Android 应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。同样的命令可以用在 iOS 和 Android 应用上。你可以记录一个平台的一个测试,并且可以在另外一个平台回放。MonkeyTalk 支持移动触摸和基于手势交互为主的移动体验。点击,拖拽,移动,甚至是手指绘制也可以被记录和回放。
  OSChina URL: http://www.oschina.net/p/monkeytalk
  相关资源
  * Using MonkeyTalk in AndroidStudio
  NativeDriver
  NativeDriver 是 WebDriver API 的实现,是原生应用 UI 驱动,而不是 web 应用。
  OSChina URL: http://www.oschina.net/p/nativedriver
 Robolectric
  Robolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。测试只需几秒就可以在工作站的 JVM 运行。Robolectric 处理视图缩放,资源加载和大量 Android 设备原生的 C 代码实现。Robolectric 允许你做大部分真实设备上可以做的事情,可以在工作站中运行,也可以在常规的 JVM 持续集成环境运行,不需要通过模拟器。
  OSChina URL: http://www.oschina.net/p/robolectric
  Additional resources
  * Better Android Testing with Robolectric 2.0
  Using Robolectric for Android testing – Tutorial
  RoboSpock
  RoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。
  OSChina URL: http://www.oschina.net/p/robospock
  相关资源
  * RoboSpock – Behavior Driven Development (BDD) for Android
  Robotium
  Robotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。
  OSChina URL: http://www.oschina.net/p/robotium
  相关资源
  * Robotium – Testing Android User Interface
  * Android user interface testing with Robotium – Tutorial
  UIAutomator
  uiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。
  OSChina URL: http://www.oschina.net/p/uiautomator
  相关资源
  * Automatic Android Testing with UiAutomator
  Selendroid
  Selendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。
  OSChina URL: http://www.oschina.net/p/selendroid
  相关资源
  * Mobile Test Automation with Selendroid
  * Road to setup Selendroid and create first test script of android application
  * Up and running with: Selendroid
  一些停止维护的 Android 测试工具
  一些几乎没有继续维护的开源 Android 测试工具项目(至少是最近几个月都没有更新的项目)。
  Emmagee
  Emmagee 是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。Emmagee 同时还提供非常酷的一些特性,比如定制间隔来收集数据,使用浮动窗口呈现实时进程状态等。
  OSChina URL: http://www.oschina.net/p/emmagee
  Sirocco
  Scirocco(scirocco-webdriver) 是开源的应用自动化测试工具,可以从 Eclipse 访问必要的测试设备。Scirocco 提供自动化的 Android 应用测试功能,代替手工测试。Scirocco 支持谷歌的 NativeDriver,把 AndroidDriver 作为主要的测试库。Scirocco 包括三个部分:NativeDriver,AndroidDriver,scirocco 插件(一个 Eclipse 插件;可以自动执行 scenario 测试和制作测试报告截图)。

posted @ 2014-10-17 15:34 顺其自然EVO 阅读(2492) | 评论 (0)编辑 收藏

LoadRunner SQL 2008

 1. 下载 JDBC 驱动(sqljdbc4.jar)
  2. 在 run-time setting 下的 classpath 把 JDBC 驱动引入
1 /*
2  * LoadRunner Java script. (Build: _build_number_)
3  *
4  * Script Description:
5  *
6  */
7
8 import lrapi.lr;
9 import java.io.*;
10 import java.sql.Connection;
11 import java.sql.DriverManager;
12 import java.sql.ResultSet;
13 import java.sql.ResultSetMetaData;
14 import java.sql.SQLException;
15 import java.sql.Statement;
16 import lrapi.web;
17
18 public class Actions
19 {
20     int sum = 0;
21     int columnCount = 0;
22     String conURL = "jdbc:sqlserver://192.168.1.99:1433;DatabaseName=JingPai110_test_Data";
23     String user = "jingpai2014_99";
24     String password = "jingpai2014_99";
25     Statement stat;
26     ResultSet result;
27     Connection conn;
28
29     public int init() throws Throwable {
30         lr.think_time(5);
31         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
32         System.out.println("驱动加载完成...");
33
34         // 连接数据库
35         lr.think_time(5);
36         conn = DriverManager.getConnection(conURL, user, password);
37         lr.think_time(5);
38         stat = conn.createStatement();
39         System.out.println(stat);
40         return 0;
41     }//end of init
42
43
44     public int action() throws Throwable {
45         lr.think_time(5);
46         // 定义事务开始
47         lr.start_transaction("query");
48         result = stat.executeQuery("SELECT * FROM Users");
49         ResultSetMetaData rsmd = result.getMetaData();
50         columnCount = rsmd.getColumnCount();
51         System.out.println("结果集的列数: " + columnCount);
52
53         if (columnCount == 0) {
54             lr.end_transaction("query", lr.FAIL);
55         } else {
56             lr.end_transaction("query", lr.PASS);
57         }
58         return 0;
59     }//end of action
60
61
62     public int end() throws Throwable {
63         result.close();
64         stat.close();
65         conn.close();
66         return 0;
67     }//end of end
68 }
  注意:
  1. loadrunner11 支持的JDK版本为1.6 32位(我尝试使用1.7JDK 32位也是不行的)
  2. Error: Java VM internal error:Error Loading javai.dll. 错误解决:
  选择Use specified JDK,在JDK后面贴上你的java jdk地址,例如:D:\Program Files\Java\jdk1.6.0_10,点击OK即可。
  3. Error: at java.lang.ClassLoader.defineClass1(Native Method)
  解决:loadrunner在编译Java Vuser的时候会加载我们配置环境变量中的path,如果path中有不同版本的java jdk就会造成冲突,删除path中的其它版本的jdk路径,重启loadrunner。

posted @ 2014-10-17 15:30 顺其自然EVO 阅读(396) | 评论 (0)编辑 收藏

掌握设计开发维护大型网站的技术之性能

 前言
  在前一篇随笔《大型网站系统架构的演化》中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个大型网站的轮廓,但想要掌握设计开发维护大型网站的技术,需要我们一步一步去研究实践。所以我打算写一个系列,从理论到实践讲述大型网站的点滴,这也是一个共同学习的过程,希望自己能坚持下去。系列大概会分为两部分,理论和实践,理论部分尽量通俗易懂,也要讲一些细节。实践部分会抽取一些技术做实践,将方法、解决问题过程分享出来。
  本文将讲述大型网站中一个重要的要素,性能。
  什么是性能
  有人说性能就是访问速度快慢,这是最直观的说法,也是用户的真实体验。一个用户从输入网址到按下回车键,看到网页的快慢,这就是性能。对于我们来说,需要去挖掘这个过程,因为这决定我们怎么去做性能优化。
  这中间发生了什么?
  用户访问网站的整个流程:用户输入网站域名,通过DNS解析,找到目标服务器IP,请求数据经互联网达到目标服务器,目标服务器收到请求数据,进行处理(执行程序、访问数据库、文件服务器等)。处理完成,将响应数据又经互联网返回给用户浏览器,浏览器得到结果进行计算渲染显示给用户。
  我们把整个过程,分为三段路径:
  1、第一段在用户和浏览器端,主要负责发出用户请求,以及接受响应数据进行计算渲染显示给用户;
  2、第二段在网络上,负责对请求数据、响应数据的传输;
  3、第三段在网站服务器端,负责对请求数据进行处理(执行程序、访问数据库、文件等),并将结果返回;
  第一路径
  第一路径花费的时间包括输入域名发起请求的时间和浏览器收到响应后计算渲染的时间。
  输入域名发起请求,实质过程是:
  1、用户在浏览器输入要访问的网站域名;
  2、本地DNS请求网站授权的DNS服务器对域名进行解析,并得到解析结果即IP地址(并将IP地址缓存起来)。
  3、向目标IP地址发出请求。
  从这个过程我们可以看到,优化的地方主要是减少DNS解析次数,而如果用户浏览器设置了缓存,则再第二次访问相同域名的时候就不会去请求DNS服务器,直接用缓存中的IP地址发出请求。因此这个过程主要取决于浏览器的设置。现在主流的浏览器默认设置了DNS的预取功能(DNS Prefetch),当然你也可以主动告知浏览器我的网站需要做DNS预取:
  <meta http-equiv=”x-dns-prefetch-control” content=”on” />
  浏览器将数据进行计算渲染的过程:
  1、浏览器解析响应数据;
  2、浏览器创建DOM树;
  3、浏览器下载CSS样式,并应用到DOM树,进行渲染;
  4、浏览器下载JS文件,开始解析执行;
  5、显示给用户。
  从这个过程,我们可以找出不少可以优化的地方。首先我们可以尽量控制页面大小,使得浏览器解析的时间更短;并且将多个CSS文件、JS文件文件合并压缩减少文件下载的次数和大小;另外注意将CSS放在页面前面,JS访问页面后面,这样便于页面首先能渲染出来,再执行js脚本,对于用户来说有更好的体验。最后我还可以设置浏览器缓存,下次访问时从缓存读取内容,减少http请求。
  <meta http-equiv=”Cache-Control” content=”max-age=5″ />
  该代码说明了浏览器启用了缓存并在5秒内不会再次访问服务器。注意缓存的设置需要结合你的业务特性来适当配置。
  以下是京东商城的HTML简图:
  css样式放在html前面,并且进行了合并。
 大多数的JS文件放在页尾。
  第二路径
  第二路径在网络上,花费的时间同样包括请求数据的传输时间和响应数据的传输时间,这个两个时间取决于数据传输的速度,这里我们要讲一个名词“带宽”。什么是带宽,我们经常说带宽10M,20M是什么意思?我的带宽20M,这意味着什么?我们知道带宽速度分为上行、下行速度,也就是上传和下载的速度。带宽20M对于用户来说则是下载速度20M(20×1024×1024比特率),换算成字节20M/8=2.5M。也就是说20M的带宽下载速度理论可达2.5M/s,而对于家庭用户而言上传速度一般比下载速度小的多,大约是不到十分之一。而对于网站服务器(企业用户)来说,则不然,一般上行速度等于下载速度。这也是运营商根据实际需求分配的,毕竟用户的主要需求是下载数据,而不是上传数据。
  整个流程从传输方式看就是:用户发送请求数据(上传),网站服务器接受请求数据(下载),网站服务器返回响应数据(上传),用户接受响应数据(下载)。对于用户来说,上传数据是很小的(Url参数),而下载数据是较大的(响应数据);对于服务器来说,下载数据是很小的(url参数),上传数据是较大(响应数据)。理解了这个,我们可以解释为什么有时用户反映为什么自己的带宽足够,但打开某些网站仍然很慢,就是因为尽管用户的下载速度很快,但网站服务器的上传速度很慢,这就像一个抽水管和一个出水管,不管抽水管再大,但出水管很小,同样抽到的水量是有限的。了解了这个原理我们来看怎么提高数据传输的速度,首先用户的上传、下载速度我们是无法决定的,我们能决定的是网站服务器的上传、下载速度,所以我们可以做的是适当的增加服务器带宽(带宽是很贵的,盲目的增加只会增加不必要成本)。购买合适的带宽需要根据网站业务特性、规模以及结合运维人员的经验来选择。通常可以考虑的算法,即根据一次响应数据的大小,乘以PV数,除以对应的高峰时间段,从而大致估算出网站带宽的需求。
  下面我们继续进一步研究第二路径:
  上图表示用户访问网站服务器时网络的大致情况,从图上可以看出假设网站服务器从电信网络接入,而用户A作为电信的宽带用户,则可以通过电信骨干网快速的访问到网站服务器。用户B,用户C作为移动和联通用户需要通过运营商的互联互通经过较长路径才能访问到服务器。
  针对这种情况,我们可以采取以下方法来优化:
  1、在各运营商发达的地区的IDC(互联网数据中心,可以理解成机房)部署网站服务器,各运营商的用户即可通过各自的骨干网访问服务器。
  2、购买代理服务,也就是原来联通用户需要通过联通骨干网——>联通互联互通路由器——>电信骨干网——>网站服务器的过程。通过代理服务,代理服务器直连到电信骨干网,访问网站服务器。
  2、在主要地区城市购买CDN服务,缓存对应的数据,用户可先从最近的CDN运营商获取请求数据。
  第三路径
  第三路径主要是网站服务器内部处理的过程,当中包括执行程序、访问文件、数据库等资源。
  这是对于我们来说最可以发挥的地方:
  1、使用缓存,根据需要使用本地缓存或分布式缓存;
  2、使用异步操作,这种方式不仅可以提高性能,也提高了系统的扩展性;
  3、代码优化;
  4、存储优化;
  缓存
  如果缓存数据较少,可以利用OSCache实现本地缓存:
  当缓存数据过多时,利用Memcached实现分布式缓存:
  Memcached实现分布式缓存,缓存服务器之间是互不通信的,也就是我们可以方便的通过增加Memcached服务器对系统进行扩展。
  异步操作
 使用同步请求的方式,在高并发的情况下,会对数据库造成很大的压力,也会让用户感觉响应时间过长。异步请求方式,则可以快速的对用户做出响应,而具体的数据库操作请求,则通过消息队列服务器发送给数据库服务器,做具体的插入操作。插入操作的结果则已其他方式通知客户端。例如一般在订票系统当中,出票行为就是异步完成,最终的出票结果会以邮件或其他方式告知用户。
  代码优化
  这里就不在详细描述,另一篇随笔《怎样编写高质量的java代码》对代码质量和风格做过大致的介绍,有兴趣可以看一下。
  存储优化
  大型网站中海量的数据读写对磁盘造成很大压力,系统最大的瓶颈还是在磁盘的读写。可以考虑使用磁盘阵列、分布式储存来改善存储的性能。
  性能的指标和测试
  上面通过解析用户访问网站的过程来思考怎么提高用户感知的性能,对于用户来言性能就是快和慢。但对于我们来说,不能这样简单描述,我们需要去量化他,用一些数据指标去衡量它。这里讲到几个名词:响应时间、并发量、吞吐量。
  响应时间:就是用户发出请求到收到响应数据的时间;
  并发量:就是系统同时能处理多少用户请求;
  吞吐量:就是单位时间内系统处理的请求数量;
  为了通俗的了解这三个概念,我们以高速公路的收费站为例子:响应时间是指一辆车经过收费站的时间,也就是车辆从进入收费站、付钱、开闸、离开收费站的时间;并发量是指这个收费站同时能通行多少辆车,可以理解为收费站的出口数量。吞吐量是指:在一段时间内,这个收费站通往了多少了车。
  这个例子不晓得恰不恰当。
  对于性能测试来说,基本也是围绕这些方面来测试,下图说明了性能测试的过程:
  左图表示响应时间和并发用户量的二维坐标图,从图上可以看出,并发用户量在一定量增加时,响应时间很短,并且没有太大的起伏,这表示系统目前处于日常运行期,可以很快处理用户请求(A点之前);随着并发量的增加,系统处于请求高峰期,但仍然可以有序的处理用户请求,响应时间较日常有所增加(A、B之间);当并发量增加到一定数量时,超过了系统的负载能力,系统处于濒临崩溃的边缘(B、C之间),响应时间严重过长,直到系统崩溃。
  右图表示吞吐量与并发用户量的二维坐标图,可以看出,随着并发用户量的增加,吞吐量逐渐增加;在并发量到达一定量时,由于系统处理能力达到最大,吞吐量增加放缓;当并发量超过系统负载时(E点),系统处理能力开始下降,不能再请求增加的用户请求,吞吐量反而降低。
  小结
  本文通过用户访问网站的过程,分析了三个路径过程中提高性能的想法和手段,最后介绍了描述性能的指标,并对性能测试做了简要说明。

posted @ 2014-10-17 15:29 顺其自然EVO 阅读(347) | 评论 (0)编辑 收藏

QTP书写程序技巧

一、添加固定注释
  新建一TXT文档,将要添加的注释写在文档中
  将文档名改为:ActionTemplate.mst
  将文件放到QTP安装目录的dat文件夹中
  设置好后,在QTP中每次新建一个测试就会自动添加固定的注释
  二、调用外部vbs文件方法
  1.将通用函数写在一个vbs文件中,以供其他脚本调用
  2.调用外部VBS文件中的通用函数的方法(二选一即可),设置完后在QTP中直接使用函数名进行调用:
  1)通过在QTP中设置:file-->settings-->Resource-->“添加VBS文件的路径“
  2)在脚本中使用Executefile语句:Executefile "VBS文件路径"

posted @ 2014-10-17 15:29 顺其自然EVO 阅读(481) | 评论 (0)编辑 收藏

静态自动检查代码缺陷与隐患

代码缺陷和代码错误的最大区别是,代码缺陷不影响游戏编译,而代码错误编译都不通过。但是代码缺陷会影响游戏发布后产生的一系列BUG。。我今天无意间逛外国论坛发现的一个方法,使用了一下感觉挺给力的第一时间分享给大家。 下载下来以后,它是一个文件夹把整个文件夹拷贝在你unity的工程里面就行了。
  Unity 3d Gendarme Plugin:https://bitbucket.org/kzoabi/unity3d-gendarme-plugin
  然后下载最新的mono 它是跨平台的,我用的是MAC所以我下载的就是一个 dmg文件, 下载完毕后安装完成即可。
  http://www.go-mono.com/mono-downloads/download.html
  如下图所示, 选择Assets->Gendarme Report Level 选项,将弹出Gendarme界面,你可以选择它的优先级,然后点击Start按钮。如果报错的话,请把Assets文件夹下的gendarme文件夹和gendarme-report.html文件删除。
  如果你的项目比较大的话需要耐心的等待一下,大概1分钟左右。Report生成完毕后会弹出如下窗口,点击Open Report按钮即可。
  如下图所示,他会生成一个Html的页面在本地,打开后写的非常清晰,并且已经分好了类,他会告诉你那一行代码有缺陷,如何来修改你的代码。一不小心代码就一大堆隐患,赶快一个一个修改吧

posted @ 2014-10-17 13:00 顺其自然EVO 阅读(346) | 评论 (0)编辑 收藏

Java学习笔记之深入理解引用

引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本。
  我们知道引用根据引用的类型不同有许多名称,如字符串引用,数组引用等等。
  一、栈内存和堆内存
  我们用数组来引出和解释这两个概念。
  数组引用变量只是一个引用,这个引用可以指向任何有效的内存。
  简单的理解就是,这个引用是用来存放数据地址的(数据地址指向数据在内存中的存储位置),在声明引用变量的时候,只是预留了一段空间来存储地址,但是还没有真正赋给这个引用变量一个地址,你赋给它哪个数据的地址,这个引用就指向这个地址(所以上面说“这个引用可以指向任何有效的内存”),那么你就可以通过这个引用访问该数据了。
  如String[] p = new String(5);
  p就是一个数组引用变量,这个数组含有5个元素。但是,实际数组元素被存储在堆(heap)中,而数组引用变量是被存在栈(stack)内存中,如下图:
  也就是说,数组在内存中的存储实际是分别存储在两种不同性质的内存中:栈内存和堆内存。实际上,在Java中其它引用变量也是如此。
  二、类的引用
  考虑下面的自己建立的一个简单类:
class Test
{
private int a;
Test()
{
a = 0;
}
public void set(int b)
{
a = b;
}
public void showInfo()
{
System.out.println("The value of a is :" + a);
}
}
  假如我们有如下语句:
  Test m = new Test()
  我们常常看到有这样的说法:m是一个对Test类的引用变量,感觉好难理解,怎么实例化一个类就成了引用呢?让我们一步一步来看这个实例化过程。
  我们把上面语句拆开成下面语句:
  Test m;
  m = new Test();
  我们知道,Java中除了内置基本类型,其他类型全部是引用,Test当然不是内置基本类型,所以Test m 就是建立了一个指向Test类的引用:
  Test m是声明了一个Test类的引用变量m,就是告诉编译器要预留一部分栈内存给m,我会用m来存储一个地址指向存储有Test类对象存储单元,注意这个Test类对象和上面讲的数组元素一样,是存储在堆内存中的。但Test m也只是声明而已,但是指向哪一个Test类对象,目前还不知道,因为我们还没有赋给它一个Test 类对象的地址,它怎么可能知道指向哪儿?
  m = new Test() 就是来给m指明方向的,new Test()构造了一个Test类对象,系统会给这个对象分配一定的内存空间留给这个对象存储自己的数据,通过运算m = new Test(),把这个新建的Test类对象在内存(堆内存)中的地址赋给m,于是m就知道它应该指向哪儿了:
  总结出以下几点:
  Java除了内置基本数据类型(int , double ,float等等)是值传递,其他类型的都是引用
  声明一个类型的引用时,只是为引用变量预留了一个存储地址空间,该引用变量可以指向任何有效的内存单元
  Java大量使用引用的方式可以减少值传递过程中复制数据的开销,提高效率。

0
0
 

posted @ 2014-10-17 12:53 顺其自然EVO 阅读(286) | 评论 (0)编辑 收藏

小技巧:显示数据库查询耗时,改善开发者习惯

 我会分享一系列在我开发生涯中积累的有用且容易实现的小技巧,本文是此系列的第一篇。
  很多原因都可能导致网站运行缓慢,但这其中最常见的就是在数据库查询耗时太多。目前,数据库查询可能在网页渲染过程中起着很重要的作用(网页上的内容总得从某处获取),但是有时候 一些不必要的亦或没有优化好的查询会影响网页渲染的速度。
  例如:
  查询的数据根本没有被使用
  查询时未使用索引
  单次查询可以实现的功能却做了多次查询
  慢且复杂的查询
  然而有一个简单的机制可以间接的预防并且修复此类问题:
  用‘诊断框’在每一个网页显示数据库查询的次数以及消耗的总时间。
  下面这个示例是我自己的一个网站(截图 或者 这个页面)底部的一个样例诊断块:
  Request Details:
  DB – Queries: 4, Time: 5.66 ms
  我在所有开发项目以及生产环境(用我的账号登陆)中都加了类似的诊断框。对于一个大型网站来说,你很可能想当你从办公室或者VPN访问网站时启用诊断框。如果你愿意的话,诊断框中还可以增加一些更具体的信息(即将运行的查询语句以及其它过程花费的时间等等)。
  好处
  我可以及时的看到是否数据库导致了网页加载缓慢。 在生产环境做调试时这一点尤为有效,因为有些数据库查询在生产环境和开发环境中的表现截然不同。
  当增加新功能的时候,我可以直观的感受到新增的数据查询是否轻量级的。这能帮助我在这个新功能带来的好处和它在访问数据时所消耗的时间这两者之间做一个 权衡。另外它还可以提醒我有些查询语句需要手动优化或者做一些缓冲。
  当我参加的项目中使用了ORM框架时,它能告诉我ORM产生的查询语句是否正是我所期望的。
  当删除一个功能或者做了一些数据缓冲,我可以通过它来确认查询数量是否如愿有所下降。
  尾声
  当然,这些点子不是我发明的,而且有些诊断模式几乎是每个大型网站的常见功能。如果你还没有用到它们,我强烈建议你花点时间去实现它们。有这样的一个‘诊断盒’不会使你的网站本身变快,但它能在开发人员之间激发一些更好的习惯,并且长期来看,它可能对你的网站的速度有巨大的影响!

posted @ 2014-10-17 12:50 顺其自然EVO 阅读(417) | 评论 (0)编辑 收藏

移动应用APP性能测试白皮书

移动应用日益普及,其重要性也日益增加,这已是不争的事实。优秀的用户体验将成为让用户驻足的原因之一。移动应用的性能测试原理与传统桌面应用并无二致。但是,要全面测试移动应用的性能参数,测试人员需要理解各种移动应用的架构和它们与桌面应用的根本区别,例如带宽,处理器,屏幕尺寸等等。
  前言
  下文中说的手机测试范围不包含短信和电话功能,而是指用于通信功能之外的其他应用。如今手机已经成为大多数人的日常必需品。手机的使用量逐年增加,运行在手机上的应用也层出不穷。除了处理通常的电话和短信之外,人们也开始用手机来拓展业务,联络亲友,扩展职业圈,玩游戏,打广告,买卖商品。手机和其他移动平台的重要性不容小觑,各大商家已经开始着手开发手机版的产品,抢占这块重要的细分市场。当今时代,手机软件和网站已经成为人们从事商业活动,提高雇员业绩和接触目标市场的主要途径。
  以下统计数据显示在这个智能化的时代手机应用的重要性:
  截止2011年底,全球共有87%的人口(60亿)拥有手机,其中10亿拥有智能手机
  22%手机用户每个月至少用手机上网一次
  34%的美国用户和28%欧洲用户在手机上使用超过一种移动应用
  预计到2014年,手机上网的总量将超过电脑
  尼尔森2012年的报道显示,智能手机64%的时间在运行多种应用程序
  2011年,全球移动应用下载量约300亿
  91%美国智能手机用户平均每天花费2.7小时访问社交应用程序,是他们平均吃饭时间的两倍,睡眠时间的三分之一
  6亿Facebook用户中,三分之一用户通过手机访问,1.65亿Twitter用户中,一半的用户通过移动设备登录,而大约每天有2亿Youtube用户通过移动设备登录
  移动应用的使用量和重要性与日俱增,用户体验的要求也越来越高。与桌面程序相比,移动应用耗电小,速度慢,但手机用户却希望享受到与桌面程序同样的加载速度。
  我们在此将探讨移动应用的重要性,移动app的性能测试的难点,移动app与桌面应用的异同,移动app的种类,对移动app进行压力测试和性能调优的基本方法。
  移动应用的类别
  移动应用按架构可分成三大类。要做好性能测试的, 有必要了解各种应用的种类和内部架构。我们来分别介绍一下各类app的基本情况。
  本地应用
  需要从网上商店下载并安装在特定移动设备上的可划分到这一类。这类应用由特定编程语言(例如安卓系统上用的Java和iOS系统上用的Object-C)编写,结合特定移动设备的开放API。用户将这种应用安装到移动设备上之后,无需连接到互联网就能使用。游戏应用程序和从网上商店下载的app就是很好的例子。
  联网应用
  通过移动设备上的浏览器访问的应用叫做联网应用。这类应用是通过网络技术如HTML,JQuery和JavaScript开发的。热门社交网站,如Facebook和Gmail等都专门开发了基于移动设备的联网应用,倍受移动用户亲睐。
  混合应用
  联网应用和本地应用的结合被称作混合型应用。在这类应用里,联网应用被内嵌到本地移动应用中。用户界面像本地应用,内容却需要联网加载。安装在移动设备上的Facebook,Linkedin和Twitter应用是这类“本地界面,联网内容”的最佳典范。

提高移动应用性能的重要性
  随着手机使用量的增加,手机性能的重要性也日益显著。手机用户对性能期望非常高,希望手机应用能像在电脑上运行那么快。据统计:
  71%用户希望在手机上打开网页能同电脑上一样快
  5秒钟被认为是用户能忍受的最长响应时间
  如果响应时间超过5秒,74%上网用户和50%移动应用用户会放弃
  三分之一失望的用户会转向竞争对手的应用
  通常,手机用户会尝试两次,如果第三次依然出现同样问题,半数人再也不会使用该应用。比起桌面程序,手机应用的架构更加复杂,可用资源相对更少,提高和维持快速的响应时间比桌面程序更困难。
  测试移动应用的挑战
  做好性能测试,从来就不是一件简单容易的事。搭建与生产环境相同的性能测试环境一直是做性能测试的第一步,也是很重要的一步。然而,由于其复杂的架构,测试手机程序和网站显得更加困难。要覆盖到不同种类(联网,本地和混合应用)、不同平台(iOS,安卓等等)和不同网络环境(Wifi,2G,3G,3G+,4G LTE)也是手机测试面临的一大难题。下面介绍一下几个手机性能测试相关的主要难题。

posted @ 2014-10-17 12:25 顺其自然EVO 阅读(368) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 31 32 33 34 35 36 37 38 39 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜