(2). Checkout (提?。?/div>
(3). Commit (提交)
?。?). Update (更新)
當(dāng)你已經(jīng)Checkout了一份源碼, Update一下你就能夠和Repository上的源碼同步,你手上的代碼就會(huì)有最新的變更
假設(shè)兩個(gè)程序猿同一時(shí)候改動(dòng)了同一個(gè)文件呢, SVN能夠合并這兩個(gè)程序猿的改動(dòng),實(shí)際上SVN管理源碼是以行為單位的,就是說兩個(gè)程序猿僅僅要不是改動(dòng)了同一行程序,SVN都會(huì)自己主動(dòng)合并兩種改動(dòng)。假設(shè)是同一行,SVN會(huì)提示文件Confict, 沖突,須要手動(dòng)確認(rèn)。
CVS 僅僅能跟蹤單個(gè)文件的歷史, 只是 Subversion 實(shí)作了一個(gè) “虛擬” 的版本號控管文件系統(tǒng), 可以依時(shí)間跟蹤整個(gè)文件夾的變動(dòng)。 文件夾和文件都能進(jìn)行版本號控制。
自從CVS限制了文件的版本號記錄,CVS并不支持那些可能發(fā)生在文件上,但會(huì)影響所在文件夾內(nèi)容的操作,如同復(fù)制和重命名。除此之外,在CVS里你不能用擁有相同名字可是沒有繼承老版本號歷史或者根本沒有關(guān)系的文件替換一個(gè)已經(jīng)納入系統(tǒng)的文件。在Subversion中,你能夠添加(add)、刪除(delete)、復(fù)制(copy)和重命名(rename),不管是文件還是文件夾。全部的新加的文件都從一個(gè)新的、干凈的版本號開始。
一個(gè)提交動(dòng)作,不是所有更新到了檔案庫中,就是全然不更新。這同意開發(fā)者以邏輯區(qū)間建立并提交變動(dòng),以防止當(dāng)部分提交成功時(shí)出現(xiàn)的問題。
每個(gè)文件與文件夾都附有一組屬性keyword并和屬性值相關(guān)聯(lián)。你能夠創(chuàng)建, 并儲(chǔ)存不論什么你想要的Key/Value對。 屬性是隨著時(shí)間來作版本號控管的, 就像文件內(nèi)容一樣。
Subversion 有抽象的檔案庫存取概念, 能夠讓人非常easy地實(shí)作新的網(wǎng)絡(luò)機(jī)制。 Subversion 能夠作為一個(gè)擴(kuò)展模塊嵌入到Apache HTTP server中。這個(gè)為Subversion提供了非常先進(jìn)的穩(wěn)定性和協(xié)同工作能力,除此之外還提供了很多重要功能: 舉例來說, 有身份認(rèn)證, 授權(quán), 在線壓縮, 以及文件庫瀏覽等等。另一個(gè)輕量級的獨(dú)立Subversionserver, 使用的是自己定義的通信協(xié)議, 能夠非常easy地通過 ssh 以 tunnel 方式使用。
Subversion 使用二進(jìn)制差異算法來異表示文件的差異, 它對文字(人類可理解的)與二進(jìn)制文件(人類無法理解的) 兩類的文件都一視同仁。 這兩類的文件都相同地以壓縮形式儲(chǔ)存在檔案庫中, 并且文件差異是以兩個(gè)方向在網(wǎng)絡(luò)上傳輸?shù)摹?/div>
(7)有效的分支(branch)與標(biāo)簽(tag)
在分支與標(biāo)簽上的消耗并不必一定要與項(xiàng)目大小成正比。 Subversion 建立分支與標(biāo)簽的方法, 就僅僅是復(fù)制該項(xiàng)目, 使用的方法就相似于硬連接(hard-link)。 所以這些操作僅僅會(huì)花費(fèi)非常小, 并且是固定的時(shí)間。
?。?)Hackability
Subversion沒有不論什么的歷史包袱; 它主要是一群共用的 C 程序庫, 具有定義完好的API。這使得 Subversion 便于維護(hù), 而且可被其他應(yīng)用程序與程序語言使用。
二. SVN server搭建
2.1 使用yum 安裝SVN包
關(guān)于YUM server的配置參考:
Linux 搭建 YUM server
http://blog.csdn.net/tianlesoftware/archive/2011/01/03/6113902.aspx
[root@singledb ~]# yum install -y subversion Loaded plugins: rhnplugin, security This system is not registered with RHN. RHN support will be disabled. Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package subversion.i386 0:1.4.2-4.el5_3.1 set to be updated --> Finished Dependency Resolution Dependencies Resolved ==================================================================================================== Package Arch Version Repository Size ==================================================================================================== Installing: subversion i386 1.4.2-4.el5_3.1 rhel-base 2.3 M Transaction Summary ==================================================================================================== Install 1 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 2.3 M Downloading Packages: subversion-1.4.2-4.el5_3.1.i386.rpm | 2.3 MB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : subversion 1/1 Installed: subversion.i386 0:1.4.2-4.el5_3.1 Complete! |
[root@singledb ~]#
驗(yàn)證安裝版本號:
[root@singledb ~]# svnserve --version svnserve, version 1.4.2 (r22196) compiled Aug 5 2009, 19:03:56 Copyright (C) 2000-2006 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet |
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.
2.2 創(chuàng)建SVN 版本號庫
[root@singledb ~]# mkdir /u02/svn
[root@singledb ~]# svnadmin create /u02/svn/davesvn --davesvn為版本號庫名稱
2.3 SVN 配置
創(chuàng)建版本號庫后,在這個(gè)文件夾下會(huì)生成3個(gè)配置文件:
[root@singledb conf]# pwd
/u02/svn/davesvn/conf
[root@singledb conf]# ls
authz passwd svnserve.conf
?。?)svnserve.conf: svn服務(wù)配置文件下。
?。?)passwd: username口令文件。
(3)authz: 權(quán)限配置文件。
svnserve.conf 文件, 該文件配置項(xiàng)分為下面5項(xiàng):
anon-access: 控制非鑒權(quán)用戶訪問版本號庫的權(quán)限。
auth-access: 控制鑒權(quán)用戶訪問版本號庫的權(quán)限。
password-db: 指定username口令文件名稱。
authz-db:指定權(quán)限配置文件名稱,通過該文件能夠?qū)崿F(xiàn)以路徑為基礎(chǔ)的訪問控制。
realm:指定版本號庫的認(rèn)證域,即在登錄時(shí)提示的認(rèn)證域名稱。若兩個(gè)版本號庫的認(rèn)證域同樣,建議使用同樣的username口令數(shù)據(jù)文件
Passwd 文件 :
我們在svnserve.conf文件中啟用這個(gè)文件。然后配置例如以下:
[root@singledb conf]# cat passwd
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
# harry = harryssecret
# sally = sallyssecret
dave = davepwd
tianlesoftware = tianlesoftwarepwd
authz 文件 :
在網(wǎng)上找到一個(gè)非常好的配置樣例:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
--這里把不同用戶放到不同的組里面,以下在設(shè)置文件夾訪問權(quán)限的時(shí)候,用文件夾來操作就能夠了。
# 為全部庫指定默認(rèn)訪問規(guī)則
# 全部人能夠讀,管理員能夠?qū)?,危急分子沒有不論什么權(quán)限
[/] --相應(yīng)我測試?yán)锏模?u02/svn 文件夾
* = r
@admin = rw
dangerman =
# 同意開發(fā)者能夠全然訪問他們的項(xiàng)目版本號庫
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
# 文檔編寫人員對全部的docs文件夾有寫權(quán)限
[/trunk/doc]
@docs = rw
# 培訓(xùn)人員能夠全然訪問培訓(xùn)版本號庫
[TrainingRepos:/]
@training = rw
以下我們來配置我們的authz文件:
[root@singledb conf]# cat authz
[groups]
admin = dave
dev=tianlesoftware
[davesvn:/]
@admin = rw
@dev = rw
[root@singledb conf]#
2.4 啟動(dòng)和停止SVN服務(wù)
?。?)啟動(dòng)SVN服務(wù):
[root@singledb conf]# svnserve -d -r /u02/svn
-d表示后臺(tái)執(zhí)行
-r 指定根文件夾是 /u02/svn
[root@singledb conf]# ps -ef | grep svn
root 4592 1 0 18:04 ? 00:00:00 svnserve -d -r /u02/svn
root 4594 3709 0 18:04 pts/1 00:00:00 grep svn
(2)停止SVN服務(wù):
ps -aux |grep svn
kill -9 進(jìn)程殺掉三. client連接SVN server
3.1 安裝TortoiseSVN client
下載地址在第一節(jié)已說明。
3.2 找到自己項(xiàng)目的文件夾,右擊,進(jìn)行SVN 操作
?。?)新建測試文件夾svn,進(jìn)入后右鍵,點(diǎn)checkout:
SVN server的IP地址和版本號庫名稱。
新建個(gè)文件svn.txt. 把這個(gè)文件上傳到SVNserver(add):
1)存儲(chǔ)機(jī)制
2)索引方式
3)鎖
4)等等
SQL語言:-----關(guān)系型數(shù)據(jù)庫所使用的數(shù)據(jù)管理語言
1)數(shù)據(jù)定義語言(DDL):DROP、CREATE、ALTER等對數(shù)據(jù)對象發(fā)生操作的語言。
2)數(shù)據(jù)操作語言(DML):INSERT 、UPDATE、 DELETE,對數(shù)據(jù)本身發(fā)生更、刪、改。
3)數(shù)據(jù)查詢語言(DQL):SELECT,專門用于查找數(shù)據(jù)。
4)數(shù)據(jù)控制語言(DCL):GRANT/授權(quán)、REVOKE/收回授權(quán)、COMMIT/提交操作等等。
而非關(guān)系型數(shù)據(jù)庫其操作語言就多種多樣了。
數(shù)據(jù)庫管理系統(tǒng)(DBMS):管理和維護(hù)數(shù)據(jù)庫所使用的軟件,為管理數(shù)據(jù)的方式和方法提供載體和支持。包含:
1)用戶管理
2)處理數(shù)據(jù)庫連接
3)緩存
4)查詢
5)日志
6)等等
用于不同程序設(shè)計(jì)語言連接盒管理數(shù)據(jù)庫的接口:
1)ODBC
2)JDBC
3)PDO
4)ADO.NET等等類型的接口
一個(gè)簡單的例子學(xué)習(xí)hessian服務(wù):服務(wù)端為
Java,客戶端為C#。
先要準(zhǔn)備好C#和Java的第三方類庫:http://hessian.caucho.com/
Hssiancharp.dll
hessian-4.0.37.jar
Hessian服務(wù)端(java)
打開eclipse創(chuàng)建一個(gè)Dynamic Web Project,將hessian-4.0.37.jar放到lib下,大概如圖所示:
創(chuàng)建一個(gè)通信接口IHello:
package hessian.test.server; import java.util.ArrayList; public interface IHello { String sayHello(String msg); void sayHello2(int bean); void print(String msg); HelloBean getData(HelloBean bean); ArrayList<HelloBean> getBeanList(); ComplexData getComplexData(); } |
IHello接口的一個(gè)實(shí)現(xiàn):HelloImpl.java
package hessian.test.server; import java.util.ArrayList; public class HelloImpl implements IHello{ public String sayHello(String msg){ return "Hello " + msg; } public void sayHello2(int bean){ System.out.println("Hello " + bean); } public void print(String msg){ System.out.println(msg); } public HelloBean getData(HelloBean bean){ HelloBean result = new HelloBean(); result.setName("lu xiaoxun a new name"); result.setAge(26); System.out.print(bean.getName()); return result; } public ArrayList<HelloBean> getBeanList(){ ArrayList<HelloBean> beans = new ArrayList<HelloBean>(); HelloBean b1 = new HelloBean(); b1.setName("lu1"); b1.setAge(26); beans.add(b1); HelloBean b2 = new HelloBean(); b2.setName("lu2"); b2.setAge(27); beans.add(b2); return beans; } public ComplexData getComplexData(){ ComplexData data = new ComplexData(); ArrayList<HelloBean> beans = getBeanList(); data.setData(beans, beans.size()); return data; } } |
定義用來進(jìn)行數(shù)據(jù)傳輸?shù)念?,兩個(gè)類都必須實(shí)現(xiàn)Serializable接口:
HelloBean.java package hessian.test.server; import java.io.Serializable; public class HelloBean implements Serializable { private static final long serialVersionUID = 570423789882653763L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } } ComplexData.java package hessian.test.server; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ComplexData implements Serializable{ private static final long serialVersionUID = 1L; private ArrayList<HelloBean> helloBeans; //private Map<String, HelloBean> helloBeanMap; private int number; public int getNumber(){ return number; } public ArrayList<HelloBean> getHelloBeans(){ return helloBeans; } public void setData(ArrayList<HelloBean> beans, int num){ this.number = num; this.helloBeans = beans; // helloBeanMap = new HashMap<String, HelloBean>(); // for (HelloBean helloBean : beans) { // if(!helloBeanMap.containsKey(helloBean.getName())) // { // helloBeanMap.put(helloBean.getName(), helloBean); // } // } } } web.xml內(nèi)容: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>hessian server</display-name> <servlet> <servlet-name>hessian</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>service-class</param-name> <param-value>hessian.test.server.HelloImpl</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hessian</servlet-name> <url-pattern>/hessian</url-pattern> </servlet-mapping> </web-app> |
Hessian客戶端(c#)
定義一個(gè)與服務(wù)端對應(yīng)的IHello接口:IHello.cs
public interface IHello
{
String sayHello(String msg);
void sayHello2(int bean);
void print(String msg);
HelloBean getData(HelloBean bean);
HelloBean[] getBeanList();
ComplexData getComplexData();
}
定義與服務(wù)器端一致的的通信數(shù)據(jù)類:
HelloBean.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hessian.test.server { public class HelloBean { public String Name { set { name = value; } get { return name; } } private String name; //類型和名稱需要和服務(wù)器端一致 public int Age { set { age = value; } get { return age; } } private int age; //類型和名稱需要和服務(wù)器端一致 public override String ToString() { return "Name: "+ name + " Age: " + age; } } } ComplexData.cs: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hessian.test.server { public class ComplexData { private HelloBean[] helloBeans; //private Dictionary<String, HelloBean> helloBeanMap; private int number; public int GetNumber() { return number; } public HelloBean[] GetBeans() { return helloBeans; } //public Dictionary<String, HelloBean> GetBeansDic() //{ // return helloBeanMap; //} } } |
在主項(xiàng)目中添加Hessiancsharp.dll引用。
測試代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using hessiancsharp.client; using hessian.test.server; namespace HessianClientTest { class Program { static void Main(string[] args) { string url = @"http://localhost:8080/HessianServerTest/hessian"; CHessianProxyFactory factory = new CHessianProxyFactory(); IHello test = (IHello)factory.Create(typeof(IHello), url); //Test function Console.WriteLine(test.sayHello("lu")); //打印從服務(wù)器端獲取的字符串 test.sayHello2(12); //在服務(wù)器端控制臺(tái)打印 "Hello 12" test.print("hessian"); //在服務(wù)器端控制臺(tái)打印 "hessian" //Test Object HelloBean bean = new HelloBean(); //bean.setName("lu xiaoxun"); bean.Name = "luxiaoxun"; HelloBean result = test.getData(bean); Console.WriteLine(result.Name); Console.WriteLine(result.Age); Console.WriteLine(result); //Test Object Array HelloBean[] beans = test.getBeanList(); if (beans != null) { foreach (HelloBean data in beans) { Console.WriteLine(data.ToString()); } } //Test complex data ComplexData complexData = test.getComplexData(); if (complexData != null) { Console.WriteLine("Array number: " + complexData.GetNumber()); HelloBean[] comArray = complexData.GetBeans(); if (comArray != null) { foreach (HelloBean data in comArray) { Console.WriteLine(data.ToString()); } } //Dictionary<String, HelloBean> helloBeanMap = complexData.GetBeansDic(); //if (helloBeanMap != null) //{ // foreach (String key in helloBeanMap.Keys) // { // Console.WriteLine(helloBeanMap[key].GetHelloBeanInfo()); // } //} } Console.ReadKey(); } } } |
測試結(jié)果:
注意事項(xiàng):
1、服務(wù)端和客戶端用于數(shù)據(jù)傳遞的對象的命名空間要一致
IHello接口所在命名空間服務(wù)端和客戶端可以不一致,但是IHello中用到的HelloBean和ComplexData在Java服務(wù)端和C#客戶端中兩個(gè)HelloBean類所在的命名空間要一致。
2、類的字段要一致
用于數(shù)據(jù)傳輸?shù)念惖淖侄蚊妥侄晤愋鸵恢拢ㄐ揎楊愋涂梢圆灰恢拢?/div>
3、服務(wù)端的類要序列化
4、盡量使用基本的數(shù)據(jù)類型
從上面的測試可以看出,傳遞基本的類型沒有問題,傳遞普通的類對象沒有問題,傳遞ArrayList的時(shí)候也沒有問題(C#客戶端使用Array數(shù)組),但是傳遞HashMap字典的時(shí)候會(huì)有問題,C#這邊使用Dictionary沒法對應(yīng)一致,可能是由于hash函數(shù)內(nèi)部實(shí)現(xiàn)不一致導(dǎo)致的,具體原因不明。
1. 關(guān)注一個(gè)動(dòng)作的流程和內(nèi)容
比如登錄,我需要提供的是登錄接口,但是登錄是否只是一個(gè)動(dòng)作?一個(gè)動(dòng)作一定不完整,還應(yīng)該包括動(dòng)作的內(nèi)容和步驟(流程),這里有兩個(gè)問題:就是落地和把問題想復(fù)雜了;其實(shí)登錄還包括有角色的用戶名和密碼,我在給
手機(jī)團(tuán)隊(duì)提供這個(gè)動(dòng)作的時(shí)候還需要提供一下登錄的各個(gè)用戶名以及密碼,這樣才比較周全;
再比如下載紅外庫,當(dāng)時(shí)和廣科就沒有溝通明白,因?yàn)橄螺d其實(shí)是有一個(gè)生命周期,首先是紅外碼的來源,紅外碼的轉(zhuǎn)化txt文檔以及紅外碼的打zip包和編碼轉(zhuǎn)換,這些都是需要和李閱苗溝通的;所以對于一個(gè)動(dòng)作一定溝通明白他懂得生命周期是怎樣的,每個(gè)階段(步驟)的IHO是怎樣的,這樣才算落地;
2.做為一個(gè)項(xiàng)目經(jīng)理想明白事情
你不需要編碼,大部分文檔也不需要你寫,你需要做的就是想明白事情,并且告訴成員你想明白的事情;然后通過手段確保他們按照你預(yù)期的來做事情;
3.構(gòu)建>>完成任務(wù)
一個(gè)團(tuán)隊(duì)的
工作模式遠(yuǎn)大于完成任務(wù),完成任務(wù)是近期目標(biāo);但是一個(gè)團(tuán)隊(duì)模式機(jī)制的形成則是一個(gè)團(tuán)隊(duì)健壯的必要內(nèi)涵;始終應(yīng)該放在首位,這兩其實(shí)是兩件事:1.你的團(tuán)隊(duì)內(nèi)涵是什么,PM一定要想明白;一定要堅(jiān)持執(zhí)行,但是不是執(zhí)著執(zhí)行,堅(jiān)持執(zhí)行的內(nèi)涵,形式和方法可以根據(jù)團(tuán)隊(duì)的性質(zhì)進(jìn)行設(shè)計(jì)和應(yīng)用;及時(shí)有各種的外在因素,構(gòu)建團(tuán)隊(duì)永遠(yuǎn)是首位;
4.團(tuán)隊(duì)做事情套路
構(gòu)建講求的的內(nèi)容套路,還有對外的討論,比如發(fā)布,一定要遵循什么流程,沒有客戶的指令,千萬不能發(fā)布;不能為了照顧某些成員的情緒就改變團(tuán)隊(duì)風(fēng)格;
5.事情立即處理
對于郵件以及事情能處理馬上處理,不要擱置和延后,水桶到你這里終止。比如機(jī)票報(bào)銷,回到大連馬上來做這件事情,否則可能就成為了遺失事情了;
6.準(zhǔn)備驅(qū)動(dòng)
在項(xiàng)目的各個(gè)環(huán)節(jié),PM需要做的是更多的準(zhǔn)備,架構(gòu)準(zhǔn)備,人才準(zhǔn)備,培訓(xùn)準(zhǔn)備等等;然后笑看風(fēng)雨,看著各個(gè)事情到了環(huán)節(jié),因?yàn)槟愕臏?zhǔn)備而有足夠的燃料啟動(dòng),看到他們自己可以自動(dòng)的基于你的準(zhǔn)備來驅(qū)動(dòng)前行,這是做管理的有一個(gè)境界。
本文簡介:
對于中小企業(yè)來說,選擇一款適合的
測試管理工具或者工具集合石走向規(guī)劃管理的必經(jīng)之路,本文從以下幾個(gè)方面對目前流行的幾款工具:
1、QC(QC是TC的升級版,QC的升級版QC 11就是ALM11)
2、禪道(bugfree升級版)
3、mantis
4、JIRA
5、TestLink
6、Bugzilla
從以下幾個(gè)方面進(jìn)行一個(gè)簡單的對比,供大家參考。其中一些數(shù)據(jù)來之網(wǎng)上,不全和不對的地方歡迎大家回帖補(bǔ)充。
功能
2.測試需求管理
3.測試用例管理
4.測試過程管理(測試任務(wù)分配)
5.BUG管理
6.結(jié)果統(tǒng)計(jì)(進(jìn)度、缺陷指標(biāo)等)
7.靈活性(可否流程自定義等)
8.權(quán)限管理
成本
?。?.購買成本
2.部署成本
3.使用成本易用性
4.維護(hù)成本 穩(wěn)定性)
擴(kuò)展性
4.與office的接口)
性能
(1.支持的用戶數(shù)
2.用例數(shù)等KPI指標(biāo))
技術(shù)支持
(1.官方支持
2.使用人氣)
工具簡單描述
對比結(jié)果如下:
通過以上對比,考慮成本、功能、質(zhì)量等方面因素,推薦一下兩種方案:
1、 可以接受引入成本:QC,禪道
2、 希望使用免費(fèi)方案: Mantis + TestLink
說明:jira自帶數(shù)據(jù)庫是HSQL,為內(nèi)存數(shù)據(jù)庫,當(dāng)數(shù)據(jù)量比較大時(shí),其性能會(huì)有問題,所有將其改為mysql
1、準(zhǔn)備環(huán)境
mysql安裝程序:mysql-essential-5.0.87-win32.msi
mysql驅(qū)動(dòng)程序:mysql-connector-java-5.1.7-bin.jar
安裝mysql,然后創(chuàng)建jira數(shù)據(jù)庫,語句如下:
create database jira character set 'UTF8'
將jira的license備份出來,以備后面使用
2、備份jira
用管理員賬戶登錄jira,將其備份,具體如下:
系統(tǒng)管理--導(dǎo)入導(dǎo)出--備份數(shù)據(jù)
3、修改配置
停止jira
將mysql-connector-java-5.1.7-bin.jar驅(qū)動(dòng)程序拷貝到 JIRA\lib 目錄下
啟動(dòng)JIRA\bin\config.bat程序,配置Database,配置完成后,
測試連接
4、恢復(fù)數(shù)據(jù)
啟動(dòng)jira
由于修改了配置,且mysql數(shù)據(jù)庫里的內(nèi)容為空,所以剛啟動(dòng)jira的時(shí)候會(huì)提示輸入license,創(chuàng)建管理員賬戶什么的,隨便填,只要能過去就行。
配置完成后,進(jìn)入系統(tǒng)管理,進(jìn)行恢復(fù)數(shù)據(jù)(要求將其備份的zip文件拷貝到其要求的目錄下即可)
5、驗(yàn)證
用之前的管理員賬戶登錄jira,查看issue內(nèi)容,或者用戶信息等等,驗(yàn)證成功。
一、功能
關(guān)注頁面單個(gè)功能點(diǎn)驗(yàn)證,充分考慮開發(fā)改動(dòng)的每個(gè)點(diǎn)。這個(gè)是保證開發(fā)每個(gè)已知的修改點(diǎn)都能改對。
二、關(guān)聯(lián)
重點(diǎn)考慮修改點(diǎn)對其他模塊的影響,包括代碼的影響和操作數(shù)據(jù)引起的影響。
比如新增加的功能增加了
數(shù)據(jù)庫表的字段,必須關(guān)聯(lián)的驗(yàn)證每個(gè)使用該表的該字段的模塊是否正常
工作。難點(diǎn)在于需要分析出已知和未知的影響模塊,考慮的越多,往往遺漏的問題就越少。
三、流程
很多系統(tǒng)是有流程的,比如工作流系統(tǒng)。當(dāng)修改了一個(gè)點(diǎn)的時(shí)候,我們必須考慮整個(gè)流程是否能夠正常運(yùn)轉(zhuǎn)起來。
四、升級
我們大部分系統(tǒng)都是對已有的系統(tǒng)進(jìn)行升級。對于升級前的數(shù)據(jù),我們必須保證能夠正常工作。升級之前,需要模擬好各種情況。也需要對升級的數(shù)據(jù)庫腳本進(jìn)行充分的檢查。
五、安全
比如菜單功能權(quán)限等。
六、性能
最近
測試組評審
測試用例時(shí)發(fā)現(xiàn)組內(nèi)測試人員不是很理解期望結(jié)果會(huì)對測試用例的影響,只是把在前置條件(環(huán)境)下執(zhí)行操作步驟,在當(dāng)前頁面下出現(xiàn)的結(jié)果,不會(huì)寫執(zhí)行操作步驟所帶來的所有結(jié)果(不限于當(dāng)個(gè)頁面或者角色),這其實(shí)沒有看到設(shè)計(jì)測試用例時(shí)沒有想到關(guān)聯(lián),關(guān)聯(lián)和流程的重要性很多人都忽略掉,只關(guān)注一個(gè)點(diǎn),沒有想到所有功能點(diǎn)由此操作帶來的影響。測試用例設(shè)計(jì)還要注意著重點(diǎn)
?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Javaweb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts</param-name>
<param-value>
classpath*:struts2.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!-- spring的監(jiān)聽器,以便在啟動(dòng)時(shí)就自動(dòng)加載spring的配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 注:120則設(shè)置過期時(shí)間為120分鐘 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- spring的應(yīng)用上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*/applicationContext.xml</param-value>
</context-param>
</web-app>
Linux程序員有時(shí)偶爾使用
Windows下的cmd工具,會(huì)被逼瘋的,有些命令ls, cat, ps等已經(jīng)條件反射一樣使用。
但在cmd下,根本不知道該用什么命令,好在蓋茲大叔照顧了此部分需求。從Vista開始,推出了PowerShell工具。
PowerShell工具不僅完全包含cmd所有功能,特別對于Linux程序員有兩大利好:
增強(qiáng)的tab補(bǔ)全命令
Unix常用命令ls, cat, ps等的支持,但是參數(shù)格式完全不同,所以不要期望太高。
請注意:
從C:進(jìn)入D:的某個(gè)目錄,不需要分兩步,直接 cd D:\xx即可
別使用仿Unix命令的任何參數(shù),這里的ls等只是一個(gè)PowerShell內(nèi)部命令的別名。
Windows PowerShell ISE > 幫助 > Windows PowerShell 幫助:
其余不再羅嗦,有興趣自己試試吧。