測(cè)試用例分析與設(shè)計(jì)是整個(gè)測(cè)試生命周期中非常重要的一個(gè)活動(dòng),該測(cè)試活動(dòng)的輸出是后續(xù)測(cè)試執(zhí)行的主要輸入,其質(zhì)量直接影響后續(xù)測(cè)試效率、有效性及測(cè)試質(zhì)量。測(cè)試用例分析與設(shè)計(jì)的過程,采用的技術(shù)與方法,以及測(cè)試人員的測(cè)試經(jīng)驗(yàn)與技能等,都會(huì)影響最終的測(cè)試用例質(zhì)量。
圖1是測(cè)試用例設(shè)計(jì)生命周期示意圖。在該示意圖中,包括了測(cè)試用例設(shè)計(jì)相關(guān)的主要測(cè)試活動(dòng),可能可以采用的技術(shù)與方法等。主要的測(cè)試活動(dòng)包括:
1)確認(rèn)測(cè)試用例設(shè)計(jì)的參考輸入來源;
2)識(shí)別初始測(cè)試條件(測(cè)試點(diǎn));
3)采用測(cè)試類型分析與功能交互分析細(xì)化測(cè)試條件;
4)采用測(cè)試用例設(shè)計(jì)技術(shù)與方法設(shè)計(jì)測(cè)試用例;
5)輸出測(cè)試用例規(guī)格說明。

圖1 測(cè)試用例設(shè)計(jì)生命周期
1)確認(rèn)參考輸入來源
測(cè)試用例設(shè)計(jì)不能僅僅依靠測(cè)試人員大腦中的一些經(jīng)驗(yàn)和知識(shí),良好的測(cè)試用例設(shè)計(jì)需要參考各種不同的參考輸入文檔。其中包括:
(1)開發(fā)文檔,指的是軟件開發(fā)過程中的各種軟件工作產(chǎn)品,例如:系統(tǒng)需求規(guī)格說明、概要設(shè)計(jì)規(guī)格說明等;
(2)用戶需求,測(cè)試的工作不僅是驗(yàn)證開發(fā)文檔中定義的要求是否滿足,同時(shí)也需要確認(rèn)軟件產(chǎn)品是否真正滿足用戶的需要。因此,測(cè)試人員了解用戶需要是非常必要的。
(3)標(biāo)準(zhǔn)與規(guī)范,開發(fā)文檔中有些內(nèi)容之來來源于標(biāo)準(zhǔn)與規(guī)范,而沒有在文檔中詳細(xì)描述其中的要求,因此它們也是測(cè)試人員進(jìn)行測(cè)試設(shè)計(jì)的重要參考依據(jù);
(4)類似產(chǎn)品需求,隨著迭代-增量開發(fā)模型應(yīng)用越來越廣,測(cè)試人員經(jīng)產(chǎn)面臨的產(chǎn)品是基于已有系統(tǒng)之上,因此,以前產(chǎn)品的版本信息和質(zhì)量信息對(duì)于當(dāng)前的測(cè)試也很重要;
(5)測(cè)試經(jīng)驗(yàn)知識(shí)庫,可以來自測(cè)試執(zhí)行的經(jīng)驗(yàn)、測(cè)試過程中發(fā)現(xiàn)的缺陷分析和分類、用戶反饋的缺陷的分析和分類等;
(6)其他隱現(xiàn)需求,例如:和開發(fā)人員面談得到的信息、雜志和網(wǎng)絡(luò)中的一些缺陷列表等。
2)識(shí)別初始測(cè)試條件
測(cè)試人員得到測(cè)試用例設(shè)計(jì)的主要參考來源之后,需要對(duì)這些文檔內(nèi)容進(jìn)行仔細(xì)學(xué)習(xí)和研究,并從不同的參考輸入來源中識(shí)別初始的測(cè)試條件(或者測(cè)試點(diǎn))。測(cè)試條件顆粒度可以根據(jù)參考輸入文檔的內(nèi)容來確定,例如:一條需求條目映射為一條初始測(cè)試條件,或者多條需求條目映射為一條初始測(cè)試條件。
3)細(xì)化測(cè)試條件
根據(jù)參考輸入來源獲得的初始測(cè)試條件,通常來說顆粒度是比較粗的,測(cè)試人員需要采用測(cè)試類型分析和功能交互分析等方法進(jìn)行細(xì)化。例如:針對(duì)某條初始測(cè)試條件,測(cè)試人員可以考慮是否在每個(gè)不同的測(cè)試類型上面都需要考慮。詳細(xì)的測(cè)試類型分析與功能交互分析,請(qǐng)參考后續(xù)的文章。
4)設(shè)計(jì)測(cè)試用例
得到細(xì)化的測(cè)試條件之后,測(cè)試人員需要采用不同的測(cè)試用例設(shè)計(jì)技術(shù)與方法,來設(shè)計(jì)具體的測(cè)試用例。在設(shè)計(jì)測(cè)試用例的過程中,測(cè)試人員可能發(fā)現(xiàn)測(cè)試條件需要更新,或者當(dāng)前的測(cè)試條件并適合設(shè)計(jì)。因此3)細(xì)化測(cè)試條件與4)設(shè)計(jì)測(cè)試用例之間并不是單向的測(cè)試活動(dòng),它們之間有時(shí)候需要不斷的相互迭代。
5)輸出測(cè)試用例規(guī)格說明
最后,包含測(cè)試步驟和期望結(jié)果的測(cè)試用例,按照測(cè)試對(duì)象特性或者特性組合形成不同的測(cè)試用例規(guī)格說明。
近段時(shí)間,一部分工作在進(jìn)行自動(dòng)化測(cè)試開發(fā),一部分工作在于資源整合,一部分工作在自動(dòng)化測(cè)試推廣,而感觸最深的就是推廣了,自動(dòng)化測(cè)試難點(diǎn)一在于應(yīng)用,難點(diǎn)二則在于應(yīng)用推廣,再好的技術(shù)底蘊(yùn),再好的形式,沒有一個(gè)好的推廣過程,則也是不行的,根據(jù)這段時(shí)間和過去的一些教訓(xùn),在此總結(jié)一下,希望不對(duì)的大家能指出。
一、現(xiàn)象分析
做過自動(dòng)化測(cè)試推廣的人員應(yīng)該都會(huì)遇到這么幾個(gè)現(xiàn)象:剛開始推廣自動(dòng)化測(cè)試時(shí),測(cè)試人員都很好奇,都會(huì)積極的參與配合,但是測(cè)試人員的熱情在一段時(shí)間之后會(huì)被自動(dòng)化測(cè)試人員的不斷變動(dòng)性所打敗,所以,作為一個(gè)測(cè)試人員,你應(yīng)該把測(cè)試人員的信任值和熱情度牢牢把握。
1、自動(dòng)化測(cè)試人員總是不斷的更新框架,從而導(dǎo)致測(cè)試腳本不斷變更,造成測(cè)試人員不斷去定位測(cè)試腳本和維護(hù)測(cè)試腳本,造成測(cè)試人員對(duì)自動(dòng)化測(cè)試信任度降低。
2、測(cè)試腳本在還未規(guī)模化應(yīng)用的時(shí)候,則去強(qiáng)行的開發(fā)大型的測(cè)試平臺(tái),這樣帶來的問題就是后期的變動(dòng)性造成了平臺(tái)架構(gòu)的變動(dòng),從而導(dǎo)致測(cè)試腳本和測(cè)試平臺(tái)的兼容性差。
3、測(cè)試開發(fā)人員犯的一個(gè)很大的錯(cuò)誤就是不斷推出一系列不成熟的工具,即只想著去開發(fā)一個(gè)工具,而把測(cè)試人員還是當(dāng)成了“測(cè)試人員”,而不是用戶,從而造成了測(cè)試人員對(duì)測(cè)試工具的使用的畏懼性。
4、不夠雙贏;很多時(shí)候,測(cè)試人員做的工作往往被忽略,例如:測(cè)試開發(fā)人員開發(fā)的腳本數(shù)量是一個(gè)績(jī)效,造成對(duì)開發(fā)出的腳本質(zhì)量往往不負(fù)責(zé)任,但是測(cè)試人員對(duì)別人開發(fā)的腳本和環(huán)境的維護(hù)則沒法進(jìn)行量化統(tǒng)計(jì),這樣測(cè)試人員還不如手工測(cè)試來的績(jī)效高,這樣,則造成了測(cè)試人員對(duì)自動(dòng)化測(cè)試的積極性不高。
二、對(duì)現(xiàn)象的思考和實(shí)踐分析
1、腳本的穩(wěn)定性應(yīng)該是放在第一位的,不管剛開始的設(shè)計(jì)和想法多么宏大,你也必須克制自己,不管線性腳本,不管封裝也好,從最基礎(chǔ)開始,讓測(cè)試人員首先感覺到腳本的運(yùn)行順暢性,而不是頻繁的維護(hù)。這也是一個(gè)前期自動(dòng)化測(cè)試的一個(gè)先鋒部對(duì),不求一下攻克,只求快速獲得情報(bào)和前線支持,為后面的大軍進(jìn)發(fā)做準(zhǔn)備。
2、決定開發(fā)了一個(gè)框架的話,那么就要先考慮到可拓展架構(gòu),或者快速做一個(gè)原型,采取功能迭代增加的方式,一定記住的時(shí),能抽像到底層的一定要抽象,千萬不要把特性的東西寫死在底層,而是要分離。不然你會(huì)發(fā)現(xiàn):前期寫死一個(gè)變量,也許會(huì)讓你在后期的某一個(gè)拓展中造成你的所有腳本癱瘓。
3、測(cè)試平臺(tái)、持續(xù)集成平臺(tái)之類的都是架子,個(gè)人覺得,要保證的是:測(cè)試平臺(tái)和測(cè)試腳本是分開的,即測(cè)試腳本可以脫離平臺(tái)單獨(dú)執(zhí)行,而不是腳本需要依賴于平臺(tái)執(zhí)行,因?yàn)橛袝r(shí)候移植工作其實(shí)是一個(gè)很大的工作量,你不能保證你的平臺(tái)永遠(yuǎn)沒有變化,平臺(tái)好變,大量的腳本不好變。
4、預(yù)期開發(fā)一堆的全面化的復(fù)雜的測(cè)試工具,還不如在一個(gè)點(diǎn)上把一個(gè)工具做精了,讓測(cè)試人員真正覺得好用,那么你的自動(dòng)化測(cè)試才能慢慢被他們接受,從而配合你的工作。其實(shí)這種策略很常見:很多平臺(tái)化的公司做大前都是從一個(gè)點(diǎn)開始,把一個(gè)點(diǎn)做精了,這樣就可以以此為入口,從而建立起一個(gè)產(chǎn)品體系。少做即是多做,這真是真理啊。
5、分享一個(gè)我推廣自動(dòng)化測(cè)試的例子:在部門內(nèi)部,以一個(gè)自動(dòng)化測(cè)試活動(dòng)為一個(gè)項(xiàng)目,測(cè)試人員做為項(xiàng)目負(fù)責(zé)人,我則可以作為項(xiàng)目協(xié)助人參與。例如:一個(gè)關(guān)鍵字測(cè)試驅(qū)動(dòng)用例項(xiàng)目,測(cè)試人員來設(shè)計(jì)測(cè)試驅(qū)動(dòng)設(shè)計(jì)文檔,包括劃分的關(guān)鍵字點(diǎn)、環(huán)境、參數(shù)等。由另外的手工測(cè)試執(zhí)行人員來測(cè)試執(zhí)行過程中,組裝關(guān)鍵字,最終形成測(cè)試腳本用例。關(guān)鍵字、文檔以及腳本便作為整個(gè)項(xiàng)目的輸出,以項(xiàng)目為活動(dòng)顆粒的好處是職責(zé)容易細(xì)分,進(jìn)度容易把握,并且最重要的是能夠讓測(cè)試人員主動(dòng)性更強(qiáng)。所以,在推廣過程中,要采用各種策略讓測(cè)試人員的能力提升和職業(yè)發(fā)展相結(jié)合,讓他們的成果突出,這樣你給他負(fù)責(zé),他才對(duì)你負(fù)責(zé)。
總結(jié):其實(shí)推廣過程中,最大的經(jīng)驗(yàn)就是一定要站在不同的角度上思考問題;學(xué)會(huì)以輔助的角度去做人做事;學(xué)會(huì)珍惜別人的時(shí)間和勞動(dòng)成果,學(xué)會(huì)將別人的成果最大化,學(xué)會(huì)雙贏;有時(shí)候?qū)W會(huì)自己寧愿多做點(diǎn),不要告訴比人;也許,這樣,你得到的將是你意想不到的。
先決條件 要充分理解本文,必須具備Windows 環(huán)境下桌面應(yīng)用程序的工作經(jīng)驗(yàn),我認(rèn)為讀者對(duì)如何使用 Linux 桌面有一個(gè)基本的了解。使用一個(gè)運(yùn)行的 Linux 計(jì)算來機(jī)探討本文的概念和示例是很有幫助的。
概述
有時(shí)候第一次在 Linux 上運(yùn)行一個(gè)應(yīng)用程序需要一點(diǎn)額外工作。有些應(yīng)用程序,比如服務(wù)器服務(wù),可能無法安裝為服務(wù),因此您需要從命令行啟動(dòng)這些應(yīng)用程序。對(duì)于啟動(dòng)這些應(yīng)用程序的用戶帳戶而言,需要在應(yīng)用程序文件中設(shè)置執(zhí)行許可標(biāo)志 (x)。
運(yùn)行用戶空間應(yīng)用程序
Linux 在內(nèi)核空間或用戶空間運(yùn)行進(jìn)程。用戶空間 是操作系統(tǒng)的區(qū)域,應(yīng)用程序通常在此運(yùn)行。簡(jiǎn)單地說,每個(gè)用戶帳戶有其自己的用戶空間,應(yīng)用程序在這個(gè)領(lǐng)域內(nèi)運(yùn)行。
默認(rèn)情況下,只有 root 用戶有權(quán)訪問內(nèi)核空間。root 用戶 是 Linux 中的超級(jí)用戶,相當(dāng)于 Windows 中的管理員帳戶。在 root 用戶帳戶下運(yùn)行應(yīng)用程序可能會(huì)引起安全風(fēng)險(xiǎn),是不可取的。
很多服務(wù)器服務(wù)需要 root 權(quán)限啟動(dòng)服務(wù)。然而,服務(wù)啟動(dòng)后,root 帳戶通常會(huì)將其移至服務(wù)帳戶。嚴(yán)格地說,Linux 中的服務(wù)帳戶 才是標(biāo)準(zhǔn)的用戶帳戶。主要區(qū)別是服務(wù)帳戶僅用于運(yùn)行一個(gè)服務(wù),而不是為任何實(shí)際登錄的用戶準(zhǔn)備的。
設(shè)置權(quán)限
您可以使用 chmod 命令在一個(gè)文件中設(shè)置執(zhí)行權(quán)限。在 Linux 中,umask 設(shè)置通常用來防止下載的文件被執(zhí)行,也有充分的理由相信,因?yàn)樗兄诰S護(hù) Linux 計(jì)算機(jī)的安全性。
大多數(shù) Linux 發(fā)行版具有一個(gè)值為 022 的 umask 設(shè)置,這意味著,默認(rèn)情況下一個(gè)新文件權(quán)限設(shè)置為 644。權(quán)限的數(shù)字表示形式采用讀 (4)、寫 (2)、執(zhí)行 (1) 的格式。因此,默認(rèn)權(quán)限為 644 的應(yīng)用程序下載意味著文件所有者有讀寫權(quán)限,而組用戶和其他用戶只有讀權(quán)限。
例如,為每個(gè)人賦予一個(gè)文件的執(zhí)行權(quán)限,使用 chmod a+x 命令。a 表示所有人,加號(hào) (+) 表示添加,而 x 表示執(zhí)行。同樣地,如果應(yīng)用程序是一個(gè)服務(wù)器服務(wù),您應(yīng)該確保只有授權(quán)帳戶才有權(quán)執(zhí)行此服務(wù)。
如果一個(gè)應(yīng)用程序能夠在標(biāo)準(zhǔn)用戶帳戶權(quán)限下運(yùn)行,但只有特定組中的用戶才需要使用它,您可以將該組所有者權(quán)限設(shè)置為可執(zhí)行,然后將這些用戶添加到該組中。
更具體地說,您可以在一個(gè)可執(zhí)行文件中設(shè)置訪問控制列表 (ACL) 權(quán)限,賦予特定用戶或組權(quán)限來運(yùn)行該應(yīng)用程序。使用 setfacl 實(shí)用工具設(shè)置 ACL 權(quán)限。
對(duì)于這些需要以 root 用戶啟動(dòng)進(jìn)程的應(yīng)用程序,比如服務(wù)器服務(wù),您有幾個(gè)選擇。總結(jié)了允許用戶執(zhí)行需要 root 權(quán)限的服務(wù)器服務(wù)的各種選項(xiàng)。
選項(xiàng) | 描述 |
作為 root 用戶 | 不推薦用于服務(wù)器服務(wù)。當(dāng)用戶已經(jīng)知道 root 密碼而且應(yīng)用程序泄露不是首要關(guān)注問題時(shí),可用于應(yīng)用程序。 |
SetUID | 由于安全問題,不推薦使用。SetUID 允許標(biāo)準(zhǔn)用戶以另一個(gè)用戶方式,比如 root 用戶,執(zhí)行一個(gè)文件。 |
sudo | 很常用,并且被認(rèn)為是一個(gè)很好的實(shí)踐。sudo 授予一個(gè)用戶或組成員權(quán)限以執(zhí)行可能額外需要 root 權(quán)限的文件。該用戶不需要知道 root 密碼。 |
帶有文件權(quán)限的標(biāo)準(zhǔn)用戶帳戶 | 在一個(gè)文件上為用戶所有者、組所有者或其他人(所有人)設(shè)置執(zhí)行權(quán)限。這是授予那些不需要 root 權(quán)限來執(zhí)行應(yīng)用程序的用戶的常用方法。 |
帶有 ACL 權(quán)限的標(biāo)準(zhǔn)用戶帳戶 | 使用較少,但是如果您不想授予一個(gè)用戶 sudo 訪問或者更改文件的權(quán)限,這也是一個(gè)可行的解決方案。在一個(gè)文件上使用 setfacl 命令,您可以授予一個(gè)特定用戶或用戶組執(zhí)行該文件的權(quán)力。 |
從命令行運(yùn)行
在管理 Linux 服務(wù)器時(shí),從命令行運(yùn)行應(yīng)用程序是一項(xiàng)基本的任務(wù)。很多應(yīng)用程序使用 shell 腳本(類似于 Windows 批處理文件 .bat)來啟動(dòng)應(yīng)用程序并執(zhí)行其他任務(wù),比如設(shè)置變量以及為其他用戶分配進(jìn)程。例如,應(yīng)用程序可能需要一個(gè) Java? Virtual Machine (JVM) 來執(zhí)行。那樣的話,shell 腳本可以設(shè)置適當(dāng)?shù)沫h(huán)境變量,然后執(zhí)行 Java 命令來運(yùn)行 Java Archive (JAR) 或類文件。這同樣適用于使用 Perl、Python、甚至 C# 的應(yīng)用程序。(當(dāng)然,C# 編譯的應(yīng)用程序可以在 Linux 上運(yùn)行)
從命令行或者 shell 提示符執(zhí)行應(yīng)用程序的一個(gè)常用方法是使用 ./ 命令。如果您在 Linux 中使用句號(hào) (.) 和正斜杠 (/),就意味著告訴環(huán)境您想要以可執(zhí)行文件運(yùn)行該文件。例如,運(yùn)行一個(gè)名為 myapp 的可執(zhí)行文件,您可以使用 ./myapp 命令。同樣地,您可以在文件名之前加上語言環(huán)境,比如:
● sh
● php
● python
● perl
● java
但更多情況下,套裝應(yīng)用程序使用 shell 腳本,以 #! 符號(hào)設(shè)置環(huán)境變量提供該語言的運(yùn)行時(shí)可執(zhí)行路徑,比如 #!/usr/bin/python。您也應(yīng)該熟悉這種方法。
清單 1 使用 catalina.sh 默認(rèn)腳本通過 ./ 方法啟動(dòng) Apache Tomcat 應(yīng)用程序服務(wù)器。然后,使用 sh 方法啟動(dòng)服務(wù)器。因?yàn)槟J(rèn)端口是 8080,標(biāo)準(zhǔn)用戶不需要對(duì)其進(jìn)行特別修改就可以啟動(dòng)該服務(wù)。
清單 1. 從命令行執(zhí)行應(yīng)用程序
$ ./catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar $ ./catalina.sh stop ..................................................................... $ sh catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar |
考慮啟動(dòng)一個(gè)典型 Hypertext Transfer Protocol (HTTP) Web 服務(wù)器。在 Linux 中,任何低于 1024 的端口被認(rèn)為是一個(gè)權(quán)限端口,只有 root 可以打開權(quán)限端口。因?yàn)椋J(rèn)情況下,Web 服務(wù)器運(yùn)行于端口 80,root 需要啟動(dòng)該進(jìn)程。然而,如上所述,以 root 用戶運(yùn)行一個(gè)服務(wù)被認(rèn)為是不安全的。正確的步驟是以 root 啟動(dòng) 該服務(wù),然后將其轉(zhuǎn)移到一個(gè)標(biāo)準(zhǔn)用戶或者服務(wù)帳戶。
幸運(yùn)的是,許多服務(wù)器服務(wù)由腳本來執(zhí)行這一操作。如果您從頭開始構(gòu)建 Apache Web 服務(wù)器,您將會(huì)發(fā)現(xiàn)它以 root 用戶啟動(dòng),然后將 httpd 線程轉(zhuǎn)交給 apache 用戶。
清單 2 啟動(dòng)一個(gè)默認(rèn)的 Apache 2 Web 服務(wù)器編譯。安裝流程也做了一些事情,包括使 apachectl 命令可執(zhí)行。因?yàn)樵摿鞒绦枰褂枚丝?80,使用 root 用戶權(quán)限啟動(dòng)。然而,ps 命令顯示 httpd 流程在 apache 用戶帳戶下運(yùn)行。
清單 2. 啟動(dòng) Apache Web 服務(wù)器
# cd /usr/local/apache2/bin # apachectl start #ps aux | grep httpd apache 23094 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23095 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23096 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23097 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23098 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start |
在后臺(tái)運(yùn)行應(yīng)用程序
一些安裝的軟件可能不像 Apache Web 服務(wù)器那樣用戶友好。您很可能需要在流程啟動(dòng)后以后臺(tái)方式運(yùn)行它,除非您正在進(jìn)行故障排除,或者想要看看應(yīng)用程序到底怎么了。如果您沒有這么 做,shell 關(guān)閉后應(yīng)用程序?qū)⒔K止。運(yùn)行服務(wù)器服務(wù)時(shí),可不希望每次關(guān)閉終端 shell 或者退出時(shí)服務(wù)都會(huì)停止!
如果在后臺(tái)運(yùn)行一個(gè)應(yīng)用程序,即使關(guān)閉了 shell 窗口,應(yīng)用程序也會(huì)繼續(xù)運(yùn)行。您可以通過在執(zhí)行命令結(jié)尾附加一個(gè) (&) 符號(hào)來啟動(dòng)應(yīng)用程序。例如,您可以使用 vi 編輯器打開文件,然后使用 vi /etc/sysconfig/network & 命令在后臺(tái)運(yùn)行該文件,因?yàn)?& 可以打開 /etc/sysconfig/network 文件并將其保留在后臺(tái)。即使在退出后,您也可以使用 nohup 實(shí)用工具支持進(jìn)程繼續(xù)運(yùn)行。例如,nohup vi /etc/sysconfig/network &。
清單 3 在 Vim 編輯器中打開一個(gè)用來編輯的文件,然后將其放在后臺(tái)。
清單 3. 在后臺(tái)運(yùn)行應(yīng)用程序
# vi /etc/sysconfig/network & [1] 24940 # jobs [1]+ Stopped vi /etc/sysconfig/network |
您可以輸入 jobs 命令來查看您在后臺(tái)上運(yùn)行的所有應(yīng)用程序。為在后臺(tái)上運(yùn)行的每個(gè)任務(wù)分配了一個(gè)序列號(hào),從 1 開始。 清單 3 中的任務(wù)序列號(hào)是 1。24940 是進(jìn)程 ID (PID)。您可以使用 fg 命令和特定的任務(wù)號(hào)將應(yīng)用程序移到前臺(tái)。在本例中,進(jìn)程沒有被用戶所使用,因此顯示為 Stopped。但是,命令 fg 1 打開終端并回到編輯文件的活動(dòng)進(jìn)程。
從桌面運(yùn)行應(yīng)用程序
在 Linux 中從桌面運(yùn)行圖形用戶界面 (GUI) 應(yīng)用程序與在 Windows 中沒多大區(qū)別。通常,您需要了解特定的桌面環(huán)境下應(yīng)用程序在菜單中是如何分組的。Linux 有足夠的桌面應(yīng)用程序,可用于各種任務(wù)。有一些應(yīng)用程序是 Linux 本機(jī)固有的,還有另外一些應(yīng)用程序可能是在一個(gè)常用運(yùn)行時(shí)環(huán)境中使用 C# 開發(fā)的跨平臺(tái)應(yīng)用程序,比如,.NET Framework 應(yīng)用程序。您會(huì)發(fā)現(xiàn),使用一個(gè) Wine 這樣的虛擬環(huán)境,您甚至可以在 Linux 上運(yùn)行您最喜愛的 Windows 應(yīng)用程序。
Linux 本機(jī)應(yīng)用程序 您很有可能會(huì)為您最喜愛的基于 Windows 的應(yīng)用程序找到一個(gè)替代的 Linux 應(yīng)用程序。在桌面上運(yùn)行 Linux 本機(jī)應(yīng)用程序比較直觀。與 Windows 一樣,您通常可以在菜單中找到這些已組織的應(yīng)用程序,當(dāng)您想要一個(gè) Windows 應(yīng)用程序時(shí),只需單擊并運(yùn)行即可。
對(duì)于那些需要 root 權(quán)限的應(yīng)用程序,將會(huì)提示您輸入 root 密碼,然后才開始運(yùn)行。這在概念上類似于 Windows 中的 Run as Administrator 選項(xiàng)。否則,您運(yùn)行的所有程序都會(huì)位于您所登錄帳戶的用戶空間中。
在 Windows 中,您可以創(chuàng)建桌面快捷鍵。Linux 也有類似的快捷鍵 launcher,您可以將它放在面板或桌面上。單擊 launcher 時(shí),快捷鍵將執(zhí)行程序。
圖 1 顯示 GNOME Desktop 上 Mozilla Firefox Web 瀏覽器的兩個(gè) launcher。一個(gè) launcher 位于面板上,另一個(gè)位于桌面上。
圖 1. 查看桌面或面板上的 launcher

