一般来讲,测试用例设计的时候可以采用二维的方式归类: 横向:根据对用的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等等。
大致结构和设计如下图:
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
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一样的开源操作系统对于多数用户来说更体验良好和更先进些。
当前有很大的趋势是转向
移动应用平台,
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 测试和制作测试报告截图)。
1. 下载 JDBC 驱动(sqljdbc4.jar)
2. 在 run-time setting 下的 classpath 把 JDBC 驱动引入
1 /* 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 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。
前言
在前一篇
随笔《大型网站系统架构的演化》中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个大型网站的轮廓,但想要掌握设计开发维护大型网站的技术,需要我们一步一步去研究实践。所以我打算写一个系列,从理论到实践讲述大型网站的点滴,这也是一个共同
学习的过程,希望自己能坚持下去。系列大概会分为两部分,理论和实践,理论部分尽量通俗易懂,也要讲一些细节。实践部分会抽取一些技术做实践,将方法、解决问题过程分享出来。
本文将讲述大型网站中一个重要的要素,性能。
什么是性能
有人说性能就是访问速度快慢,这是最直观的说法,也是用户的真实体验。一个用户从输入网址到按下回车键,看到网页的快慢,这就是性能。对于我们来说,需要去挖掘这个过程,因为这决定我们怎么去做性能优化。
这中间发生了什么?
用户访问网站的整个流程:用户输入网站域名,通过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前面,并且进行了合并。
一、添加固定注释
新建一TXT文档,将要添加的注释写在文档中
将文档名改为:ActionTemplate.mst
设置好后,在QTP中每次新建一个
测试就会自动添加固定的注释
二、调用外部vbs文件方法
1.将通用函数写在一个vbs文件中,以供其他脚本调用
2.调用外部VBS文件中的通用函数的方法(二选一即可),设置完后在QTP中直接使用函数名进行调用:
1)通过在QTP中设置:file-->settings-->Resource-->“添加VBS文件的路径“
2)在脚本中使用Executefile语句:Executefile "VBS文件路径"
代码缺陷和代码错误的最大区别是,代码缺陷不影响游戏编译,而代码错误编译都不通过。但是代码缺陷会影响游戏发布后产生的一系列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的页面在本地,打开后写的非常清晰,并且已经分好了类,他会告诉你那一行代码有缺陷,如何来修改你的代码。一不小心代码就一大堆隐患,赶快一个一个修改吧
引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上
文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本。
我们知道引用根据引用的类型不同有许多名称,如字符串引用,数组引用等等。
一、栈内存和堆内存
我们用数组来引出和解释这两个概念。
数组引用变量只是一个引用,这个引用可以指向任何有效的内存。
简单的理解就是,这个引用是用来存放数据地址的(数据地址指向数据在内存中的存储位置),在声明引用变量的时候,只是预留了一段空间来存储地址,但是还没有真正赋给这个引用变量一个地址,你赋给它哪个数据的地址,这个引用就指向这个地址(所以上面说“这个引用可以指向任何有效的内存”),那么你就可以通过这个引用访问该数据了。
如String[] p = new String(5);
p就是一个数组引用变量,这个数组含有5个元素。但是,实际数组元素被存储在堆(heap)中,而数组引用变量是被存在栈(stack)内存中,如下图:
也就是说,数组在内存中的存储实际是分别存储在两种不同性质的内存中:栈内存和堆内存。实际上,在Java中其它引用变量也是如此。
二、类的引用
考虑下面的自己建立的一个简单类:
{ 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
我会分享一系列在我开发生涯中积累的有用且容易实现的小技巧,本文是此系列的第一篇。
很多原因都可能导致网站运行缓慢,但这其中最常见的就是在
数据库查询耗时太多。目前,数据库查询可能在网页渲染过程中起着很重要的作用(网页上的内容总得从某处获取),但是有时候 一些不必要的亦或没有优化好的查询会影响网页渲染的速度。
例如:
查询的数据根本没有被使用
查询时未使用索引
单次查询可以实现的功能却做了多次查询
慢且复杂的查询
然而有一个简单的机制可以间接的预防并且修复此类问题:
用‘诊断框’在每一个网页显示数据库查询的次数以及消耗的总时间。
下面这个示例是我自己的一个网站(截图 或者 这个页面)底部的一个样例诊断块:
Request Details:
DB – Queries: 4, Time: 5.66 ms
我在所有开发项目以及生产环境(用我的账号登陆)中都加了类似的诊断框。对于一个大型网站来说,你很可能想当你从办公室或者VPN访问网站时启用诊断框。如果你愿意的话,诊断框中还可以增加一些更具体的信息(即将运行的查询语句以及其它过程花费的时间等等)。
好处
我可以及时的看到是否数据库导致了网页加载缓慢。 在生产环境做调试时这一点尤为有效,因为有些数据库查询在生产环境和开发环境中的表现截然不同。
当增加新功能的时候,我可以直观的感受到新增的数据查询是否轻量级的。这能帮助我在这个新功能带来的好处和它在访问数据时所消耗的时间这两者之间做一个 权衡。另外它还可以提醒我有些查询语句需要手动优化或者做一些缓冲。
当我参加的项目中使用了ORM框架时,它能告诉我ORM产生的查询语句是否正是我所期望的。
当删除一个功能或者做了一些数据缓冲,我可以通过它来确认查询数量是否如愿有所下降。
尾声
当然,这些点子不是我发明的,而且有些诊断模式几乎是每个大型网站的常见功能。如果你还没有用到它们,我强烈建议你花点时间去实现它们。有这样的一个‘诊断盒’不会使你的网站本身变快,但它能在开发人员之间激发一些更好的习惯,并且长期来看,它可能对你的网站的速度有巨大的影响!
移动应用日益普及,其重要性也日益增加,这已是不争的事实。优秀的用户体验将成为让用户驻足的原因之一。移动应用的
性能测试原理与传统桌面应用并无二致。但是,要全面测试移动应用的性能参数,测试人员需要理解各种移动应用的架构和它们与桌面应用的根本区别,例如带宽,处理器,屏幕尺寸等等。
前言
下文中说的
手机测试范围不包含短信和电话功能,而是指用于通信功能之外的其他应用。如今手机已经成为大多数人的日常必需品。手机的使用量逐年增加,运行在手机上的应用也层出不穷。除了处理通常的电话和短信之外,人们也开始用手机来拓展业务,联络亲友,扩展职业圈,玩游戏,打广告,买卖商品。手机和其他移动平台的重要性不容小觑,各大商家已经开始着手开发手机版的产品,抢占这块重要的细分市场。当今时代,手机软件和网站已经成为人们从事商业活动,提高雇员业绩和接触目标市场的主要途径。
以下统计数据显示在这个智能化的时代手机应用的重要性:
截止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)也是手机测试面临的一大难题。下面介绍一下几个手机性能测试相关的主要难题。