總結:
1、配置
Java環境變量時需要注意設置的路徑需要和JDK安裝的路徑一樣
2、配置Java環境變量時需要注意JDK的版本號
3、配置環境變量時多個變量以分號隔開,但是確保是英文輸入法的分號
1、檢測負載機是否可以被調用,檢測負載機的ip是否能被ping通
2、當負載機的ip不能ping通時,有可能是防火墻攔截了,可以檢測防火墻是否是啟用狀態,如果是暫時設置禁用防火墻
3、測試的數據調用文件應該放在負載機上,并且在控制中心設置正確的數據訪問路徑
Jmeter測試工具安裝步驟:
1、安裝Jmeter
下載Jmeter工具包 并把工具包放到C盤下
http://jmeter.apache.org/download_jmeter.cgi
2、安裝JDK
下載Java的JDK并安裝,一般會安裝在C:\Program Files\Java目錄下
http://java.sun.com/javase/downloads/index.jsp
3、Java環境變量配置
桌面上 右鍵選中計算機--->屬性--->高級系統設置--->環境變量設置
在“系統變量”--->“新建”, 在變量名中輸入:CLASSPATH,變量值中輸入:C:\Program Files\Java\jdk1.6.0_10\lib\dt.JAR; C:\Program Files\Java\jdk1.6.0_10\lib\TOOLS.JAR; C:\Program Files\Java\jdk1.6.0_10\BIN;再按“新建”,在變量名中輸入:JAVA_HOME,變量中輸入:C:\Program Files\Java\jdk1.6.0_10;修改PATH變量,添加%JAVA_HOME%/bin;然后確定即可
4、Jmeter環境變量配置
桌面上 右鍵選中計算機--->屬性--->高級系統設置--->環境變量設置
在“系統變量”--->“新建”, 在變量名中輸入:JMETER_HOME,變量值中輸入:C:\jakarta-jmeter-2.3.4 ,再修改CLASSPATH變量,變量值中添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;% JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar; 然后確定即可
通常
Java有三種編譯方式,編譯方式不同,那么得到的.class的大小也不同。
1)默認編譯方式:javac A.java
2) 調試編譯方式:javac -g A.java
3) 代碼編譯方式:javac -g:none A.java
案例如下:類A
public class A{ public static void main(String args[]){ for(int i=0;i<100000;i++){ A a = new A(); } } } |
通過上面這三種編譯方式,得到的.class文件大小分別為:
默認編譯方式:322字節
調試編譯方式:453字節
代碼編譯方式:238字節
三種編譯方式對應的.class文件的內容,分別如下:
默認編譯方式:代碼(Code)、源文件信息(SourceFile Infomation)、代碼行序列表(LineNumberTable)。
調試編譯方式:代碼(Code)、源文件信息(SourceFile Infomation)、代碼行序列表(LineNumberTable)、本地變量表(LocalVariableTable)。
代碼編譯方式:代碼(Code)。
由于javac -g:none A.java這種方式編譯的內容最少,所以.class占用的空間也就最小。
由于javac -g A.java這種方式編譯的內容最多,所以.class占用的空間也就最大。
而javac A.java這種方式編譯的內容居中,所以.class占用的空間也就居中。
使用selenium 的python包,然后實現了簡單的自動登錄和查看所需的頁面。
腳本寫起來很簡單,需要會使用瀏覽器的debug功能,分析下頁面結構。這個例子只是簡單參考,應該無法運行,因為是內部系統。。
# -*- coding: utf-8 -*- #get_info_of_working.py python2.7.x #orangleliu@gmail.com 2014-04-24 ''''' |
用來自動打開查詢工時的界面 直接看到自己最近的打卡情況
''' from selenium import webdriver from selenium.webdriver.common.keys import Keys def login_system(driver): ''''' |
登陸到考勤管理系統
''' login_url = 'http://att.xx.com/' username = 'zhizhi.liu' password = '1234' driver.get(login_url) driver.find_element_by_id("username").clear() driver.find_element_by_id("username").send_keys(username) driver.find_element_by_id("password").clear() driver.find_element_by_id("password").send_keys(password) driver.find_elements_by_tag_name("form")[0].submit() driver.get('http://att.xx.com/TRecordList.action') if __name__ == "__main__": driver = webdriver.Firefox() login_system(driver) |
安裝前準備 需要下載xampp 與 testlink
一、 安裝前準備
本安裝手冊所有安裝步驟都基于WINDOWS操作系統;我使用的Windows7系統
二、 安裝XMAPP
當前下載版本:xampp-win32-1.7.4-VC6-installer.exe, 下載地址:http://www.apachefriends.org/zh_cn/xampp-windows.html
1. 點擊 安裝包,進行安裝XAMPP;
2. 在彈出的對話框中選取安裝路徑;
3. 安裝完畢后,進入安裝路徑找到”xampp”文件夾;首先點擊xampp_start圖標;待對話框加載完畢后;點擊”xampp-control”圖標;
注:如果apache與MYSQL啟動不成功,可能是80端口與3306端口被占用;
解決方法一:將暫用此端口的進程關閉
1.打開運行-》輸入CMD 進入命令行模式
2.在命令行模式中輸入netstat -a -n -o
3.查看0.0.0.0:80所對應的PID(即進程號)
4.按CTRL+SHIFT+ESC鍵打開WINDOWS任務管理器,選擇進程標簽,然后在菜單欄的查看-》選擇列里勾上PID(進程標識符),根據第三部所查到的PID的進程,KILL掉該進程,再重新安裝APACHE即可
還有你修改了, apache/conf/httpd listen12.34.56.78:80 改成(其他)例如8080的話,那么在瀏覽器里訪問就要加,不能是localhost:8080
**使用說明:
** netstat -ano 查看端口使用情況
**或者 netstat -ano|findstr 80
**C:\Documents and Settings\cjx>netstat -ano|findstr 80
安裝時請注意,選擇要安裝的服務,默認不安裝;
4. 為MYSQL設置密碼;打開IE瀏覽器;輸入http://127.0.0.1/xampp;進入頁面,選擇中文;
進入XAMPP配置頁面;選擇【安全】列表,在點擊右側鏈接;
輸入MYSQL SuperUser密碼,輸入成功后,點擊【改變密碼】按鈕;
注:記錄密碼的保密屬性是cookie還是。。。
三、 配置testlink
TL-1.9,下載你需要用的TestLink版本,寫該文檔的時候,TestLink的版本是1.9.2,下載地址:http://sourceforge.net/projects/testlink/files/TestLink%201.9/TestLink%201.9.3/
在windows下,發現該文檔的打包方式是Linux下的方式Testlink1.9.2.tar.gz,用Winzip工具解壓兩次,就可以看到Testlink1.9.2.tar.gz--->Testlink1.9.2.tar--->TestLink1.9.2
1、 將”testlink”文件夾復制到”\xampp\htdocs\”目錄下;
注意: 將后面的版本號去掉,TestLink---1.9.2變成TestLink
2、 打開IE瀏覽器,輸入:http://IP地址:端口號/testlink(如:http://localhost:80/testlink); 在頁面中點擊“new installation”;
進入配置頁面,配置參數如下圖:
上述參數配置好后,點擊頁面中【Process Tesklink Setup】按鈕;
在此頁面中,選中復選框后,點擊【Proceed】按鈕;
當出現以下頁面提示時,表示配置成功;
3、 進入“\xampp\htdocs\testlink”目錄下,把install目錄刪除;
4、 漢化過程:將String.txt拷貝到” \xampp\htdocs\testlink\locale\zh_CN”目錄下,替換原有的String.txt文件;
5、 再次登錄:http://IP地址/testlink; 默認用戶名:admin密碼:admin
到此處所有testlink配置工作已經完成,接下來可以使用;
我常常在會議上聽測試行業內部的人說:“現在啊,剛畢業的大學生都不具備我們所需要的技能……”這話沒錯,可我倒是有一個提議可以稍微緩解一下這個實際上很簡單的問題。簡單來說就是,為什么不幫這些大學生一把,或者接受當地的學術界專家教授呢?
一個大學和企業都不得不面對的難題就是預算限制(尤其在現今的經濟狀況之下)。就像許多企業已經大大減少了他們的可支配支出,不少大學也是,或許大學減少的還要多些。眾所周知,專業會議的價格是相當昂貴的,你的專業領域的專業培訓課程也是。現在,在計算機科學和其他信息技術相關的領域里,我們需要了解的知識主體是處于不斷變化中的,而且很快就會過時。
現在所用的技術――硬件和軟件,在我們許多專家還在研究生院時都沒發明出來。所以,我們現在課上所教的基本都是我們自學的。如果那時夠幸運的話,我們或許能夠參加培訓班去學習我們現在所教授的內容。但更可能的是我們不得不自學。
所以,努力工作的員工怎樣才能得到他們所需要的培訓,將來成為軟件測試/軟件工程的專家呢?——通過正式或非正式地讓企業和大學建立更多的合作關系。
非正式聯盟
企業花費大量經費來培養他們的員工,花錢讓他們獲得正規的大學教育,派他們參加相關會議和專業發展研討會。許多這類研討會大多是在線的,要么請了咨詢顧問來上培訓課要么由公司自己內部的員工舉辦。通常顧問講師是按學員個數來要價,但也有時按一定范圍的人數要價,比如:20到25人一個固定價。但愿這是我最后一次這么說了。下次你們邀請當地教授免費來幫你們上在線培訓課,怎么樣?
怎樣才能更好的確保你們所招顧問講師所教的東西就是你們希望你們將來的員工能學會的?這得花費多少經費?另一套培訓資料和一頓午餐嗎?或者如果他們確實是按每個人來收費,那這樣,你還要額外花這么多錢去培養一個專家還值不值得?或許吧......
正式聯盟
建立一個更加正式的聯盟是另一個的選擇,它或許對參與其中的每個人都更具價值。這種正式聯盟有多種形式,包括:提供資金讓學校教授去參與測試會議或課程;讓公司員工在大學里做講座嘉賓;提供機會讓教職員工和學生來公司參觀;讓學校的教職員工來公司工作一段時間。給學校的教授們提供可以在課上用得著的材料和例子也是極具價值的。
我的一個難題是:找出對學生既有意義又有挑戰的現實生活中的實例與練習。你們可以把任何有關你們公司行業機密的東西留著,只提供可以融入課堂的知識。
許多公司已經制定了正式的教授計劃,如:設立一個持續幾個月或者幾年的客座教授的職位。我很幸運,在幾年前的一個夏天加入了這樣一個聯盟,作為一個大企業的學院合作計劃的一部分,我在他們的一個重要的軟件測試實驗室工作了五個禮拜。那次經歷是相當珍貴的。在學校和企業都受益的同時,我計劃著在學校開一門新的軟件測試的課程。
作為開新課的一部分準備,我想學習當前的實例并熟悉一些現在大家使用的自動化測試工具;我想了解成為一名全職測試員是怎樣的:測試員會面對哪些挑戰?他們用哪些自動化工具?這些工具的優劣點是什么?成為一位測試隊伍的項目經理又是怎樣的?我想知道企業是如何在軟件測試的業務流程中整合工具的;我想加強我們學校和測試企業的合作關系。
我也可以看書來了解這些,但是我想知道更多,想提高我對這方面的理解,想把這些知識帶到課堂。公司企業的目標是從長遠角度積極影響招聘員工。更明確地來說,他們在向我們展示他們為其公司內部需求和客戶需求所設計的測試軟件的同時,也想要加強和學校的聯系。因為他們以及許多其他公司都為了該如何招到有專業測試背景和把軟件測試作為一個職業選擇的學生煩惱著。
我被任用了
作為他們院校合作計劃的一部分,我有幸能夠采訪和近距離觀察測試員的日常工作,可以和軟件測試項目經理探討問題。
其中一個不錯的經歷就是我花了幾個小時向他們的可用性專家學習了可用性測試。一個意外的收獲是:他在他們可用性實驗室為我錄制了在一個網頁上運行可用性測試的過程。我利用錄制的內容給學生闡釋說明了一個正規的可用性測試的流程。我也參加了幾次培訓課學習了兩家供應商的測試軟件。
這次聯盟的一個結果是我能夠獲得我為了開軟件測試課程所需要的準備工作。除了我接受的技術培訓,我還對現下業務測試行業的難題與挑戰有了更好的了解。下個學期,我就開辦了軟件測試課程。班級的學生有來自商業學院信息系統專業的,還有來自工程學院計算機科學專業的。他們團隊合作,我會確保一隊中有兩名學生是信息系統專業(商業)的,另外兩名學生是計算機科學專業(工程)的。這樣來自兩所學院的學生就不得不合作了。
通過加強和我們學校的合作并且通過讓學生更好地了解了測試相關的職業,而公司的招聘成功率隨之上升,公司就從中獲益。
這樣,學生會把軟件測試作為一個職業選擇。潛在員工變得更適合企業的需求:學生獲得暑期實習的機會,畢業后立即成為該公司的正式員工。
我現在有新的合作伙伴了
當我在軟件公司時,一位經理聯系了自動化軟件測試工具的一家供應商的CEO,懇請他們為我校捐贈測試工具。這樣子,其中的每一方都能受益:學校可以收到最好的測試工具來用到課上教學;公司可以雇用對自動化測試工具有經驗的新人;自動化測試工具的供應商可以把他們的軟件送到將來的軟件測試決策者們的手上。同時,軟件公司開始以我們學校為成功案例和其他高校建立正式項目。
與這家公司合作了差不多一年的時候,他們宣布了新的計劃:提供軟件和培訓材料倆幫助學術機構發展他們的技術課程。
我們學校是第一個參與這個合作計劃并收到捐贈的機構。在課上,我使用他們的網頁應用測試軟件,網頁下載測試軟件和管理需求、制定測試計、劃追蹤缺陷的產品。
其他公司也給我們學校捐贈了軟件(和硬件),供我們上課使用。它的意義是許多公司都開始十分慷慨地捐贈他們的產品給學校供上課使用了,但也許只有我們提出時他們才會這么做。
挑戰
這是一項巨大的任務,但只有我一個人在做著。所以,如果軟件公司愿意給一所學校捐贈軟件,他們必須有提供額外培訓和支持的準備。不然的話,這項計劃就會破產。
一所學校里多個不同的學科的人都加入的話,這項計劃成功的幾率就大些,但這樣的機會也不是經常有的。但確實有來自其他學科(如:商業信息系統和計算機科學)的教職員工參與也是很吸引人的一點。
為了成功開設一門軟件測試課并把軟件與課堂整合得花上不少時間。至少以我自己的例子來說,我除了平常的教學任務就一心一意專門做這個。不必說,我很忙。所以,有什么能大大地提高成功的幾率呢?——讓企業對與當地教授合作產生興趣并在大學的release time提供資金。這是什么意思呢?就是說,這個教授一學期教兩門課,這筆資金就提供給大學來支付教授教一門課的工資,這樣的話,他們就可以少教一門課。
我最需要的就是時間。在一些大學,如果正處于資金短缺時期,那么教學工作量(每學期每個教授要教的課程的數量)就會增加。那樣,我們教課比平常要多,就沒時間花在軟件測試課的事情上了。
但是這樣做會耗費企業的經費嗎?當然會。但是,為了讓你能夠招到合格的大學畢業生,做什么事是值得的呢?當雇傭到優秀的員工時,想想公司花在培訓上的所有資金吧,那就是答案。
另一個選擇就是企業給教授發工資,事實上一付就要長達一年。但或許你更愿意一直不斷吸引更換新的教授來上課而不提供資金,這樣的話你或許不會像你提供穩定的資金那么成功。
話雖如此,一些教授倒愿意作為客座教授,或許離開校園,在企業公司里工作個一、兩年。
一個永久的選擇是:建一個由企業提供資金的講座職位。這個職位或許是比較耗費資金的,但可能是更成功的。在這種情況下,一家公司要長達一年投入大筆資金和精力在這個職位上。
如果你們學校設有碩士、博士學位,那么學校的研究生們就能和公司測試員工一起做項目。反之,這些項目也可以成為他們的碩士、博士論文的實例。
總結:
顯然,通過更近一步的合作,測試行業和學術界都可以獲益。想要了解你們當地學校的教職員工的更好的方法是什么?讓測試行業和學術界結成聯盟的更好的方法是什么?幫助你們招到符合要求的學生的更好的方法是什么?——一大批當地學校的教授求任用!
1. Xcode(IOS)
測試時連接到Xcode上,在 console 上面可以時時看到當前的日志。可以便于一些非必現問題的定位。
2. Sqlitespy
數據庫地址: app/ Documents/ .db文件
通過Sqlitespy 進行增刪改查、構建數據等。
3. iTools
通過此工具可以將iPhone手機上app安裝目錄下的數據庫 及 Log信息等導出。
4. Fiddler
通過設置
手機代理為Fiddler IP 地址,進行相應的抓包測試,抓取Http相關的信息。
通過抓包更改服務器的新版本號來 驗證自動更新功能。
通過抓包更改返回數據來驗證一些比較難構建的場景。
這是本人自學
Linux所做的筆記,以及實現一些功能作的總結。樂意與各位喜歡linux的朋友交流
學習,共同進步。這篇
文章只是簡單介紹一些linux比較常用的或者說是最基礎的也是最重要的知識,有些在模塊后面標上“重點”的,就是必須熟記的知識了,還有一些關于在linux上進行服務器管理和應用程序開發的總結將在稍后更新。聲明一下:本文的命令為排版需要,可能使用了中文字符,若直接復制到linux中可能出錯。
Linux 由于性能卓越,開源,安全性和穩定性高,處理多并發,支持多線程,多用戶,對內存和文件管理優越等眾多優點而被應用的越來越多。反正我感覺是越來越喜歡Linux了。
Linux的最小配置只需要4M內存,因此適合嵌入式開發。
首先介紹Linux的安裝,本人用的發行版是Red Hat Enterprise Linux 6,雖然說基本上是下一步,但是linux的分區是必須要掌握或者是要理解的,這也正體現出了它自己獨特的文件管理模式,并且,這個與windows是完全不同的。分區原則:
/boot分區:啟動分區,100M足矣,一般的范圍在32—100M之間,100M左右最好;
Swap分區:又叫交換分區,一般是物理內存的2倍,但不要大于256M;
/ : 即根分區,盡可能大,因此,我們將剩下的硬盤大小全部分給根分區。
一些基礎但經常使用的命令:
參看Linux系統分區的具體情況:fdisk –l
查看某個目錄是在哪個分區上:df 目錄全路徑 如:df /boot/
Linux采用級層式的樹狀目錄結構,最上層是根目錄,為:“/”
基礎常用命令:
關機:shutdown –h now(立刻進行關機)
重啟:shutdown –r now
reboot--------也是重啟的命令
用戶注銷:logout
列出當前目錄下所有文件:ls 或者使用命令:dir
列出當前目錄下所有文件,包含隱藏文件:ls –a
列出當前目錄下所有文件的詳細信息:ls –l
切換目錄:cd
切換到上一級目錄:cd .
切換到上上級目錄:cd ..
切換到圖形化界面:startx
Linux文件夾常識:
因為Linux良好的文件管理系統,以下幾個關鍵或者說是比較重要的文件目錄是必須要知道的:
root:存放root用戶的相關文件
home:存放普通用戶的相關文件
bin:存放普通命令(常用命令)
sbin:存放要具有一定權限才可以使用的命令
mnt:掛載軟驅,光驅的目錄(默認)
etc:存放配置的相關文件
var:存放經常變化的文件
boot:存放引導相關的文件
usr:默認程序(文件)安裝文件夾
顯示自己的當前路徑:pwd 當自己不知道處在了哪個文件夾路徑下時,用這個命令可以方便的看到自己的路徑。比較有用的一個命令。
Linux的用戶管理:
添加用戶: useradd 用戶名
設置密碼:passwd 用戶名 回車之后輸入密碼,然后確認,如果沒錯,操作成功。
刪除用戶:userdel 用戶名 userdel –r 用戶名 刪除該用戶及該用戶的主目錄
在linux中的每個用戶必須屬于一個組,不能獨立于組外
ls –ahl 查看文件的所有組
可通過[chgrp 組名 文件名]修改用戶的所在組
如何在Linux中添加組: groupadd 組名
查看linux中所有組信息: cat /etc/group或者是 vi /etc/group
創建用戶并同時指定將該用戶分配到某個組: useradd -g 組名 用戶名
查看Linux中所有用戶信息:vi /etc/passwd 或者是: cat /etc/passwd
Linux的運行級別:
直接輸入命令:vi /etc/initab
下面說說每個數字表示的意義:
0:關機 1:單用戶 2:多用戶沒有網絡服務 3:多用戶有網絡服務 4.系統未使用保留給用戶 5.圖形界面 6:系統重啟
常用級別是3和5
但別人更改了用戶級別為4或其他數字使Linux不能正常啟動時,需要用到以下解決方案將Linux進行重新設置:
在開機圖形化界面(GRUB引導界面)中輸入“e”,然后高亮第2行,再輸入“e”,然后是空格和1(即: 1):代表單用戶級別,按“b”進行重新啟動。解決問題
文件夾管理:
建立目錄:mkdir
刪除目錄:rmdir
刪除所有內容:rm –rf
建立符號鏈接:ln
建立空文件:touch
拷貝命令:cp
移動文件和改文件名:mv
管道命令:| 將一個命令的輸出作為另一個命令的輸入,即將上一個命令的結果交給管道命令后的命令進行處理
一個最重要的命令:man 任何關于命令問題的問題都能解決的好“男人”,瞬間感覺設計linux的人很有才,其實際上應該是手冊的意思。
搜索文件及目錄:find
按文件名查找:find / —name a.java 從根目錄開始查找名為a.java的文件
重定向命令:ls –l > a.txt 把結果輸入到a.txt中 (覆蓋以前的內容)
追加信息: >> (在內容后面追加信息)
關于文件權限的問題:(重點)
修改文件的訪問權限:chmod 777 文件名
備注:第一個7表示:文件的所有者可以對文件進行讀,寫,執行等操作;
第二個7表示:文件所在組的其他用戶可以對該文件進行讀,寫,執行等操作;
第三個7表示:其他組用戶可以對該文件進行讀,寫,執行等操作。
如:文件名前面的字符串為“-rw-r--r--”
r :可讀,值為4;
w:可寫,值為2;
x:可執行,值為1.
因此,將其分為三個字符代替一數,上面的權限字符串的值為“-644”。最前面的橫線表示文件的所屬類型。
關于Linux在虛擬機的掛載和卸載操作(重點):
首先需要在虛擬機中進行簡單的設置:點擊設置,然后點擊CD/DVD IDE,將device status 下面的兩個選項全部勾上,選擇您要掛在的鏡像文件;如下圖示:
掛載的步驟:
a. 查看/dev/中是否有cdrom文件,即可以掛載的目錄:
結果為:
存在該目錄,退出到根目錄,繼續下一步;
b. 輸入掛載命令,進行掛載:mount /dev/cdrom /mnt
c. 退出到根目錄,查看剛才掛載的鏡像文件:
d. 掛載成功。可以用鏡像文件了。
Shell基礎:
常用的三種shell:
No1. Bash,在大陸一般比較流行,指向sh
No2. Csh
No3. Ksh ,在歐洲比較流行
用命令ls —l /bin/*sh可查詢以上文件。
查看目前使用的是哪種shell,直接用命令env,該命令可以顯示當前操作系統的環境變量
修改shell的命令:chsh —s 輸入新的shell 如: chsh —s /bin/csh 將當前的shell設置為csh
前言
SQLite (http://www.sqlite.org/docs.html) 是一個輕量級的關系
數據庫。iOS SDK很早就支持了SQLite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 頭文件即可。但是,原生的SQLite API在使用上相當不友好,在使用時,非常不便。于是,開源社區中就出現了一系列將SQLite API進行封裝的庫,而FMDB (https://github.com/tryingx/fmdb-master) 則是開源社區中的優秀者。
第一步 引入:sqlite3的類庫
第二步 引入:FMDB的類庫
主要包括以下幾方面
引入文件結束以后就可以使用了,使用很簡單
第一步 建立一個數據庫類
1 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 獲取document文件的路徑 2 /** 3 * 強調一點就是對于數據庫的名:我們可以用"" 或用 NULL 4 * 5 * An empty string (@""). An empty database is created at a temporary location. This database is deleted with the FMDatabase connection is closed. 6 也就是說如果我們使用(@""),會創建一個臨時數據庫,當我們數據庫關閉后會自動刪除 7 NULL. An in-memory database is created. This database will be destroyed with the FMDatabase connection is closed. 8 在內存中給你創建一個數據庫 9 */ 10 NSString *dbPath = [docPath stringByAppendingPathComponent:@"student.sqlite"]; 11 NSLog(@"%@", dbPath); // 拼接字符串 12 FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath]; 13 [dataBase open]; 14 // 用來判斷數據庫打開是否成功 15 if (![dataBase open]) { 16 NSLog(@"error"); 17 } |
第二步 就是執行一些常用的操作
常用操作:
1.創建一個表
NSString *sql = @"CREATE TABLE student(_id Integer primary key, name text, password text, email text)";
BOOL isCreateTable = [dataBase executeStatements:sql];
NSLog(@"%d", isCreateTable );
2.插入數據
NSString *sqlInsert = @"INSERT INTO student (name, password, email) values ('寶貝', '1232', '3343243')";
BOOL isInsertOK = [dataBase executeStatements:sqlInsert];
NSLog(@"%d", isInsertOK );
3.批量的創建表和插入數據
NSString *sql1 = @"create table bulktest1 (id integer primary key autoincrement, x text);" "create table bulktest2 (id integer primary key autoincrement, y text);" "create table bulktest3 (id integer primary key autoincrement, z text);" "insert into bulktest1 (x) values ('XXX');" "insert into bulktest2 (y) values ('YYY');" "insert into bulktest3 (z) values ('ZZZ');"; [dataBase executeStatements:sql1]; |
當然也可以通過數組的方式插入數據
NSArray *stuentInfo = [NSArray arrayWithObjects:@"大傻瓜",@"213",@"123456@qq.com", nil nil];
[dataBase executeUpdate:@"insert into student (name, password, email) values (?,?,?)" withArgumentsInArray:stuentInfo];
4.匹配的方式插入數據
NSString *sqlInsert = @"INSERT INTO student (name, password, email) values (?,?,?)";
BOOL flag = [dataBase executeUpdate:sqlInsert, @"大寶貝", @"123", @"654321@qq.com"];
NSLog(@"%d", flag);
5.1.查詢所有數據
FMResultSet *result = [dataBase executeQuery:@"SELECT * FROM student"];
[self showInfo:result];
[result close];
- (void)showInfo:(FMResultSet *)result { while ([result next]) { int _id = [result intForColumnIndex:0]; NSLog(@"id : %d", _id); NSString *name = [result stringForColumnIndex:1]; NSLog(@"name : %@", name); NSString *password = [result stringForColumnIndex:2]; NSLog(@"password : %@", password); NSString *email = [result stringForColumnIndex:3]; NSLog(@"email : %@", email); } } |
5.2.查詢指定信息
NSString *sqlInsert = @"SELECT * from student where name = %@";
FMResultSet *result = [dataBase executeQueryWithFormat:sqlInsert, @"寶貝"];
NSLog(@"%@", result);
[self showInfo:result];
6.執行刪除操作
NSString *sql = @"delete from student where name = ?";
[dataBase executeUpdate:sql,@"寶貝"];
執行更新操作的步驟和刪除操作一樣,只不過sql語句不同而已
重要注意事項是:1 使用完數據庫后記得關閉
2 查詢結果完場后result也得記得關閉
這是很久以前編寫的一個
測試案例,那時是為了檢查大量往
Mysql數據庫里插入數據,看一下
數據庫的性能如何?服務器是否會很快就被寫滿了。
前期的準備
工作:Mysql 數據庫搭建,
LoadRunner,libmysql.dll and 網上搜一份LoadRunner訪問mysq的公共庫。
Step1:Mysql數據庫搭建(這里就不詳細講述如何安裝Mysq數據庫和創建表了)
IP:192.168.1.100
訪問名:root
密碼是:123456
數據庫名是:t3db
訪問端口是:3306
數據庫的相關信息就是這樣了!
Step2:LoadRunner如何連接mysql呢?
以下全都是在網上找到原代碼
int rc; int db_connection; char *server = "192.168.1.100"; // 數據庫的ip地址 char *user = "root"; // 數據庫訪問用戶名 char *password = "123456"; // 密碼 char *database = "t3db"; // 數據庫名稱 int port = 3306; // 訪問端口 int unix_socket = NULL; int flags = 0; char** result_row; int query_result; char szSql[256]; int MySqlInit() { rc = lr_load_dll("libmysql.dll"); db_connection = mysql_init(NULL); if (db_connection == NULL) { lr_error_message("Insufficient memory"); lr_abort(); } if(rc!=0) { lr_error_message("Load MySql.dll Error!"); lr_abort(); } rc = mysql_real_connect(db_connection,server, user, password, database, port, unix_socket, flags); if(rc == NULL) { lr_error_message("connect mysql error! %s",mysql_error(db_connection)); mysql_close(db_connection); lr_abort(); } return rc; } int MySqlUnit() { // 釋放MySQL資源 mysql_close(db_connection); return 0; } int InsertValue(char* query) { rc = mysql_query(db_connection,query); if (rc != 0) { lr_error_message("%s", mysql_error(db_connection)); } query = NULL; return rc; } int MySqlQuery(char* szSql) { rc = mysql_query(db_connection,szSql); if(rc != 0) { lr_error_message("%s",lr_eval_string("?")); lr_error_message("%s", mysql_error(db_connection)); szSql = NULL; return -1; } query_result = mysql_use_result(db_connection); if (query_result == NULL) { lr_error_message("%s", mysql_error(db_connection)); mysql_free_result(query_result); szSql = NULL; return -2; } result_row = (char **)mysql_fetch_row(query_result); if (result_row == NULL) { lr_error_message("Did not expect the result set to be empty"); mysql_free_result(query_result); szSql = NULL; return -3; } mysql_free_result(query_result); szSql = NULL; return 0; } |
這里提供了幾個公共函數,看名字大家都明白他們是干啥的。
Step3:Loadrunner里需要怎么編寫寫呢?
1、添加libmysql.dll到你的工程
2、把公共庫添加到你的公共
3、vuser_init
vuser_init() { index = 0; MySqlInit(); // 初始化數據庫 return 0; } |
4、vuser_end
vuser_end() { MySqlUnit(); // 反初始化 return 0; } |
5、Action
Action() { int resultValue; char cIndex[10]; char onceAccount[1024]; char insertQuery[22584]; index = index +1; // 組合插入數據庫的sql語句 strcpy(insertQuery, "INSERT INTO `t3db`.`role`(GroupID, RoleName, Account, BaseInfo, ExtInfo, LastModify) VALUES('1', '"); strcat(insertQuery, lr_eval_string("{Account}")); strcat(insertQuery, itoa(index, cIndex, 10 )); strcat(insertQuery, "', 'q1031', '111', '111','2013-02-28 20:42:33')"); strcat(insertQuery, ";\0"); lr_start_transaction("Insert"); resultValue = InsertValue(insertQuery); // 調用插入函數 if(resultValue != 0) { lr_end_transaction("Insert",LR_FAIL); } else { lr_end_transaction("Insert",LR_PASS); } sleep(100); return 0; } |
1.在類中方法上加上
synchronized關鍵字,是對整個對象加鎖,當一個線程訪問帶有synchronized的方法時,其他帶有synchronized的方法的訪問就都會阻塞。
樣例:
public class ThreadTest { public static void main(String[] args) { Stu stu = new Stu(); StuThread1 t1 = new StuThread1(stu); t1.start(); StuThread2 t2 = new StuThread2(stu); t2.start(); } } class StuThread1 extends Thread { Stu stu; public StuThread1(Stu stu) { this.stu = stu; } public void run() { stu.read1(); } } class StuThread2 extends Thread { Stu stu; public StuThread2(Stu stu) { this.stu = stu; } public void run() { stu.read2(); } } class Stu { public synchronized void read1() { System.out.println("read1 begin"); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("read1 end"); } public synchronized void read2() { System.out.println("read2 begin"); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("read2 end"); } } |
打印結果為(兩個線程是順序執行的):
read1 begin read1 end read2 begin read2 end |
如果去掉read2前面的synchronized關鍵字,打印為(線程出現了交叉執行):
read1 begin read2 begin read2 end read1 end |
修改read2方法,
public void read2() { synchronized(this) { System.out.println("read2 begin"); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("read2 end"); } } |
對this進行加鎖,結果同一次,線程是順序執行的。