Mono
許多 Windows 應(yīng)用程序都是使用 .NET Framework 開發(fā)的。Mono 是 .NET 的一個(gè)開源實(shí)現(xiàn),可在很多平臺(tái)上運(yùn)行(包括 linux)。事實(shí)上,Mono 網(wǎng)站稱其為 C# 和 Common Language Runtime (CLR) 的一個(gè)實(shí)現(xiàn),與 .Net 是二進(jìn)制兼容的。此項(xiàng)目目前由 Xamarin 支持。
在 Linux 上,您可以執(zhí)行使用 .NET framework(或 Mono)開發(fā)的應(yīng)用程序,就像在 Windows 上一樣。但是,記住 Linux umask 和默認(rèn)文件權(quán)限。您仍然需要提供文件的執(zhí)行權(quán)限,這樣 Linux 才會(huì)允許執(zhí)行可執(zhí)行文件。
在 Mono(可以安裝在您的 Linux GNOME 桌面上)上開發(fā)的一些跨平臺(tái)應(yīng)用程序,比如 F-Spot,同本機(jī) GNOME 應(yīng)用程序一同位于菜單中。F-Spot 是一個(gè)管理照片的開源應(yīng)用程序。盡管它是 C# 應(yīng)用程序,但是在 GNOME 桌面上表現(xiàn)為一個(gè)本機(jī)應(yīng)用程序。為應(yīng)用程序創(chuàng)建一個(gè) launcher 后,就可以像在 Windows 中那樣單擊并運(yùn)行。
圖 2 演示了基于 Mono 的應(yīng)用程序 F-Spot 的位置,以及為其創(chuàng)建桌面或面板 launcher 的方法。
圖 2. 為 F-Spot 創(chuàng)建一個(gè) launcher

