一般來講,測試用例設計的時候可以采用二維的方式歸類: 橫向:根據對用的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)也是手機測試面臨的一大難題。下面介紹一下幾個手機性能測試相關的主要難題。