Wine
Wine 使您可以在 Linux 和其他操作系統(tǒng)上運(yùn)行 Windows 軟件。有了 Wine,您就可以像在 Windows 中那樣安裝和運(yùn)行應(yīng)用程序。Wine 仍然在積極的發(fā)展中,而且并不是所有的 Windows 程序都可以使用 Wine。如果您的應(yīng)用程序是為 Windows 操作系統(tǒng)編譯的,您就會(huì)發(fā)現(xiàn)它可以使用 Wine 來充分運(yùn)行,前題是它是一個(gè)桌面應(yīng)用程序而不是一個(gè)服務(wù)器應(yīng)用程序。一定要檢查 Wine 文檔關(guān)于在 Linux 上運(yùn)行該應(yīng)用程序的可行性,因?yàn)? Wine 并不完全支持所有的應(yīng)用程序。
當(dāng)您在 Linux 中使用 Wine 時(shí),在您帳戶主目錄下有一個(gè)模擬 Windows 環(huán)境的隱藏文件夾,如 清單 4 所示。
清單 4. 模擬 Windows 環(huán)境的 Wine 的隱藏文件夾
$ cd /home/tbost/.wine/drive_c/windows $ls cf8e.tmp command explorer.exe Fonts help hh.exe inf Installer ls.txt Microsoft.NET notepad.exe pwd.txt regedit.exe rundll.exe system system32 system.ini temp twain_32.dll twain.dll winhelp.exe winhlp32.exe win.ini winsxs |
使用 Wine 安裝一個(gè)應(yīng)用程序之后,您通常可以在桌面菜單中找到它,然后以在 Windows 中同樣的方式來運(yùn)行。
例如,Camstudio 是一個(gè)開源工具,用于記錄和管理屏幕視頻。目前還沒有 Linux 操作系統(tǒng)的版本。但是,使用 Wine 就可以在 Linux 桌面安裝 Windows 版本。與 Wine 相關(guān)的應(yīng)用程序通常分組為 Applications > Wine > Programs,如 圖 3 所示。
圖 3. 使用 Wine 在 Linux 上運(yùn)行一個(gè) Windows 應(yīng)用程序

結(jié)束語
在管理一個(gè) Linux 服務(wù)器時(shí),您肯定會(huì)遇到從桌面和命令行執(zhí)行軟件的問題。了解如何設(shè)置適當(dāng)?shù)臋?quán)限和用戶帳戶后,您就可以安全地運(yùn)行這些應(yīng)用程序。使用長期運(yùn)行的進(jìn)程,比如 服務(wù)器服務(wù),您可以從命令行執(zhí)行,并在后臺(tái)進(jìn)行適當(dāng)設(shè)置。如果您的應(yīng)用程序適合于從桌面運(yùn)行,也可以那樣做,有時(shí)候甚至可以是 Windows 應(yīng)用程序!
很多核心Java面試題來源于多線程(Multi-Threading)和集合框架(Collections Framework),理解核心線程概念時(shí),嫻熟的實(shí)際經(jīng)驗(yàn)是必需的。這篇
文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級(jí)工程師所問到。
0、Java 中多線程同步是什么?
在多線程程序下,同步能控制對(duì)共享資源的訪問。如果沒有同步,當(dāng)一個(gè) Java 線程在修改一個(gè)共享變量時(shí),另外一個(gè)線程正在使用或者更新同一個(gè)變量,這樣容易導(dǎo)致程序出現(xiàn)錯(cuò)誤的結(jié)果。
1、解釋實(shí)現(xiàn)多線程的幾種方法?
一 Java 線程可以實(shí)現(xiàn) Runnable 接口或者繼承 Thread 類來實(shí)現(xiàn),當(dāng)你打算多重繼承時(shí),優(yōu)先選擇實(shí)現(xiàn) Runnable。
2、Thread.start ()與 Thread.run ()有什么區(qū)別?
Thread.start ()方法(native)啟動(dòng)線程,使之進(jìn)入就緒狀態(tài),當(dāng) cpu 分配時(shí)間該線程時(shí),由 JVM 調(diào)度執(zhí)行 run ()方法。

3、為什么需要 run ()和 start ()方法,我們可以只用 run ()方法來完成任務(wù)嗎?
我們需要 run ()&start ()這兩個(gè)方法是因?yàn)?JVM 創(chuàng)建一個(gè)單獨(dú)的線程不同于普通方法的調(diào)用,所以這項(xiàng)工作由線程的 start 方法來完成,start 由本地方法實(shí)現(xiàn),需要顯示地被調(diào)用,使用這倆個(gè)方法的另外一個(gè)好處是任何一個(gè)對(duì)象都可以作為線程運(yùn)行,只要實(shí)現(xiàn)了 Runnable 接口,這就避免因繼承了 Thread 類而造成的 Java 的多繼承問題。
4、什么是 ThreadLocal 類,怎么使用它?
ThreadLocal 是一個(gè)線程級(jí)別的局部變量,并非“本地線程”。ThreadLocal 為每個(gè)使用該變量的線程提供了一個(gè)獨(dú)立的變量副本,每個(gè)線程修改副本時(shí)不影響其它線程對(duì)象的副本(譯者注)。
下面是線程局部變量(ThreadLocal variables)的關(guān)鍵點(diǎn):
一個(gè)線程局部變量(ThreadLocal variables)為每個(gè)線程方便地提供了一個(gè)單獨(dú)的變量。
ThreadLocal 實(shí)例通常作為靜態(tài)的私有的(private static)字段出現(xiàn)在一個(gè)類中,這個(gè)類用來關(guān)聯(lián)一個(gè)線程。
當(dāng)多個(gè)線程訪問 ThreadLocal 實(shí)例時(shí),每個(gè)線程維護(hù) ThreadLocal 提供的獨(dú)立的變量副本。
常用的使用可在 DAO 模式中見到,當(dāng) DAO 類作為一個(gè)單例類時(shí),數(shù)據(jù)庫鏈接(connection)被每一個(gè)線程獨(dú)立的維護(hù),互不影響。(基于線程的單例)
ThreadLocal 難于理解,下面這些引用連接有助于你更好的理解它。
《Good article on ThreadLocal on IBM DeveloperWorks 》、《理解 ThreadLocal》、《Managing data : Good example》、《Refer Java API Docs》
5、什么時(shí)候拋出 InvalidMonitorStateException 異常,為什么?
調(diào)用 wait ()/notify ()/notifyAll ()中的任何一個(gè)方法時(shí),如果當(dāng)前線程沒有獲得該對(duì)象的鎖,那么就會(huì)拋出 IllegalMonitorStateException 的異常(也就是說程序在沒有執(zhí)行對(duì)象的任何同步塊或者同步方法時(shí),仍然嘗試調(diào)用 wait ()/notify ()/notifyAll ()時(shí))。由于該異常是 RuntimeExcpetion 的子類,所以該異常不一定要捕獲(盡管你可以捕獲只要你愿意).作為 RuntimeException,此類異常不會(huì)在 wait (),notify (),notifyAll ()的方法簽名提及。
6、Sleep ()、suspend ()和 wait ()之間有什么區(qū)別? Thread.sleep ()使當(dāng)前線程在指定的時(shí)間處于“非運(yùn)行”(Not Runnable)狀態(tài)。線程一直持有對(duì)象的監(jiān)視器。比如一個(gè)線程當(dāng)前在一個(gè)同步塊或同步方法中,其它線程不能進(jìn)入該塊或方法中。如果另一線程調(diào)用了 interrupt ()方法,它將喚醒那個(gè)“睡眠的”線程。
注意:sleep ()是一個(gè)靜態(tài)方法。這意味著只對(duì)當(dāng)前線程有效,一個(gè)常見的錯(cuò)誤是調(diào)用t.sleep (),(這里的t是一個(gè)不同于當(dāng)前線程的線程)。即便是執(zhí)行t.sleep (),也是當(dāng)前線程進(jìn)入睡眠,而不是t線程。t.suspend ()是過時(shí)的方法,使用 suspend ()導(dǎo)致線程進(jìn)入停滯狀態(tài),該線程會(huì)一直持有對(duì)象的監(jiān)視器,suspend ()容易引起死鎖問題。
object.wait ()使當(dāng)前線程出于“不可運(yùn)行”狀態(tài),和 sleep ()不同的是 wait 是 object 的方法而不是 thread。調(diào)用 object.wait ()時(shí),線程先要獲取這個(gè)對(duì)象的對(duì)象鎖,當(dāng)前線程必須在鎖對(duì)象保持同步,把當(dāng)前線程添加到等待隊(duì)列中,隨后另一線程可以同步同一個(gè)對(duì)象鎖來調(diào)用 object.notify (),這樣將喚醒原來等待中的線程,然后釋放該鎖。基本上 wait ()/notify ()與 sleep ()/interrupt ()類似,只是前者需要獲取對(duì)象鎖。
7、在靜態(tài)方法上使用同步時(shí)會(huì)發(fā)生什么事?
同步靜態(tài)方法時(shí)會(huì)獲取該類的“Class”對(duì)象,所以當(dāng)一個(gè)線程進(jìn)入同步的靜態(tài)方法中時(shí),線程監(jiān)視器獲取類本身的對(duì)象鎖,其它線程不能進(jìn)入這個(gè)類的任何靜態(tài)同步方法。它不像實(shí)例方法,因?yàn)槎鄠€(gè)線程可以同時(shí)訪問不同實(shí)例同步實(shí)例方法。
8、當(dāng)一個(gè)同步方法已經(jīng)執(zhí)行,線程能夠調(diào)用對(duì)象上的非同步實(shí)例方法嗎?
可以,一個(gè)非同步方法總是可以被調(diào)用而不會(huì)有任何問題。實(shí)際上,Java 沒有為非同步方法做任何檢查,鎖對(duì)象僅僅在同步方法或者同步代碼塊中檢查。如果一個(gè)方法沒有聲明為同步,即使你在使用共享數(shù)據(jù) Java 照樣會(huì)調(diào)用,而不會(huì)做檢查是否安全,所以在這種情況下要特別小心。一個(gè)方法是否聲明為同步取決于臨界區(qū)訪問(critial section access),如果方法不訪問臨界區(qū)(共享資源或者數(shù)據(jù)結(jié)構(gòu))就沒必要聲明為同步的。
下面有一個(gè)示例說明:Common 類有兩個(gè)方法 synchronizedMethod1()和 method1(),MyThread 類在獨(dú)立的線程中調(diào)用這兩個(gè)方法。
- public class Common {
-
- public synchronized void synchronizedMethod1() {
- System.out.println ("synchronizedMethod1 called");
- try {
- Thread.sleep (1000);
- } catch (InterruptedException e) {
- e.printStackTrace ();
- }
- System.out.println ("synchronizedMethod1 done");
- }
- public void method1() {
- System.out.println ("Method 1 called");
- try {
- Thread.sleep (1000);
- } catch (InterruptedException e) {
- e.printStackTrace ();
- }
- System.out.println ("Method 1 done");
- }
- }
|
- public class MyThread extends Thread {
- private int id = 0;
- private Common common;
-
- public MyThread (String name, int no, Common object) {
- super(name);
- common = object;
- id = no;
- }
-
- public void run () {
- System.out.println ("Running Thread" + this.getName ());
- try {
- if (id == 0) {
- common.synchronizedMethod1();
- } else {
- common.method1();
- }
- } catch (Exception e) {
- e.printStackTrace ();
- }
- }
-
- public static void main (String[] args) {
- Common c = new Common ();
- MyThread t1 = new MyThread ("MyThread-1", 0, c);
- MyThread t2 = new MyThread ("MyThread-2", 1, c);
- t1.start ();
- t2.start ();
- }
- }
|
字體: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿
10、什么是死鎖
死鎖就是兩個(gè)或兩個(gè)以上的線程被無限的阻塞,線程之間相互等待所需資源。這種情況可能發(fā)生在當(dāng)兩個(gè)線程嘗試獲取其它資源的鎖,而每個(gè)線程又陷入無限等待其它資源鎖的釋放,除非一個(gè)用戶進(jìn)程被終止。就 JavaAPI 而言,線程死鎖可能發(fā)生在一下情況。
● 當(dāng)兩個(gè)線程相互調(diào)用 Thread.join()
● 當(dāng)兩個(gè)線程使用嵌套的同步塊,一個(gè)線程占用了另外一個(gè)線程必需的鎖,互相等待時(shí)被阻塞就有可能出現(xiàn)死鎖。
11、什么是線程餓死,什么是活鎖?
線程餓死和活鎖雖然不想是死鎖一樣的常見問題,但是對(duì)于并發(fā)編程的設(shè)計(jì)者來說就像一次邂逅一樣。
當(dāng)所有線程阻塞,或者由于需要的資源無效而不能處理,不存在非阻塞線程使資源可用。JavaAPI 中線程活鎖可能發(fā)生在以下情形:
● 當(dāng)所有線程在程序中執(zhí)行 Object.wait(0),參數(shù)為 0 的 wait 方法。程序?qū)l(fā)生活鎖直到在相應(yīng)的對(duì)象上有線程調(diào)用 Object.notify()或者 Object.notifyAll()。
● 當(dāng)所有線程卡在無限循環(huán)中。
這里的問題并不詳盡,我相信還有很多重要的問題并未提及,您認(rèn)為還有哪些問題應(yīng)該包括在上面呢?歡迎在評(píng)論中分享任何形式的問題與建議。
相關(guān)鏈接:
Java程序員集合框架面試題
四、需求分析→數(shù)據(jù)庫設(shè)計(jì)
從這開始,就真正進(jìn)入項(xiàng)目實(shí)戰(zhàn)啦。先說點(diǎn)體會(huì),我剛開始接觸編程的時(shí)候,都是編寫一些小東西,往往都是半天或者一天什么的就編完了,那時(shí)候根本沒想過做程序之前還要有需求分析。經(jīng)過快兩年的學(xué)習(xí), 接觸的都是比較大的系統(tǒng),才明白沒有需求分析的程序都太業(yè)余了,沒有任何技術(shù)含量。對(duì)于一個(gè)系統(tǒng)來說,如果需求分析不到位,那么將有災(zāi)難性的后果,從這節(jié) 的小標(biāo)題就能看出,需求是數(shù)據(jù)庫設(shè)計(jì)的基石,需求定了,數(shù)據(jù)庫基本上就定了,數(shù)據(jù)庫定了,程序的基本功能也就定了。我們以一個(gè)簡(jiǎn)單的學(xué)生管理系統(tǒng)為例子, 來分析一下需求。分析需求地球人一般都是用UML圖,啥是UML圖呢,就是一種把程序用圖形表示的標(biāo)準(zhǔn),它可以表示需求、程序流程、程序模塊、程序功能等 等,可以說,UML圖畫完了,程序基本上就出來了,目前比較好的畫UML的工具是Rational rose,不多說啦,剩下的就交給google了。本系統(tǒng)的需求非常簡(jiǎn)單,就是老師可以添加、刪除、修改學(xué)生記錄,學(xué)生的記錄包括:學(xué)號(hào)、年級(jí)、班級(jí)、姓名、性別、年齡、備注(這些就是字段)。根據(jù)這些敘述,我們可以畫出UML用例圖(用例圖就是用來分析需求的):

根據(jù)需求分析我們就可以設(shè)計(jì)數(shù)據(jù)庫了,非常“簡(jiǎn)單”嘛,需要一個(gè)表就行了,把它命名為student表,里邊添加剛剛提的那些字段就可以了。注意,數(shù)據(jù) 庫中的一切,包括:數(shù)據(jù)庫名、表名、字段名、存儲(chǔ)過程等等,都要用英文,不可以出現(xiàn)中文,因?yàn)樵凼菍I(yè)菜鳥,不走業(yè)余路。接著往下看,教你如何創(chuàng)建數(shù)據(jù) 庫。
作為專業(yè)教程,俺不會(huì)教你用鼠標(biāo)建立數(shù)據(jù)庫,咱們要用T-SQL語句建立數(shù)據(jù)庫,也就是寫數(shù)據(jù)庫腳本。這樣建立數(shù)據(jù)庫,相當(dāng)于留了個(gè)備份,無論到哪,只要有SQL環(huán)境,直接執(zhí)行一下腳本數(shù)據(jù)就建好了,非常方便快捷,就算是第一次寫腳本,也比用鼠標(biāo)建立數(shù)據(jù)庫快。在大型系統(tǒng)開發(fā)時(shí),腳本還可以作為數(shù)據(jù)庫維護(hù)的依據(jù),非常有用。那么怎樣寫呢,打開SQL server 2005 Management Studio,輸入帳號(hào)密碼登錄平臺(tái),然后點(diǎn)一下左上角的"新建查詢"就可以打開查詢分析器了,我們可以在這輸入任何SQL語句。
第一步先創(chuàng)建數(shù)據(jù)庫,我先把創(chuàng)建數(shù)據(jù)庫的標(biāo)準(zhǔn)格式給大家:
create database studentManager On primary ( name=student_data, filename='E:\SQL Server2008 SQLFULL_CHS\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_data.mdf', size=3, maxsize=unlimited, filegrowth=1 ) Log on (name=student_log, filename='E:\SQL Server2008 SQLFULL_CHS\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\student_log.ldf', size=1, maxsize=20, |
相信看著這個(gè)很多人都蒙了,簡(jiǎn)單說一下,其實(shí)這么多代碼,也就第一句最重要,意思是創(chuàng)建一個(gè)名字叫studentManager的數(shù)據(jù)庫。On primary下邊的是對(duì)數(shù)據(jù)庫的一些初始設(shè)置,比如:路徑、初始大小、增量等等。Log on下邊的是對(duì)數(shù)據(jù)庫日志的 設(shè)置,也是那么幾項(xiàng)。很明確的告訴大家,除非是特殊需求,否則我們沒必要管那么多,默認(rèn)的就夠咱們用了,創(chuàng)建數(shù)據(jù)庫就一句話:create database studentManager,輸入完后點(diǎn)一下工具欄上的“執(zhí)行”,就搞定啦。數(shù)據(jù)庫建完了,就該在數(shù)據(jù)庫里建表了,還是先給出代碼:
--指定數(shù)據(jù)庫
use t_studentManager;
--創(chuàng)建t_student表
create table t_student
(
number varchar(20) PRIMARY KEY, --PRIMARY KEY 是主鍵約束
grade varchar(10) NOT NULL, --NOT NULL是非空約束
class varchar(10) NOT NULL,
[name] varchar(20) NOT NULL, --name屬于sql保留字,所以用方括號(hào)括起來
sex varchar(1) NOT NULL CHECK(sex in ('男','女')), --CHECK約束,意思是性別字段只能是男或女。
age int NOT NULL,
remark varchar(100),
addTime datetime DEFAULT(getdate())--默認(rèn)值約束,getdate()獲取服務(wù)器時(shí)間
);
給大家解釋一下,剛剛我們創(chuàng)建完數(shù)據(jù)庫,在這要引用一下,也就是use,這樣才可以在指定數(shù)據(jù)庫中建表。
create table當(dāng)然就是建表的意思了,在表名前最好加一個(gè)“t_”,表示是表(table),這樣容易區(qū)分,而且專業(yè)。括號(hào)里的就是這個(gè)表中的字段,格式是: 字段名類型 約束,注意每個(gè)字段寫完后邊都要加逗號(hào)(最后一個(gè)就不用加啦),表示分隔。舉這個(gè)例子,約束用的還是比較全的,重點(diǎn)說說約束。約束可是數(shù)據(jù)庫中相當(dāng)重要的 東西,它保證了數(shù)據(jù)庫的安全和穩(wěn)定,同時(shí)也保證了數(shù)據(jù)完整性。約束主要有6種,分別是:NOT NULL約束(非空約束)、PRIMARY KEY約束(主鍵約束)、FOREIGN KEY約束(外鍵約束)、UNIQUE約束(唯一約束)、CHECK約束(檢查約束)、DEFAULT約束(默認(rèn)值約束)。這些約束可以用在任何字段的后 邊,一個(gè)字段也可以有多個(gè)約束,用空格分隔即可,比如上邊的sex字段,就同時(shí)使用了非空約束和檢查約束。當(dāng)然,有些約束只能用一次,比如主鍵約束。我只 是提了一下這些常用約束,大家了解我的目的就達(dá)到了,以后具體用到,再去google,就怕你不知道有這些約束。在查詢分析器中執(zhí)行這段代碼,表就建立好 了,提示一下:SQL查詢分析器可以選中執(zhí)行,也就是你選中那些代碼就執(zhí)行那些代碼,建表的時(shí)候注意不要再次執(zhí)行建數(shù)據(jù)庫的語句哦。
五、優(yōu)化數(shù)據(jù)庫。
數(shù)據(jù)庫設(shè)計(jì)是程序的根基,也是一門藝術(shù)。上一節(jié)我們?cè)O(shè)計(jì)的數(shù)據(jù)庫,太隨意了,什么都沒有考慮,作為專業(yè)菜鳥,這樣是不行的。
優(yōu)化數(shù)據(jù)庫,先要了解數(shù)據(jù)庫設(shè)計(jì)三范式,簡(jiǎn)單說下:
1、第一范式:是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。
2、第二范式:第二范式需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。
3、第三范式:第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。
這三個(gè)范式大致的意思就是:數(shù)據(jù)庫中表的職責(zé)要單一,依賴關(guān)系明確,盡量減少數(shù)據(jù)庫數(shù)據(jù)冗余。從網(wǎng)上查,可以查到很多個(gè)人理解,我在這也不理解 了,核心思想就是我剛剛說的。我首先聲明,三范式只是一個(gè)整體的指導(dǎo)思想,并不可能完全遵從,有時(shí)候數(shù)據(jù)冗余未必是壞事,要考慮實(shí)際情況。
很明顯,剛剛我們?cè)O(shè)計(jì)的數(shù)據(jù)庫不符合三范式的要求。在此表中學(xué)生應(yīng)該依賴的是學(xué)號(hào),而我們冒昧的把班級(jí)、年級(jí)也放在了這里,學(xué)生當(dāng)然也應(yīng)該依賴 于班級(jí)、年級(jí)。這樣一來,表就亂了,造成的直接后果就是數(shù)據(jù)不完整,比如我們由于失誤,插入了一個(gè)年級(jí)是100的學(xué)生,而根本就沒有100這個(gè)班級(jí)。這樣 還有個(gè)比較大的問題就是數(shù)據(jù)冗余,因?yàn)槲覀兠坎迦胍粋€(gè)學(xué)生,不得不記錄一次班級(jí)、年級(jí),造成大量無用數(shù)據(jù)。所以我們要改,要把一個(gè)表拆成三個(gè),分別是:年 級(jí)表、班級(jí)表、學(xué)生表。這樣一來,數(shù)據(jù)庫就顯得漂亮多了。剛剛是一個(gè)表,我們還應(yīng)付得過來,現(xiàn)在三個(gè)表,記不住了怎么辦?別急,剛剛提到了UML圖,它可 以用來設(shè)計(jì)數(shù)據(jù)庫。在程序設(shè)計(jì)過程中,數(shù)據(jù)庫中的每一個(gè)表,都會(huì)在程序中映射成一個(gè)類,而表中的每一個(gè)字段,都是類中的一個(gè)屬性,它們的類型是一致的,我 們管他叫做實(shí)體類(可以提前google一下三層架構(gòu)哦),這時(shí)我們可以借助于UML中的類圖畫出數(shù)據(jù)庫的結(jié)構(gòu)。如下圖:

通過UML類圖,清晰的描述了表之間的關(guān)系。所以,在大型項(xiàng)目開發(fā)中,必須借助工具設(shè)計(jì)數(shù)據(jù)庫,展示數(shù)據(jù)庫的結(jié)構(gòu)和關(guān)系,這樣我們才能優(yōu)化、改進(jìn) 數(shù)據(jù)庫,數(shù)據(jù)庫不是一下就能設(shè)計(jì)成功的,往往要根據(jù)需求的理解而發(fā)生變動(dòng)。很多童鞋可能會(huì)問為什么用實(shí)體類,我只說一句話:用實(shí)體類便于在程序中對(duì)數(shù)據(jù)庫 進(jìn)行操作,實(shí)體類是對(duì)數(shù)據(jù)的打包,便于數(shù)據(jù)傳遞。剩下的就要去google啦~不多說。這下我們的數(shù)據(jù)庫設(shè)計(jì)算是完工了,刪掉原來的數(shù)據(jù)庫,對(duì)照這UML 實(shí)體類圖寫優(yōu)化后的數(shù)據(jù)庫腳本,代碼如下:
--創(chuàng)建數(shù)據(jù)庫 create database studentManager; --指定數(shù)據(jù)庫 use t_studentManager; --創(chuàng)建年級(jí)表 create table t_grade ( id bigint IDENTITY(1,1) PRIMARY KEY, [name] varchar(10) NOT NULL ); --創(chuàng)建班級(jí)表 create table t_class ( id bigint IDENTITY(1,1) PRIMARY KEY, gradeID bigint NOT NULL, [name] varchar(10) NOT NULL, CONSTRAINT FK_class_gradeID FOREIGN KEY(gradeID) REFERENCES t_grade(id) --外鍵約束 ); --創(chuàng)建t_student表 create table t_student ( number varchar(20) PRIMARY KEY, --PRIMARY KEY 是主鍵約束 classID bigint NOT NULL, [name] varchar(20) NOT NULL, --name屬于sql保留字,所以用方括號(hào)括起來 sex varchar(1) NOT NULL CHECK(sex in ('男','女')), --CHECK約束,意思是性別字段只能是男或女。 age int NOT NULL, remark varchar(100), addTime datetime DEFAULT(getdate()),--默認(rèn)值約束,getdate()獲取服務(wù)器時(shí)間 CONSTRAINT FK_student_classID FOREIGN KEY(classID) REFERENCES t_class(id) --外鍵約束 ); |
在講代碼之前,必須先說什么是外鍵約束,外鍵約束就是:A表的某個(gè)字段用到了B表的主鍵字段,那么A表中的這個(gè)字段就叫外鍵,A、B兩個(gè)表間的 約束關(guān)系就叫外鍵約束。A表的外鍵字段必須依賴于B表的主鍵字段,如果向A表外鍵字段中添加一個(gè)B表主鍵字段中不存在的數(shù)據(jù),那么將失敗。外鍵約束保證了 數(shù)據(jù)的完整性和合理性。
這段代碼,我還是要重點(diǎn)說說約束,與上一次創(chuàng)建表不同的是,不僅僅是表多了,而且最后多了外鍵約束,CONSTRAINT是創(chuàng)建一個(gè)約束,后邊 接約束名;FOREIGN KEY代表該約束是外鍵約束,括號(hào)里寫字段名,代表這個(gè)字段是外鍵;REFERENCES是參考的意思,也就是參考哪個(gè)表里的哪個(gè)字段,也就是主鍵在哪, 后邊接"表名(字段名)"。其實(shí)我是故意把它寫在最后的邊的,外鍵約束也是約束,完全可以放在字段定義的最后邊,也就是NOT NULL那個(gè)位置上,我這樣寫是想告訴大家還有另一種寫法,所有的約束都可以類似這樣寫,就是換個(gè)位置,我現(xiàn)在提出來避免大家以后見到發(fā)蒙。需要注意的 是,創(chuàng)建表的括號(hào)里,無論是寫約束還是寫字段,都要用逗號(hào)分隔,千萬別忘了。
最近讀了Steve Souders的High Performance
Web Sites: Essential Knowledge for Frontend Engineers(O’Reilly, 2007),這本書的副標(biāo)題是 “14 Steps to Faster-Loading Web Sites”。在你發(fā)現(xiàn)此書面向?qū)ο鬄殚_發(fā)人員,從而停止閱讀之前,考慮以下幾點(diǎn):
● 作者的研究表明,網(wǎng)頁響應(yīng)時(shí)間約80%-90%是由前端設(shè)計(jì)決定的。而我的經(jīng)驗(yàn)中,這個(gè)數(shù)字更應(yīng)該是50%-80%,但我的經(jīng)驗(yàn)多來自于那些被重新設(shè)計(jì)為WEB架構(gòu)的多用戶應(yīng)用,或者是那些有著嚴(yán)重后端性能問題的應(yīng)用(請(qǐng)我來定位問題)。
● 和性能測(cè)試人員有關(guān)的幾乎所有的工具、培訓(xùn)、文章和會(huì)議,都集中在系統(tǒng)的后端。以至于大部分人認(rèn)為,系統(tǒng)的前端性能無需擔(dān)心,因?yàn)槲覀儫o法控制客戶端的系統(tǒng)。
● 根據(jù)我的經(jīng)驗(yàn),網(wǎng)站的前端設(shè)計(jì)和開發(fā),幾乎不會(huì)考慮到性能問題,除了盡量減小圖片的大小。我也從未讓團(tuán)隊(duì)做過客戶端頁面的HTML代碼審查,從未在這些代碼上做過單元測(cè)試,也從未見過測(cè)試人員有意的對(duì)HTML進(jìn)行一些性能測(cè)試。
結(jié)合上面幾點(diǎn),你將得知,沒有人關(guān)注頁面上的可能存在的性能優(yōu)化,而這種優(yōu)化很可能是最容易實(shí)現(xiàn),效果卻又最明顯的。讀了這本書我發(fā)現(xiàn),我經(jīng)常對(duì)大多數(shù) 的前端性能問題進(jìn)行測(cè)試,但自己卻沒有意識(shí)到。作者提到的一些內(nèi)容,我可能永遠(yuǎn)也不會(huì)想到去測(cè)試,不對(duì)這些內(nèi)容進(jìn)行更主動(dòng)的測(cè)試是個(gè)錯(cuò)誤,這些測(cè)試的成本 是非常低的,無論是在時(shí)間上,還是在所需的工具和資源上。實(shí)際上,在測(cè)試網(wǎng)站的時(shí)候,我經(jīng)常拿出整個(gè)性能測(cè)試的前15分鐘來完成大部分的前端測(cè)試,雖然我 承認(rèn),15分鐘只夠測(cè)試幾個(gè)頁面。
通過這篇文章,我講解了如何通過手工、負(fù)載生成工具、網(wǎng)絡(luò)協(xié)議分析工具、助手網(wǎng)站以及瀏覽器插件,來進(jìn)行測(cè)試。我已經(jīng)通過以下免費(fèi)工具(不是免費(fèi)試用版,是無任何限制的免費(fèi)版)完成了這些工作。 如果你的公司不允許使用免費(fèi)軟件,我相信只要簡(jiǎn)單的搜索一下,就可以找到一堆可以替代的工具,這些工具將花費(fèi)你公司足夠多的錢,從而讓他們重視。(如果你 認(rèn)為這只是個(gè)笑話,很可惜它不是。在咨詢過我的團(tuán)隊(duì)和接受我培訓(xùn)的個(gè)人中,有超過50%的人說過不允許在公司的機(jī)器和網(wǎng)絡(luò)上使用免費(fèi)、開源、共享、甚至是 有時(shí)間限制的免費(fèi)試用版軟件。)
● 免費(fèi)或者開源的負(fù)載生成工具
○ JMeter (http://jakarta.apache.org/jmeter/)
○ WebLoad (http://www.webload.org/)
○ OpenSTA (http://www.opensta.org/)
● 免費(fèi)或者開源的網(wǎng)絡(luò)協(xié)議分析工具
○ Ethereal (http://www.ethereal.com/)
○ Fiddler (http://www.fiddlertool.com/)
● 免費(fèi)的瀏覽器插件
○ Firebug (http://www.getfirebug.com/) with YSlow (http://developer.yahoo.com/yslow/) for Firefox
○ HttpWatch (http://www.httpwatch.com) for IE
● 免費(fèi)的助手網(wǎng)站
○ Web Page Analyzer - from Website Optimization: Free Website Performance Tool and Web Page Speed Analysis (http://www.websiteoptimization.com/services/analyze/)
○ Gomez Instant Site Test (http://www.gomez.com/info_center/instant_test.php)
有了這些,讓我們來看一些你只需看完本文能做的測(cè)試,這些測(cè)試只需在web層面上即可進(jìn)行,卻可能會(huì)顯著的改善終端用戶的響應(yīng)時(shí)間。
HTTP請(qǐng)求數(shù)
頁面的獲取不是在一個(gè)事務(wù)中完成的。通常HTML文件需要一個(gè)請(qǐng)求,樣式表需要一個(gè)或多個(gè)請(qǐng)求,外部腳本需要一個(gè)或多個(gè)請(qǐng)求,圖片、多媒體內(nèi)容、以及第 三方那個(gè)內(nèi)容如廣告等需要多個(gè)請(qǐng)求。即使很多對(duì)象已經(jīng)存在于瀏覽器緩存中了,還是需要頻繁的向服務(wù)器發(fā)送請(qǐng)求,以確認(rèn)緩存中的對(duì)象是否“fresh”。這 意味著頁面上的每一個(gè)對(duì)象都十分可能會(huì)增加負(fù)擔(dān),進(jìn)而在用戶視角上降低了了性能,即使客戶端的瀏覽器已經(jīng)緩存了所需的對(duì)象。如下幾種途徑,可以確定頁面發(fā) 送了多少個(gè)請(qǐng)求,以及請(qǐng)求的內(nèi)容。
無論你用哪種方法,你將首先清除掉瀏覽器的緩存,或者訪問頁面兩次(一次通過ctrl + F5來強(qiáng)制刷新緩存)以確保能夠看到所有的請(qǐng)求。因?yàn)檫@些方法只能收集到真實(shí)的請(qǐng)求,如果不清除或刷新緩存可能會(huì)導(dǎo)致一些遺漏,讓你以為沒有去請(qǐng)求一些樣 式表、腳本、圖片和多媒體內(nèi)容,很多配置或條件會(huì)對(duì)此產(chǎn)生影響,而你可能不知道要去設(shè)置這些。
1、如果你使用了負(fù)載生成工具或者網(wǎng)絡(luò)協(xié) 議分析工具,你可以直接開始錄制了,然后瀏覽感興趣的頁面。在你錄制的內(nèi)容中尋找“GET”語句,看一下請(qǐng)求了什么。記住,有些工具,錄制下來的腳本默認(rèn) 只顯示基礎(chǔ)的HTML請(qǐng)求,不包括子請(qǐng)求(對(duì)樣式表、圖片、腳本等的請(qǐng)求),如果要看到所有的請(qǐng)求需要進(jìn)一步的設(shè)置。
2、如果你的測(cè)試環(huán)境允許裝瀏覽器插件,那么有好幾種方法可以使這個(gè)工作變得簡(jiǎn)單。根據(jù)你所用的瀏覽器,或者希望測(cè)的瀏覽器,我推薦:
a)FireFox:FireBug+YSlow
b)IE: HttpWatch
3、如果你無法使用任何工具,你仍將有幾種選擇:
a)訪問上面列出的一個(gè)助手網(wǎng)站,輸入你想測(cè)試的頁面的URL,點(diǎn)提交。
b)FireFox中,右擊頁面,選Page Info,導(dǎo)航至Media Tab。注意,這個(gè)方法不會(huì)顯示腳本和樣式表,但會(huì)顯示出請(qǐng)求的圖片和其他多媒體內(nèi)容。
c)IE中,右擊頁面然后選擇View Source。這里,你需要搜尋“link”和“img”字段。如果你找到了樣式表的連接(到.css文件的連接),你還需要手動(dòng)的下載每個(gè)樣式表,然后 在其中搜索“url”字樣,因?yàn)檫@些可能會(huì)用來請(qǐng)求腳本、圖片和多媒體內(nèi)容。(這是目前為止最笨的方法,但仍能為你提供信息)
有了你的請(qǐng)求列表以后,第一件事要做的就是看看數(shù)量——過多的請(qǐng)求會(huì)讓頁面變慢。有如下幾個(gè)指標(biāo)來判斷是否是過多的請(qǐng)求。
1、外部樣式表請(qǐng)求多于一個(gè)。確實(shí)有一些時(shí)候是應(yīng)該將頁面樣式拆分成幾個(gè)樣式表,但這情況并不常見,而且對(duì)性能顯然沒有好處。一般來說,只有當(dāng)有一個(gè)主樣式表應(yīng)用到很多頁面,第二個(gè)大的樣式表只應(yīng)用到幾個(gè)頁面時(shí),保留多于一個(gè)樣式表才是個(gè)好方法。
2、同一域中腳本的請(qǐng)求多于一個(gè)。雖然連接多個(gè)外部腳本比連接多個(gè)樣式表有更好的理由,多個(gè)外部腳本連接比 一個(gè)連接性能更好,仍然是不常見的。如果你測(cè)試的頁面是一個(gè)復(fù)雜的數(shù)據(jù)輸入表單,那么將表單的驗(yàn)證腳本同其他頁面的通用腳本分離可能會(huì)有些意義。這樣做會(huì) 減少其他頁面(除了表單)的大小,從而改善那些頁面的性能,但多出的請(qǐng)求還是會(huì)輕微的降低表單頁面的性能。不管如何,多于一個(gè)外部腳本,至少是值得注意一 下的。
3、大量的圖片。我沒法說“大量的”是多少,但我可以告訴你,IE7和FireFox 2.x默認(rèn)每主機(jī)名可以有2個(gè)并行下載(HTTP/1.1,大部分新網(wǎng)站都是)。這意味著,不管你的圖片大小是多少,瀏覽器一次只能下載兩個(gè),只有當(dāng)之前 的兩個(gè)都處理完,才會(huì)開始接下來的兩個(gè)。在HTTP/1.0中是不同的,F(xiàn)ireFox默認(rèn)每主機(jī)名可以有8并行下載,IE各版本不同,但肯定不會(huì)低于 2。這種變化產(chǎn)生的效果就是,使用類似大小但是數(shù)量最少的圖片易于產(chǎn)生最佳的性能。這和小圖片總是好的那種觀點(diǎn)是相反的。將幾個(gè)小圖片合成一個(gè)或兩個(gè)大些 的圖片,通常會(huì)改善性能。當(dāng)然,這就又會(huì)出現(xiàn)一個(gè)臨界點(diǎn)。圖片大小和圖片的數(shù)量是值得前端工程師仔細(xì)研究的,測(cè)試多種選擇以達(dá)到最佳性能。有一個(gè)廣受好評(píng) 的“rull-of-thumb”(提供類似問題的指導(dǎo)),奉勸當(dāng)一個(gè)頁面超過12個(gè)請(qǐng)求時(shí),一定要謹(jǐn)慎。Souders的這本書和Andrew B. King的in Speed Up Your Site: Web Site Optimization(New Riders, 2003)中都采用了這個(gè)數(shù)字,而Aaron Hopkins在網(wǎng)站上發(fā)表的文章“Optimizing Page Load Time”讓這個(gè)數(shù)字更有說服力。
HTTP請(qǐng)求的順序
很多類似的方法都可以用來確定頁面上請(qǐng)求的順序(前面提到的助手網(wǎng)站和FireFox的“Page Info”除外,為了突出數(shù)量和大小等問題,將請(qǐng)求按類型或者大小進(jìn)行了分組和排序)。我們所關(guān)注的順序是:
1、首先請(qǐng)求樣式表。在樣式表下載完之前,頁面是不會(huì)顯示的。或者是下載完樣式表要重新刷新頁面。基于這一點(diǎn),讓樣式表在HTML頁面之后第一批請(qǐng)求是非常重要的。
2、最后請(qǐng)求腳本(至少是要靠后)。當(dāng)開始請(qǐng)求一個(gè)腳本的時(shí)候,在腳本完全下載完之前不會(huì)再發(fā)出對(duì)其他對(duì)象 的請(qǐng)求。此外,腳本下載過程中,瀏覽器將暫停顯示頁面內(nèi)容。這意味著在腳本下載過程中完成的任何對(duì)象的下載,都不會(huì)被顯示出來,從而給人感覺頁面的展現(xiàn)停 止了。所以一定要把腳本的請(qǐng)求放到用戶最感興趣的對(duì)象之后。記住,大多數(shù)用戶眼中的響應(yīng)速度是由他們感興趣的內(nèi)容決定的,而不是整個(gè)頁面的載入時(shí)間。
不管你是看HTML源文件還是錄制請(qǐng)求,你需要關(guān)注的就是樣式表最先被請(qǐng)求,腳本在最后或者至少是非常靠后時(shí)請(qǐng)求。有一個(gè)常見的爭(zhēng)論,說負(fù)責(zé)與 用戶交互的腳本(如圖像映射、對(duì)象反轉(zhuǎn))應(yīng)該早些被請(qǐng)求,這樣用戶會(huì)有更好的體驗(yàn),即便整個(gè)頁面還正在下載過程中。但我的經(jīng)驗(yàn)里,由于下載而產(chǎn)生的頁面停 止比無法獲得圖像映射、對(duì)象反轉(zhuǎn)功能更容易使用戶變得焦躁甚至是離開頁面。
重定向和隱藏錯(cuò)誤
你仍然可以使用相同的方法來檢查重定向問題(3xx狀態(tài)碼),客戶錯(cuò)誤(4xx),和服務(wù)器錯(cuò)誤(5xx)。這里,你關(guān)注的信息是:
1、過多的3xx。3xx狀態(tài)表示,請(qǐng)求被處理了,但是瀏覽器需要到另一個(gè)地址去獲取所需對(duì)象,這就產(chǎn)生了 附加的請(qǐng)求和響應(yīng)。雖然有很多的原因可以使用重定向,檢查一下是否有意使用和存在好理由還是值得做的。比如,將一個(gè)刪除掉的頁面重定向到新地址,或者將明 顯拼錯(cuò)的頁面重定向到正確的地址,這就是個(gè)好的使用理由。圖片的父級(jí)目錄被移動(dòng)了,沒有人去維護(hù)更新鏈接,這就不是一個(gè)需要使用重定向、從而接受一些性能 下降的好理由。
2、任何4xx。用戶的請(qǐng)求有問題時(shí)就會(huì)返回4xx狀態(tài)碼。最常見的是404,表示服務(wù)器上找不到被請(qǐng)求的對(duì)象。一般說來,如果頁面的顯示和功能都正常,但請(qǐng)求卻返回了4xx,那就說明頁面請(qǐng)求了不需要的對(duì)象,也耗費(fèi)了多余的時(shí)間。
3、任何5xx。5xx表示處理請(qǐng)求時(shí),服務(wù)器上發(fā)生了錯(cuò)誤。任何5xx的狀態(tài)都需要開發(fā)團(tuán)隊(duì)注意。
我將這些都稱作隱藏錯(cuò)誤,是因?yàn)楫?dāng)它們發(fā)生在非主HTML上時(shí),用戶通常是察覺不到的。有時(shí),這些狀態(tài)碼預(yù)示著有更深層的錯(cuò)誤,但是無論如何,它們都導(dǎo)致了與頁面內(nèi)容無關(guān)的請(qǐng)求,這些請(qǐng)求通常也都是完全沒有必要的。
HTTP響應(yīng)頭 要檢查HTTP響應(yīng)頭,需要使用負(fù)載生成工具、網(wǎng)絡(luò)分析工具或者是瀏覽器插件。如果你沒有這些工具,一個(gè)助手網(wǎng)站可以幫到你。我推薦Peter Forret的網(wǎng)站“View and analyze HTTP headers” (http://web.forret.com/tools/analyze.aspx),你只需輸入頁面的URL,網(wǎng)站就會(huì)獲取到web服務(wù)器返回的一 系列HTTP頭,這樣就可以檢查頁面過期和緩存等配置了。至于具體哪些是合適的、哪些是不不要的性能損失,這是和很多內(nèi)容息息相關(guān)的,如網(wǎng)頁和對(duì)象變化的 頻率、用戶訪問網(wǎng)站的頻率、還有用戶看到過時(shí)內(nèi)容的相對(duì)風(fēng)險(xiǎn)。但是不管怎樣,下面的這些是永遠(yuǎn)值得檢查的:
1、過期時(shí)間是否恰當(dāng)。如果一個(gè)對(duì)象的HTTP響應(yīng)中沒有過期時(shí)間這行,每次用戶請(qǐng)求包含這個(gè)對(duì)象的頁面 時(shí),都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,來判斷緩存的這個(gè)版本是否“新鮮”。如果你有一些不易過期的對(duì)象(如公司的Logo),你可以通過設(shè)置一個(gè)未來很遠(yuǎn)的日期 來避免這種有效性檢查。過期時(shí)間最多應(yīng)用在圖片上,但在腳本、樣式表、AJAX和FLASH等內(nèi)容上也經(jīng)常是適用的。檢查一下沒有過期時(shí)間的對(duì)象吧,看看 是不是有不合適的。
2、ETags是否恰當(dāng)。ETags是一種web服務(wù)器和瀏覽器使用的認(rèn)證手段,用來判斷客戶機(jī)器上緩存的 對(duì)象是否和服務(wù)器上的匹配。使用ETags的問題在于,它們對(duì)于一個(gè)特定的服務(wù)器通常是唯一的,這意味著如果網(wǎng)站有多個(gè)web服務(wù)器,ETags是會(huì)出現(xiàn) 問題的。如果你確定只有一個(gè)web服務(wù)器,那么使用ETags是個(gè)不錯(cuò)的主意。如果是多個(gè)服務(wù)器,你就必須查明是否考慮到了這點(diǎn),或者干脆建議不使用 ETags。
3、其他緩存控制。你可能會(huì)看到類似的內(nèi)容,Cache-Control、Last-Modified、Pragma、Set-Cookie、Age。如果你看到了,那么確保這些配置是有意義的。如果沒有找到,而你又覺得應(yīng)該有這些東西,那么找人看一下吧。
說到底,其實(shí)本質(zhì)內(nèi)容就是你要檢查HTTP響應(yīng)頭,來判斷網(wǎng)站是否已被合理配置來利用瀏覽器的緩存。通常,判斷這些配置是否恰當(dāng)?shù)奈ㄒ环椒ǎ峭芾韱T和架構(gòu)師探討網(wǎng)站是如何使用的、以及是如何設(shè)計(jì)的,尤其是和瀏覽器緩存有關(guān)的地方。
源文件和其他對(duì)象
最后,如果你沒以前沒做過這些,你需要手工檢查HTML源文件、css、腳本、圖片以及其他對(duì)象。到現(xiàn)在,我還沒發(fā)現(xiàn)任何一款能夠節(jié)省我們的時(shí) 間、對(duì)各種情況做出充分檢查、并對(duì)前端性能提出建議的工具,雖然一些網(wǎng)站使用的HTML、腳本、圖片的編輯器還是有一些幫助的。最后,關(guān)于前端性能測(cè)試, 我的建議是:
1、確保腳本和CSS沒有寫在HTML源文件中。將腳本和CSS直接寫在HTML中來提高性能,幾乎是不可 能的。原因很簡(jiǎn)單:網(wǎng)頁的主HTML是更新最為頻繁的部分之一,因此從緩存中受益最少。既然HTML很可能每次都要下載,只有盡量減小大小才是上策。將腳 本和CSS與HTML分離,以便利用緩存,是肯定會(huì)提高性能的。
2、確保樣式和腳本不重復(fù)。樣式和腳本包含重復(fù)內(nèi)容是非常惡心的。有時(shí),不同的文件中有重復(fù)內(nèi)容,有時(shí)在同一個(gè)文件中就會(huì)重復(fù)。你可能不想花費(fèi)時(shí)間去做一個(gè)全面檢查,那么只需快速的掃描一遍源文件,經(jīng)常就能發(fā)現(xiàn)是否存在明顯的重復(fù)。
3、檢查代碼最小化。最小化,指壓縮和優(yōu)化代碼,讓相關(guān)功能使用最少的代碼行數(shù)。當(dāng)檢查HTML源文件、外部腳本和樣式表時(shí),需要注意過多的注釋、空格、換行、變量名長度、以及其他能夠增加文件大小的內(nèi)容。
4、檢查圖片的大小和壓縮。雖然大家都明白,仍然還有很多網(wǎng)頁設(shè)計(jì)者使用這樣一些圖片格式,要么有不必要的 文件大小、要么是同顯示尺寸不同的尺寸、要么就是超過了所需要的品質(zhì)。通常,GIF格式的圖片是被壓縮成64位甚至更少顏色的,它們完全滿足大部分的圖片 和縮略圖;JPG格式的圖片被壓縮成256位或者更少,對(duì)于照片來說也完全夠用;通過HTML的height/width屬性來縮放圖片,不如創(chuàng)建再一個(gè) 新的大小的圖片。
這些內(nèi)容,靠常識(shí)判斷即可。例如,一些網(wǎng)站將所有的文件、目錄以及變量的名字減少到兩個(gè)甚至更少的字符,將這作為一種減小文件大小的策略。從純 粹的性能角度來看,這是好的;但是,對(duì)大多數(shù)網(wǎng)站來說,維持這些東西所產(chǎn)生的工作量完全抹殺了它的價(jià)值。你需要同團(tuán)隊(duì)一起,在去重、最小化、壓縮和實(shí)用性 之間找到一個(gè)平衡點(diǎn)。
總結(jié)
本文介紹了幾種測(cè)試,可以用來判斷網(wǎng)站是否可能會(huì)出現(xiàn)前端性能問題。檢查這些可能的性能優(yōu)化,可能會(huì)讓用戶感受到的響應(yīng)時(shí)間提升50%甚至更 多。我確信,一旦你有了自己的工具箱、插件和助手網(wǎng)站,并且實(shí)際的練過幾次之后,你只需花費(fèi)比讀這篇文章更少的時(shí)間,就能檢查一個(gè)網(wǎng)站是否有這些問題了。 有了這么大性能優(yōu)化的可能性,又在時(shí)間和工具上投入這么少,我實(shí)在是找不到任何不進(jìn)行這些測(cè)似的理由。
大自然素以平衡為美,穩(wěn)定,可持續(xù)是很多事物的一個(gè)穩(wěn)態(tài)。
捕魚,講究獵殺不絕,生生不息。
做公司思考著如何構(gòu)建自運(yùn)營的公司,做團(tuán)隊(duì)思考著如何構(gòu)建可持續(xù)發(fā)展的團(tuán)隊(duì)。而做我們測(cè)試,思考如何構(gòu)建穩(wěn)定,可持續(xù)發(fā)展的測(cè)試體系,如果,我想,可以稱之為完美測(cè)試體系。
順應(yīng)自然的運(yùn)行法則,我自底向上進(jìn)行一個(gè)分析和思考,看看我夢(mèng)想中的完美測(cè)試體系。
階段一,運(yùn)轉(zhuǎn)起來。
要有這樣一群人,他們能夠分析需求,制定測(cè)試計(jì)劃與策略,完成用例編寫和執(zhí)行工作,其中,有一定經(jīng)驗(yàn)的測(cè)試項(xiàng)目經(jīng)理。
他們能夠,有效按照用戶需求,進(jìn)行黑盒用例設(shè)計(jì),對(duì)被測(cè)系統(tǒng)進(jìn)行功能測(cè)試,邊界測(cè)試,一定容錯(cuò)和異常測(cè)試,加一些場(chǎng)景測(cè)試和必要有效的性能測(cè)試。
好了,流程制定起,運(yùn)轉(zhuǎn)起來,這個(gè)階段完美嗎?也挺好的,穩(wěn)定,有效,并且,可以比較OK的完成老板給定的任務(wù)。然而,許多團(tuán)隊(duì)易出現(xiàn)一種現(xiàn)象,進(jìn)入該 穩(wěn)定的狀態(tài)后,由于項(xiàng)目緊,大家工作忙無有效能力提高,一個(gè)項(xiàng)目接一個(gè),忙,無改進(jìn),忙,死循環(huán)。 人走人來,可謂穩(wěn)定而不完美。
階段二,打破平衡,改進(jìn)效益。
要有自動(dòng)化,打破忙的重復(fù)的勞動(dòng),也許一開始并不順利,畢竟新生事物剛開始成長都是艱難的,相信自己,做下去。
要有業(yè)務(wù)專家,深度挖掘測(cè)試需求,改進(jìn)一開始很可能并不合理的測(cè)試點(diǎn),精簡(jiǎn)無用冗長的測(cè)試用例,方便手工測(cè)試,方便自動(dòng)化。
要有性能專家,不斷改進(jìn)性能測(cè)試需求。
如何打破?有潛力的,主動(dòng)性好的人,不要給予100%項(xiàng)目時(shí)間,50%-70%夠了,指派更有前瞻性的工作,例如,新的測(cè)試技術(shù)產(chǎn)出,自動(dòng)化實(shí)踐,即將 進(jìn)行的下版本測(cè)試分析預(yù)研性工作。記住,管理人員敢于失敗敢于承擔(dān)。培養(yǎng)起骨干人員,不斷有所產(chǎn)出。形成一個(gè)小的可持續(xù)改進(jìn)循環(huán)。靜等有能力的人出現(xiàn)。
階段三,旋轉(zhuǎn),完美起來。
有了骨干人員的成長,相信,一定有能力完成:
1、自動(dòng)化可以在項(xiàng)目初期提交自動(dòng)化需求,融合自動(dòng)化在測(cè)試流程中,在適當(dāng)?shù)臅r(shí)候使用自動(dòng)化測(cè)試,也許,當(dāng)前自動(dòng)化已經(jīng)復(fù)用完成了許多功能模塊的覆蓋。這是自動(dòng)化專家可以完成的工作。
2、業(yè)務(wù)精通的測(cè)試分析專家,能夠有效制定精細(xì)的測(cè)試策略,包括版本模塊的測(cè)試重點(diǎn),使用哪些技術(shù)測(cè)試,制定有效的分層測(cè)試戰(zhàn)略。分層測(cè)試在這里可以大 規(guī)模節(jié)省成本,例如,使用自動(dòng)化完成關(guān)鍵部分的接口級(jí)測(cè)試,而不是做難于大規(guī)模產(chǎn)出效益的UI級(jí)自動(dòng)化。使用UI自動(dòng)化測(cè)試最有必要,易于改動(dòng)引發(fā)問題的 部分。分層測(cè)試可以有效節(jié)省測(cè)試用例設(shè)計(jì)和可測(cè)性的工作量。通過模塊分離,可以有效分離BUG產(chǎn)生原因,便于開發(fā)修改和回歸。
3、性能測(cè)試專家,與測(cè)試策略同時(shí)制定,分析系統(tǒng)可能存在的性能問題,完成高效的性能測(cè)試需求,如,利用什么樣的工具或改進(jìn)現(xiàn)有工具,高效完成哪些性能指標(biāo)測(cè)試。
4、高效執(zhí)行團(tuán)隊(duì),固定的不易于改變的,通過一次手工執(zhí)行和方便的自動(dòng)化框架構(gòu)建下次可快速回歸的執(zhí)行過程。有效的BUG review,和有針對(duì)性的發(fā)散性和探索性測(cè)試,構(gòu)建場(chǎng)景測(cè)試的團(tuán)隊(duì)。如有需求,構(gòu)建安全測(cè)試團(tuán)隊(duì)。
我們來看看,現(xiàn)在一次完美的測(cè)試過程:
項(xiàng)目立項(xiàng),由用戶和BOSS立項(xiàng),研發(fā)和測(cè)試跟進(jìn),各技術(shù)專家評(píng)審需求,除提供有效的場(chǎng)景供用戶和開發(fā)確定外,測(cè)試分析專家(架構(gòu)師)給予可測(cè) 試性需求,包括不限于,用戶級(jí)需求的可測(cè)試性分析;白盒測(cè)試的約束和接口,如庫的導(dǎo)出標(biāo)準(zhǔn);與開發(fā)的架構(gòu)師一起確定整體設(shè)計(jì)方案是否合理有效,并指導(dǎo)或確 定可測(cè)試性設(shè)計(jì)要求。
項(xiàng)目設(shè)計(jì),開發(fā)在處理用戶需求的同時(shí),跟進(jìn)前期測(cè)試,完成自動(dòng)化測(cè)試需求,測(cè)試專家的可測(cè)試性需求跟蹤和測(cè)試策略的制定。
項(xiàng)目編寫集成,項(xiàng)目的自動(dòng)化工程師和執(zhí)行人員介入,按照項(xiàng)目流程和策略進(jìn)行集成測(cè)試,并同時(shí)產(chǎn)出相關(guān)自動(dòng)化用例,完成制定的測(cè)試分析專家的分層測(cè)試策略與其他測(cè)試策略。
項(xiàng)目系統(tǒng)測(cè)試,根據(jù)策略,至少2輪以上,快速回歸自動(dòng)化,集成發(fā)散性測(cè)試和探索性測(cè)試,充分發(fā)揮大家的思考發(fā)散能力,將上一階段的問題發(fā)現(xiàn)并提交,并回溯起來,不斷改進(jìn)前期過程。
項(xiàng)目穩(wěn)定性和場(chǎng)景測(cè)試,由相關(guān)人員進(jìn)行場(chǎng)景測(cè)試,保證到最終用戶的可靠的使用。
是否完美呢?它有高效的運(yùn)作方式,有經(jīng)驗(yàn)豐富和技術(shù)牛人指導(dǎo)前期,有完整高效的分層策略和自動(dòng)化保證快速開發(fā),有穩(wěn)定性與用戶場(chǎng)景保證最終的可 靠性發(fā)布。如果說不完美,有一點(diǎn),還缺少那么一點(diǎn)點(diǎn)預(yù)見性,那么,培養(yǎng)具有市場(chǎng)前瞻性的技術(shù)專家吧,例如,提前半年分析超大流量的測(cè)試技術(shù),提前研究移動(dòng) 終端的快速測(cè)試技術(shù)。
自底向上,意味著,很多東西我們管理需要培養(yǎng)起有能力的人員由他們自然推動(dòng),而不是靠從上向下的強(qiáng)推自動(dòng)化,強(qiáng)推所謂的敏捷流程。
至于流程,在完美測(cè)試體系中,它應(yīng)該融入到我們的研發(fā)和測(cè)試平臺(tái)中。自然隨性,不知不覺跟進(jìn)了流程。這是流程的最高境界。
在測(cè)試界中,易于出現(xiàn)無成就感的問題,在這里,沒有任何問題,每個(gè)人有向上發(fā)展的動(dòng)力,有其不同的價(jià)值體現(xiàn)。最終的大牛進(jìn)入研發(fā)過程改進(jìn)中。
所謂大局觀,是一種思路,在管理過程中,抓住前瞻性的重要不緊急工作,把它做好。那么,自然,穩(wěn)定的,可持續(xù)的完美測(cè)試體系,在未來,可成矣。
“飲鴆止渴”, 萬萬不可。
針對(duì)兩方面的計(jì)劃風(fēng)險(xiǎn),需要作出以下改進(jìn)措施,并堅(jiān)決執(zhí)行:
1、資源共享。組織培訓(xùn),盡快使原有兩個(gè)組中的核心業(yè)務(wù)知識(shí)共享,同時(shí),每個(gè)成員還會(huì)負(fù)責(zé)原有的日常測(cè)試工作,在開發(fā)部門的開發(fā)模式不調(diào)整的情況下,繼續(xù)以項(xiàng)目為單位,進(jìn)行測(cè)試。同時(shí),在培訓(xùn)和自學(xué)中,盡快掌握其他業(yè)務(wù),同時(shí),達(dá)到可以對(duì)其他業(yè)務(wù)的手工操作熟練掌握,最終可以實(shí)現(xiàn)招標(biāo),采購測(cè)試人員的交叉。
2、技術(shù)共享。測(cè)試工作中的技術(shù)應(yīng)用,通過會(huì)議,培訓(xùn),工作安排,達(dá)到兩組完全融合,技術(shù)平衡,測(cè)試管理平衡,測(cè)試規(guī)范,文檔平衡統(tǒng)一,測(cè)試技術(shù)技能應(yīng)該平衡。
3、對(duì)人員的工作分配和使用,除了按現(xiàn)有的方式暫時(shí)分配工作,增加一項(xiàng)考核內(nèi)容,就是管理部門分配的其他項(xiàng)目的業(yè)務(wù)水平和測(cè)試認(rèn)知的考核,通過考核,使測(cè)試人員盡早的進(jìn)入這種“多進(jìn)程”的工作方式,最終的考核結(jié)果,會(huì)和測(cè)試人員的職級(jí)產(chǎn)生影響,最終的原則應(yīng)該仍是在優(yōu)勝劣汰的原則.
3.3.2 計(jì)劃外風(fēng)險(xiǎn)
1、開發(fā)模式的改變。重組的技術(shù)開發(fā)部門是否仍是以項(xiàng)目為單位,進(jìn)行產(chǎn)品開發(fā),功能整改工作,還是會(huì)有新的開發(fā)模型?這將直接影響到測(cè)試管理部門的職責(zé)行使、工作安排。
2、公司整改戰(zhàn)略思想的政策支持度。四個(gè)部門同時(shí)整改,造成原有的工作模式和工作方式,在各部門都產(chǎn)生重要影響力,勢(shì)必會(huì)在行使之初,有些資源利用,調(diào)配,以及資源的掌握上,有一個(gè)適應(yīng)的過程,這不只是測(cè)試部門。如果在短期內(nèi),四個(gè)整改部門出現(xiàn)不兼容的情況,公司的整理處理方針是什么?
針對(duì)計(jì)劃外的風(fēng)險(xiǎn),沒想過具體方式方法,只能暫時(shí)這樣制訂:
1、如果開發(fā)模式改變,只能靈活的制訂相應(yīng)的測(cè)試策略,調(diào)整原來的測(cè)試方式,集中討論,形成對(duì)應(yīng)的處理機(jī)制。
2、如果出現(xiàn)不利于公司前進(jìn)的因素出現(xiàn),測(cè)試部門整改的一個(gè)中間部門,和前一級(jí),下一級(jí)部門盡早協(xié)調(diào),爭(zhēng)取早日更好的接軌,倘若行不通,以公司指令和調(diào)配為準(zhǔn)。
四、測(cè)試管理部發(fā)展規(guī)劃
4.1 部門建設(shè)
部門整合后,會(huì)對(duì)測(cè)試建設(shè)提出兩個(gè)目標(biāo),以此為目標(biāo),打造體系完善的測(cè)試管理部。
4.1.1 短期目標(biāo):
實(shí)現(xiàn)兩個(gè)測(cè)試組的融合:資源融合,技術(shù)融合,業(yè)務(wù)融合,工作融合,計(jì)劃用3-5個(gè)月實(shí)現(xiàn)。
具體規(guī)劃:
1、工作考核
2、部門績(jī)效考核
3、近期工作安排
4、培訓(xùn)安排
5、業(yè)務(wù)測(cè)試交互
6、人員定崗,定職
4.1.2 長期目標(biāo):
把測(cè)試管理部發(fā)展為綜合業(yè)務(wù)水平高,測(cè)試技能突出,測(cè)試影響力大,測(cè)試經(jīng)驗(yàn)豐富的團(tuán)隊(duì)。
具體規(guī)劃:
1、部門測(cè)試影響力
2、測(cè)試技術(shù)掌握
3、職級(jí)確定
4、部門協(xié)作
5、人才培養(yǎng)和留任
6、人才引入
一、現(xiàn)任崗位工作
1.1 工作內(nèi)容
1、負(fù)責(zé)招標(biāo)測(cè)試組的測(cè)試管理工作,測(cè)試組成員的測(cè)試工作進(jìn)行安排,測(cè)試工作方式,測(cè)試技能,進(jìn)行分析和掌握,并針對(duì)不同的測(cè)試人員的工作和技術(shù)特點(diǎn),采取不同的方式進(jìn)行管理和指導(dǎo),提供建設(shè)性的意見和建議,并帶領(lǐng)組員共同學(xué)習(xí)和創(chuàng)新,用于項(xiàng)目的測(cè)試具體工作中,提高測(cè)試水平;
2、指導(dǎo)測(cè)試人員,并和項(xiàng)目其他部門溝通,以提前測(cè)試執(zhí)行時(shí)間為目的,對(duì)項(xiàng)目的需求完善,進(jìn)行答疑;對(duì)項(xiàng)目開發(fā)進(jìn)度和缺陷修改,進(jìn)行督促,從而使測(cè)試在良性狀態(tài)下順利進(jìn)行,同時(shí)對(duì)整個(gè)項(xiàng)目進(jìn)度和質(zhì)量起到重要作用;
3、熟悉招標(biāo)的各項(xiàng)業(yè)務(wù),在業(yè)務(wù)熟悉的基礎(chǔ)上,轉(zhuǎn)化為測(cè)試需求,并結(jié)合現(xiàn)有的測(cè)試組工作狀態(tài)進(jìn)行分析,制訂相關(guān)的規(guī)范和流程,并在提高測(cè)試技術(shù)水平和測(cè)試方法上,開展一系列的嘗試工作,并做出相關(guān)的文檔,以及對(duì)相關(guān)的技術(shù)難點(diǎn)攻關(guān);
4、對(duì)測(cè)試的需求,計(jì)劃,用例和缺陷進(jìn)行評(píng)審,提出指導(dǎo)意見和改進(jìn)方法,完善原有的項(xiàng)目測(cè)試工作,尤其是對(duì)測(cè)試需求和缺陷提交的規(guī)范進(jìn)行細(xì)致的引導(dǎo);
1.2 工作業(yè)績(jī)
1、基本熟悉招標(biāo)網(wǎng)平臺(tái)中的各種類型招標(biāo)的基本流程,并對(duì)流程中的業(yè)務(wù)進(jìn)行理解,轉(zhuǎn)化為測(cè)試思想,指導(dǎo)測(cè)試工作的執(zhí)行;
2、對(duì)“競(jìng)爭(zhēng)性談判”項(xiàng)目的測(cè)試管理進(jìn)行規(guī)范,以公司原有的相關(guān)規(guī)格說明書為指導(dǎo),和測(cè)試人員討論后,結(jié)合項(xiàng)目實(shí)際情況和以往工作經(jīng)驗(yàn),制訂相應(yīng)的QC中的管理流程,腳本編輯更易理解和易使用的信息,方便,有效的用于測(cè)試需求和缺陷的編寫;
3、參與其他項(xiàng)目例會(huì),掌握測(cè)試人員跟進(jìn)項(xiàng)目組的實(shí)際測(cè)試工作,作指導(dǎo)性的意見,并協(xié)調(diào)其他部門,更好的為測(cè)試開展提供方便;
4、針對(duì)一些項(xiàng)目中的成形的業(yè)務(wù)和功能操作,手工測(cè)試執(zhí)行繁瑣。提出自動(dòng)化測(cè)試框架的搭建需求,因?yàn)檎袠?biāo)測(cè)試組以往的自動(dòng)化測(cè)試進(jìn)展水平較低,從頭開始構(gòu)建自動(dòng)化測(cè)試框架思想,并編寫完成框架思想和一部分針對(duì)具體項(xiàng)目的概要設(shè)計(jì)工作。
5、通過了解業(yè)務(wù)功能,以及整體產(chǎn)品運(yùn)行的硬件平臺(tái)和產(chǎn)品整體結(jié)構(gòu)框架,開始引入性能測(cè)試分析的內(nèi)容,并對(duì)tomcat實(shí)行監(jiān)控,數(shù)據(jù)庫進(jìn)行性能分析,并對(duì)具體項(xiàng)目,編制性能測(cè)試方案和部分測(cè)試用例,并完成了原型腳本的編寫,使之可以更好的在場(chǎng)景中運(yùn)行。
二、競(jìng)聘匹配度分析
2.1 工作經(jīng)歷分析
1、從2002從事軟件測(cè)試行業(yè)至今,經(jīng)歷了這個(gè)行業(yè)的發(fā)展過程,同時(shí),積累了豐富的工作經(jīng)驗(yàn),并且轉(zhuǎn)化為管理和技能,可能更好的用于公司的測(cè)試工作中,做出貢獻(xiàn);
2、在原來公司,有過三年互聯(lián)網(wǎng)測(cè)試經(jīng)驗(yàn),并且針對(duì)網(wǎng)站和平臺(tái)的每次改版,都充分發(fā)揮了測(cè)試負(fù)責(zé)人和測(cè)試實(shí)施者應(yīng)有的作用,保證每個(gè)產(chǎn)品都能順利上線;
3、在測(cè)試這個(gè)行業(yè)中,有過5年既是測(cè)試工作師又兼測(cè)試組長的雙重經(jīng)歷,從而更了解測(cè)試人員的工作和想法,同時(shí),更方便上下兼容,并且可以更好的和兄弟部門溝通交流;
4、加入必聯(lián)至今,一直引導(dǎo)招標(biāo)測(cè)試組的測(cè)試管理工作,并對(duì)組里人員進(jìn)行測(cè)試?yán)碚撝笇?dǎo)和技術(shù)指導(dǎo),同時(shí),讓組成員的工作狀態(tài)都飽滿起來;
5、對(duì)測(cè)試和管理的工作有很強(qiáng)的興趣和信心。
2.2 技術(shù)分析
1、熟悉Linux,Windows系統(tǒng),并且熟悉web技術(shù)開發(fā)的框架和體系結(jié)構(gòu),可以熟練的配置相應(yīng)的測(cè)試環(huán)境,同時(shí)對(duì)測(cè)試版本進(jìn)行控制;
2、熟悉軟件工程,項(xiàng)目管理的理論和方法,對(duì)各種開發(fā)和測(cè)試模型有很好的認(rèn)識(shí)和理解,并可以靈活用于項(xiàng)目中;
3、軟件測(cè)試整體過程中,測(cè)試需求、測(cè)試計(jì)劃用例,測(cè)試執(zhí)行,以及對(duì)缺陷的分析和定位,有敏銳的想法和解決方案;
4、對(duì)軟件測(cè)試主流的輔助工具,如:TD,QC,JIRA,QTP,LR,可以很好的使用,并用于實(shí)際的測(cè)試過程中;
5、熟悉ORACLE數(shù)據(jù)庫的操作和使用;
6、對(duì)開源的部分測(cè)試工具,有一定的理解和使用能力,如:ruby,selenium等;
7、從事多年的測(cè)試工作,具有良好的語言表達(dá)能力和文字,文檔編寫處理能力,同時(shí),英語四級(jí)水平使得看一些英文文檔,稍借助翻譯軟件,即可形成中文的專業(yè)文章,可學(xué)習(xí)和共享給其他組員;
2.3 管理分析
1、可以根據(jù)資源配置,可以形成以垂直管理為主導(dǎo),多結(jié)構(gòu)化的管理方式,既體現(xiàn)首席管理者的指導(dǎo)管理和協(xié)調(diào)管理職能,又會(huì)根據(jù)具體情況,分層次和組合的進(jìn)行測(cè)試工作的開展;
2、可以對(duì)項(xiàng)目的測(cè)試時(shí)間,質(zhì)量和成本的控制能力較強(qiáng),在測(cè)試開始之際,就會(huì)建立一個(gè)測(cè)試預(yù)警方案;
3、以往的工作中,會(huì)主動(dòng)管理和工作,主動(dòng)向上傳遞,提交測(cè)試信息;主動(dòng)向下關(guān)注,指導(dǎo)測(cè)試工作的良性進(jìn)行,使每個(gè)人都有工作可做;對(duì)自身而言,除此之外,會(huì)對(duì)部門的建設(shè)和技術(shù),學(xué)習(xí),培訓(xùn)等方面,開展實(shí)際的工作;
4、可以充分利用測(cè)試資源,特別是人的應(yīng)用,同時(shí),對(duì)測(cè)試部門成員有完整,全面的認(rèn)識(shí)和理解,支持;
5、通過原有的工作經(jīng)驗(yàn),結(jié)合現(xiàn)有測(cè)試部門的管理工作,仍然會(huì)實(shí)行優(yōu)勝劣汰的方式,可以犯錯(cuò),但是不能無所作為。
6、在管理溝通方面,在工作周報(bào)和月報(bào)中,建立相應(yīng)的板塊,除了工作總結(jié),應(yīng)該會(huì)有學(xué)習(xí)總結(jié),問題總結(jié),個(gè)人建議意見填寫,這些內(nèi)容和考核績(jī)效結(jié)合;在例會(huì),面對(duì)面交流過程中,討論是關(guān)鍵字;
7、可以和兄弟部門,從屬部門,其他職能部門有良好的溝通。主要是充分利用公司各種資源,如:?jiǎn)T工之間的私交,工作上的上下級(jí)關(guān)系,項(xiàng)目整體關(guān)系,公司OA等,形成良好的溝通氛圍,完成自己想要達(dá)到的目的。
三、測(cè)試管理部組織規(guī)劃
3.1 組織目標(biāo)
首先我們需要明白測(cè)試管理部的目標(biāo)是什么?就我個(gè)人理解,主要是三個(gè)方面:
1、測(cè)試管理部統(tǒng)一后,可以更方便的調(diào)用兩個(gè)部門的測(cè)試人員,進(jìn)行業(yè)務(wù)互換測(cè)試,同時(shí),可以在業(yè)務(wù)熟悉之后,產(chǎn)生新的測(cè)試要點(diǎn),拓寬測(cè)試人員的業(yè)務(wù)知識(shí)和測(cè)試水平;
2、技術(shù)共享。原來兩個(gè)測(cè)試組,采購和招標(biāo)因?yàn)樗^業(yè)務(wù)不同,造成的技術(shù)不平衡情況有望在統(tǒng)一后的測(cè)試管理部打破,同屬測(cè)試部成員,根據(jù)項(xiàng)目要求以及業(yè)務(wù)掌握情況,會(huì)在統(tǒng)一安排下,互相扶助,從而達(dá)到技術(shù)和業(yè)務(wù)雙贏
3、增強(qiáng)測(cè)試持續(xù)發(fā)展,降低測(cè)試預(yù)期分險(xiǎn)。兩個(gè)組的資源分散,主要是人力,每個(gè)人再分散到一個(gè)項(xiàng)目中,造成業(yè)務(wù),技術(shù)孤立,使某項(xiàng)目或產(chǎn)品的可持續(xù)測(cè)試不能進(jìn)行,同時(shí),提高測(cè)試水平,提高項(xiàng)目質(zhì)量受到很大限制,測(cè)試管理部的可以更優(yōu)分配資源,兩個(gè)項(xiàng)目可以由至少兩人同時(shí)參與,共同協(xié)作,達(dá)到1+1優(yōu)于2的要求。
3.2 崗位規(guī)劃
設(shè)想根據(jù)不同的業(yè)務(wù),不同的項(xiàng)目開發(fā),劃分兩個(gè)級(jí)別的測(cè)試工作人員,記為高級(jí)測(cè)試工程師,測(cè)試工程師。
因?yàn)楣驹械闹贫戎袑?duì)測(cè)試技能職級(jí)未做細(xì)分,所以在測(cè)試管理部組建之后,會(huì)暫時(shí)按原有的方式職級(jí)進(jìn)行工作安排,通過工作和技術(shù)在實(shí)際的應(yīng)用中發(fā)揮的作用,測(cè)試管理部會(huì)提交各人的工作總結(jié),學(xué)習(xí)總結(jié),技能實(shí)際掌握情況,形成部門績(jī)效考核,再由整個(gè)技術(shù)部門和相關(guān)的人力等職能部門,對(duì)測(cè)試人員職級(jí)進(jìn)行調(diào)整。
在未做調(diào)整之前,測(cè)試管理部經(jīng)理會(huì)盡快了解測(cè)試部?jī)?nèi)的人員技能水平和業(yè)務(wù)水平,進(jìn)行工作安排,在工作中進(jìn)行考核,同時(shí),為了項(xiàng)目測(cè)試順利執(zhí)行,對(duì)業(yè)務(wù)能力熟悉的人員,安排相應(yīng)的測(cè)試前期的準(zhǔn)備工作,同時(shí),會(huì)有一個(gè)輔助人員會(huì)加入,作為輔助測(cè)試人員,主要為了熟悉業(yè)務(wù)和測(cè)試過程,也為了增強(qiáng)該項(xiàng)目的可持續(xù)測(cè)試。
根據(jù)項(xiàng)目大小,細(xì)分模塊,盡量安排至少兩人以上參與測(cè)試工作,從測(cè)試需求,用例設(shè)計(jì),測(cè)試執(zhí)行,分工協(xié)作,但是每個(gè)人的在項(xiàng)目中的測(cè)試工作,是獨(dú)立的完成,最后,進(jìn)行測(cè)試整合,形成測(cè)試相關(guān)文檔,完成測(cè)試整體工作。
3.3 風(fēng)險(xiǎn)分析
3.3.1 計(jì)劃風(fēng)險(xiǎn)
1、測(cè)試資源風(fēng)險(xiǎn):部門組建之初,會(huì)出現(xiàn)暫時(shí)的資源迭代的情況,主要是人力資源,需要每個(gè)人在主負(fù)責(zé)相關(guān)的測(cè)試項(xiàng)目的工作外,需要對(duì)其他項(xiàng)目進(jìn)行測(cè)試跟蹤和學(xué)習(xí),測(cè)試人員是否可以跟進(jìn)部門安排的工作,盡快完成從單業(yè)務(wù)測(cè)試向多業(yè)務(wù)的了解和掌握,從而可以開展測(cè)試工作,需要時(shí)間來證明。同樣,測(cè)試管理部對(duì)部門整體的測(cè)試環(huán)境的掌握,測(cè)試經(jīng)理對(duì)部門的實(shí)際了解和最終流暢運(yùn)作,需要一定的時(shí)間來組織和構(gòu)建。
2、人員風(fēng)險(xiǎn):新的整體部門的組建,雖然會(huì)維持一些原有的流程和作業(yè)規(guī)范,但根據(jù)實(shí)際情情,勢(shì)必會(huì)進(jìn)行調(diào)整,原有人員是否可以適應(yīng)新的工作方式,在原有的成型的工作習(xí)慣基礎(chǔ)上,是否可以學(xué)習(xí),加強(qiáng)業(yè)務(wù)知識(shí),專業(yè)技能,是否能順利的完成任務(wù),需要保守估計(jì)。
針對(duì)兩方面的計(jì)劃風(fēng)險(xiǎn),需要作出以下改進(jìn)措施,并堅(jiān)決執(zhí)行:
1、資源共享。組織培訓(xùn),盡快使原有兩個(gè)組中的核心業(yè)務(wù)知識(shí)共享,同時(shí),每個(gè)成員還會(huì)負(fù)責(zé)原有的日常測(cè)試工作,在開發(fā)部門的開發(fā)模式不調(diào)整的情況下,繼續(xù)以項(xiàng)目為單位,進(jìn)行測(cè)試。同時(shí),在培訓(xùn)和自學(xué)中,盡快掌握其他業(yè)務(wù),同時(shí),達(dá)到可以對(duì)其他業(yè)務(wù)的手工操作熟練掌握,最終可以實(shí)現(xiàn)招標(biāo),采購測(cè)試人員的交叉。
2、技術(shù)共享。測(cè)試工作中的技術(shù)應(yīng)用,通過會(huì)議,培訓(xùn),工作安排,達(dá)到兩組完全融合,技術(shù)平衡,測(cè)試管理平衡,測(cè)試規(guī)范,文檔平衡統(tǒng)一,測(cè)試技術(shù)技能應(yīng)該平衡。
3、對(duì)人員的工作分配和使用,除了按現(xiàn)有的方式暫時(shí)分配工作,增加一項(xiàng)考核內(nèi)容,就是管理部門分配的其他項(xiàng)目的業(yè)務(wù)水平和測(cè)試認(rèn)知的考核,通過考核,使測(cè)試人員盡早的進(jìn)入這種“多進(jìn)程”的工作方式,最終的考核結(jié)果,會(huì)和測(cè)試人員的職級(jí)產(chǎn)生影響,最終的原則應(yīng)該仍是在優(yōu)勝劣汰的原則.
3.3.2 計(jì)劃外風(fēng)險(xiǎn)
1、開發(fā)模式的改變。重組的技術(shù)開發(fā)部門是否仍是以項(xiàng)目為單位,進(jìn)行產(chǎn)品開發(fā),功能整改工作,還是會(huì)有新的開發(fā)模型?這將直接影響到測(cè)試管理部門的職責(zé)行使、工作安排。
2、公司整改戰(zhàn)略思想的政策支持度。四個(gè)部門同時(shí)整改,造成原有的工作模式和工作方式,在各部門都產(chǎn)生重要影響力,勢(shì)必會(huì)在行使之初,有些資源利用,調(diào)配,以及資源的掌握上,有一個(gè)適應(yīng)的過程,這不只是測(cè)試部門。如果在短期內(nèi),四個(gè)整改部門出現(xiàn)不兼容的情況,公司的整理處理方針是什么?
針對(duì)計(jì)劃外的風(fēng)險(xiǎn),沒想過具體方式方法,只能暫時(shí)這樣制訂:
1、如果開發(fā)模式改變,只能靈活的制訂相應(yīng)的測(cè)試策略,調(diào)整原來的測(cè)試方式,集中討論,形成對(duì)應(yīng)的處理機(jī)制。
2、如果出現(xiàn)不利于公司前進(jìn)的因素出現(xiàn),測(cè)試部門整改的一個(gè)中間部門,和前一級(jí),下一級(jí)部門盡早協(xié)調(diào),爭(zhēng)取早日更好的接軌,倘若行不通,以公司指令和調(diào)配為準(zhǔn)。
四、測(cè)試管理部發(fā)展規(guī)劃
4.1 部門建設(shè)
部門整合后,會(huì)對(duì)測(cè)試建設(shè)提出兩個(gè)目標(biāo),以此為目標(biāo),打造體系完善的測(cè)試管理部。
4.1.1 短期目標(biāo):
實(shí)現(xiàn)兩個(gè)測(cè)試組的融合:資源融合,技術(shù)融合,業(yè)務(wù)融合,工作融合,計(jì)劃用3-5個(gè)月實(shí)現(xiàn)。
具體規(guī)劃:
1、工作考核
2、部門績(jī)效考核
3、近期工作安排
4、培訓(xùn)安排
5、業(yè)務(wù)測(cè)試交互
6、人員定崗,定職
4.1.2 長期目標(biāo):
把測(cè)試管理部發(fā)展為綜合業(yè)務(wù)水平高,測(cè)試技能突出,測(cè)試影響力大,測(cè)試經(jīng)驗(yàn)豐富的團(tuán)隊(duì)。
具體規(guī)劃:
1、部門測(cè)試影響力
2、測(cè)試技術(shù)掌握
3、職級(jí)確定
4、部門協(xié)作
5、人才培養(yǎng)和留任
6、人才引入
4.2 人員激勵(lì)
測(cè)試管理部的測(cè)試人員的激勵(lì),主要從以下方面進(jìn)行闡述:
1、從工作安排上來說,主要是要讓每個(gè)人都清楚自己的工作任務(wù),明確知道自己在做什么,從而使每個(gè)人都是在工作,對(duì)于主動(dòng)工作的人員,在部門的績(jī)效考核和公司的考核中,要有一定的體現(xiàn);
2、職級(jí)進(jìn)行分類后,根據(jù)員工的工作情況,可以和其他職能部門協(xié)商,升,降職級(jí)以此對(duì)工作作肯定和否定,這種方式慎用,主要是部門內(nèi)部的工作和部門建設(shè)出現(xiàn)問題,原因分析確實(shí)因?yàn)閭€(gè)人所致的。
3、配合公司的薪水,獎(jiǎng)金,福利制度,對(duì)人員的工作進(jìn)行獎(jiǎng),罰。
4、對(duì)每個(gè)人興趣的,和測(cè)試相關(guān)的培訓(xùn),學(xué)習(xí)給予支持和鼓勵(lì),并可以在項(xiàng)目進(jìn)度允許情況下,可安排員工重點(diǎn)去攻關(guān),學(xué)習(xí),培訓(xùn),從而得到學(xué)習(xí)總結(jié)和成果,共享于測(cè)試部門,提高所有人相關(guān)知識(shí)。
5、測(cè)試人的自我激勵(lì):主要是對(duì)這個(gè)職業(yè)的熱愛,態(tài)度的積極性,對(duì)待工作主動(dòng)思考,同時(shí)會(huì)影響到其他人。
五、測(cè)試管理部業(yè)務(wù)規(guī)劃
5.1 招標(biāo)網(wǎng)業(yè)務(wù)規(guī)劃
1、現(xiàn)有項(xiàng)目的日常測(cè)試工作穩(wěn)定運(yùn)行。對(duì)業(yè)務(wù)比較復(fù)雜的項(xiàng)目,加入新的測(cè)試人員,參與學(xué)習(xí)和輔助測(cè)試工作;
2、進(jìn)一步提取原來兩個(gè)組中的精華和集合點(diǎn),形成共同的基于公司業(yè)務(wù)和項(xiàng)目開發(fā)的完整的測(cè)試工作流程;
3、基于招標(biāo)平臺(tái)的狀態(tài)機(jī)設(shè)置以及業(yè)務(wù)流,結(jié)合自動(dòng)化測(cè)試框架的思想,把原有的成形的功能模塊和節(jié)點(diǎn)集成到自動(dòng)化測(cè)試框架中;
4、開展基于測(cè)試工作環(huán)境下的性能測(cè)試和性能分析
5、在開發(fā)機(jī)構(gòu)完善,測(cè)試相對(duì)獨(dú)立后,考慮搭建一個(gè)真正意義上的測(cè)試環(huán)境,從提取代碼,編譯,部署到版本測(cè)試控制,測(cè)試執(zhí)行,測(cè)試分析,測(cè)試結(jié)果生成,在測(cè)試管理部的測(cè)試服務(wù)器上完成;
6、加強(qiáng)部門可持續(xù)發(fā)展建設(shè)。以學(xué)習(xí)、工作效率還有積極主動(dòng)性作為衡量工作的比重較高的標(biāo)準(zhǔn)。
5.2 采購網(wǎng)業(yè)務(wù)規(guī)劃
工作方式同招標(biāo)業(yè)務(wù)。
六、測(cè)試管理部職能行使
6.1 測(cè)試職能
1、行使參與項(xiàng)目預(yù)審,參與項(xiàng)目評(píng)審工作;
2、行使測(cè)試組建,測(cè)試準(zhǔn)備,測(cè)試執(zhí)行,測(cè)試分析,測(cè)試報(bào)告生成的工作;
3、按項(xiàng)目進(jìn)度,行使對(duì)需求的完善,開發(fā)過程中的失誤,錯(cuò)誤進(jìn)行驗(yàn)證,控制項(xiàng)目進(jìn)度,控制時(shí)間成本,控制質(zhì)量的工作;
4、加強(qiáng)部門建設(shè)過程中的學(xué)習(xí)和培訓(xùn),以及參與其他部門的技術(shù),業(yè)務(wù)交流的工作;
5、用戶驗(yàn)收測(cè)試完成后,用戶培訓(xùn)手冊(cè),用戶操作說明的編制工作。
6.2 部門溝通
1、利用公司的現(xiàn)有資源,如mail,RTX,OA等,保持現(xiàn)有的交流風(fēng)格和方式;
2、貫徹測(cè)試?yán)碚摰秸麄€(gè)項(xiàng)目過程中,整個(gè)部門以重視產(chǎn)品質(zhì)量為前提的工作狀態(tài)下進(jìn)行相關(guān)工作。
3、積極和其它相關(guān)部門互換意見,尋求共贏點(diǎn)。
4、測(cè)試產(chǎn)生的數(shù)據(jù),即時(shí)通過測(cè)試管理QC或其他相關(guān)手段,反饋給相關(guān)部門,同時(shí),其他部門產(chǎn)生的數(shù)據(jù),流經(jīng)測(cè)試時(shí),測(cè)試管理部積極處理,如果出現(xiàn)停頓,測(cè)試部相關(guān)人員主動(dòng)查找停頓原因;
5、測(cè)試人員通過工作的主動(dòng)性,從測(cè)試和質(zhì)量控制環(huán)節(jié)上,帶動(dòng)其他部門的主動(dòng)性,并且通過工作上的主動(dòng)開展,形成部門溝通的良性循環(huán)。