說起自動化測試,我想大家都會有個疑問,要不要做自動化測試? 自動化測試給我們帶來的收益是否會超出在建設時所投入的成本,這個嘛别說是我,即便是高手也很難回答,自動化測試的初衷是美好的,而測試工程師往往在實作過程中花費了很多成本、精力,而最終以失敗告終。 失敗的原因會很多,我總結幾項:
1. 太過依賴測試工具,高估了工具的力量,最終會以失望告終。
2. 項目緊急的情況,為了規避那些多餘的環節,幹脆人工測試,結果整個鍊路中斷。
3. 研發和測試人員不能很好的互動,如果這兩個角色之間有了一道防火牆,那别說自動化測試了,手工測試也不會有好的效果。測試人員可以把研發想象成自己的女朋友, 努力培養互相之間的感情。
4. 自動化測試人員實力被低估而導緻的情緒低落,這個問題在所有崗位上都會發生,當然要看上司重視程度了。
5. 資源不夠,公司不舍得資源投入,或者蹑手蹑腳,那就不要浪費時間了。
6. 太高的期望,過低的回報。
現在國内沒有幾家公司說能玩轉自動化測試的,在看國外那些耳熟能詳的企業像google ,microsoft ,它們反而搞得熱火朝天的。可笑的是在微軟中國的測試部門工作過幾年的測試經理,出來搞個什麼《微軟自動化測試體系最佳實踐課程》,就能忽悠國内的那些知名的企業掏錢去聽,我這也不是說他們的東西不好, 隻是希望我們自己也能夠重視起來,要知道人家“卓越”體系也是由那些“專業團隊”花了很多的時間和精力才搭建起來的,是以先不說收益如何,即便是為了這一個美好的初衷,我們也應該去嘗試一下,即使是失敗。
我也做了幾年的測試,但也是最近才開始研究自動化測試的,在工作中多多少少接觸過幾種常見的工具,如 silktest 和selenium ,搞過測試的應該都聽過,我最近剛剛為現有項目搭建了一個測試架構,為其中的部分子產品編寫了一些測試case, 收益還是頗豐的,先說說這兩種工具吧。
silktest 是商業工具,想使用是需要花錢的,但是有現成的平台和架構,也比較容易學習,可以基于windows ,unix 平台。ie ,firefox (部分)浏覽器。可以錄制回放,對象識别或者手工程式設計,也能基于資料驅動,關鍵字驅動等等測試架構。silktest 裡面的語言4test 其實是類c (也有silk4j ,用java 寫),程式設計能力相對較強。
selenium 是免費的,需要有類似ide (如eclipse ),原先是thoughtworks 的幾個牛人開發的,現在google 維護(人都跳槽過去了)。可以基于windows ,unix ,mac 等平台。ie ,firefox 等浏覽器。 測試團隊,經費不足,能力很強(java 上面),有對測試平台和環境要求比較高(ie ,firefox ,safari 等等),那麼selenium 是很不錯的選擇。
今天我就簡單入個門,先介紹通過junit+selenium+coverlipse+ant 來搭建一整套自動化測試架構,開始之前我先提出幾個問題,請大家根據下面的問題來閱讀本篇文章。
1. 如何錄制腳本?
2. 如何轉換成junit 腳本?
3. 如何生成junit 日志?
4. 如何回放selenium 及檢視回放日志?
5. 如何檢視代碼的覆寫率?
一、工具準備
工具
說明
下載下傳
junit
junit 是一個開發源代碼的java 測試架構,用于編寫和運作可重複的測試。
http://www.junit.org
selenium
先介紹兩個重要的元件selenium-ide 來錄制腳本;selenium-rc selenium-remote control 縮寫,是使用具體的語言來編寫測試類
http://seleniumhq.org/download/
coverlipse
coverlipse 這個eclipse 插件能夠把junit 測試的代碼覆寫直覺化。
http://coverlipse.sourceforge.net/download.php
ant
ant 是一個類似make 的工具, 大家都已經很熟悉了,這裡我們可以利用其中的ant task 來生成junit 日志
http://ant.apache.org/bindownload.cgi
二、junit 的安裝
1. eclipse 本身會自帶junit.jar 包,所一般情況下是不需要額外下載下傳junit 的。
2. 将junit3 的library 添加到工程的buildpath 中
3. 因為junit 的日志是通過ant 來生成的,是以一定要将junit.jar 添加到ant_home 裡
三、selenium 的安裝
1. 安裝seleniumide ,打開火狐浏覽器,然後進入工具—> 添加附件,搜尋seleniumide
2. 查詢出對應的ide 後,點選直接安裝,安裝結束後重新開機firefox ,看到下面的菜單說明安裝成功
3. 安裝selenium-rc ,先去http://www.openqa.org/selenium/ 下載下傳selenium 包。用指令行來到解壓到檔案夾下:d:\autotesting\ selenium-server-standalone-2.0b1.jar 目錄下
4. 運作java -jar selenium-server-standalone-2.0b1.jar ,啟動selenium server 。為了在運作時應用運作的浏覽器與selenium 服務的浏覽器分開可在其後面加–multiwindow 。
5. 在eclipse 建立一個項目,在項目的build path 裡面加上elenium-server-1.0-beta-1 下selenium-server.jar 、selenium-java-client-driver-1.0-beta-1 下selenium-java-client-driver.jar (這兩個在剛解壓的包裡面)和eclipse\plugins\org.junit_3.8.1 下junit.jar 。
6. 将制定的jar 包導入到工程裡,然後你就可以內建并使用相應的api ,編寫自己的測試case 了。
四、coverlipse 的安裝
1. 直接通過eclipse 即可安裝,步驟如下
•in eclipse, click help -> software updates -> find and install.
•in the dialog, select search for new features to install, then next.
•in the next step, add a new remote site. name it "coverlipse update site", the url is "http://coverlipse.sf.net/update/".
•press finish. eclipse now searches for the coverlipse feature to install and shows that to you. 2. 配置 coverlipse 以擷取代碼覆寫
3. 一旦單擊了 run ,eclipse 會運作 coverlipse 并在源代碼(如圖 7 所示)中嵌入标記,該标記顯示了具有相關 junit 測試的代碼部分
4. coverlipse 生成的具有嵌入類标記的報告
5. 正如您所見,使用 coverlipse eclipse 插件可以更快地确定代碼覆寫率。例如,這種實時資料功能有助于在将代碼簽入 cm 系統前 更好地進行測試。
五、ant 安裝,eclipse 自帶,隻需要配置環境變量ant_home 即可。
六、建立一個案例
1. 建立一個工程testselenium 安裝下面目錄結構
2. 錄制腳本,打開firefox 浏覽器,進入selenium ide 菜單
3. 輸入相應錄制的位址,點選紅色按鈕,開始錄制
4. 将腳本轉換成junit 代碼,然後将其拷貝到測試類中做為測試case 編碼的雛形。
六、如何檢視日志,這裡日志分兩類:
l junit 日志,通過junit 寫的斷言,和标準輸出,這些操作産生的日志記錄。
l selenium 日志,當運作junit 腳本時,selenium 相關的腳本就會産生回放日志,例如打開界面的url ,标準輸入,輸出等資訊。
雖然這兩種日志沒有交集,需要分開檢視。但一般情況下我們隻需要觀察selenium 日志已經足夠用了,與其相比junit 日志更适用于編碼階段。
1. junit 日志, 隻需要配置腳本build-selenium.xml ,如下
<project name="seleniumtest" default="junit" basedir=".">
<property environment="env" />
<condition property="ia.home" value="${env.ia_home}">
<isset property="env.ia_home" />
</condition>
<property name="run.classpath" value="../class">
</property>
<property name="run.srcpath" value="../testselenium">
<property name="test.xml" value="../xml">
<property name="test.report" value="../report">
<property name="lib.dir" value="../lib" />
<path id="compile.path">
<fileset dir="${lib.dir}">
<include name="junit.jar" />
<include name="ant.jar" />
</fileset>
</path>
<target name="init">
<delete dir="${run.classpath}" />
<mkdir dir="${run.classpath}" />
<delete dir="${test.report}" />
<mkdir dir="${test.report}" />
<delete dir="${test.xml}" />
<mkdir dir="${test.xml}" />
</target>
<target name="compile" depends="init">
<javac destdir="${run.classpath}" srcdir="${run.srcpath}" />
<target name="junit" depends="compile">
<junit printsummary="false">
<classpath path="${run.classpath}">
<path refid="compile.path" />
</classpath>
<formatter type="xml" />
<batchtest todir="${test.xml}">
<fileset dir="${run.classpath}">
<include name="**/test*.class" />
<include name="**/*test.class" />
</fileset>
</batchtest>
</junit>
<junitreport todir="${test.xml}">
<fileset dir="${test.xml}">
<include name="test-*.xml" />
</fileset>
<report format="frames" todir="${test.report}" />
</junitreport>
</project>
2. 運作ant 腳本以後,就可以生成相應的junit 日志。
1.selenium 日志
當運作junit 腳本時,selenium 相關的腳本就會産生回放日志,但預設記錄的東西可讀性太差了,是以我們使用loggingselenium ( http://loggingselenium.sourceforge.net/usage.html ) ,可以将每個case 可以生成記錄selenium 指令的html 格式的result 了。
4. plugin 的下載下傳位址:
http://sourceforge.net/projects/loggingselenium/files/loggingselenium/release%201.2/logging-selenium-1.2.jar/download
5. 安裝方法:隻需要将下載下傳的logging-selenium-1.2.jar 導入到工程裡即可。
6. 編寫代碼如下
@before
public void setup() {
final string resultpath = "absolute-path-to-where-your-result-will-be-written";
final string resulthtmlfilename = resultpath + file.separator + "result.html";
final string resultencoding = "utf-8"
loggingwriter = loggingutils.createwriter(resulthtmlfilename, resultencoding);
loggingresultsformatter htmlformatter =
new htmlresultformatter(loggingwriter, resultencoding);
htmlformatter.setscreenshotbaseuri(""); // this is for linking to the screenshots
htmlformatter.setautomaticscreenshotpath(resultpath);
// wrap httpcommandprocessor from remote-control
loggingcommandprocessor myprocessor =
new loggingcommandprocessor(new httpcommandprocessor(your-configs), htmlformatter);
selenium = new loggingdefaultselenium(myprocessor);
selenium.start();
}
@after
public void teardown() {
selenium.stop();
try {
if (null != loggingwriter) {
loggingwriter.close();
}
} catch (ioexception e) {
// do nothing
}
7. 運作成功以後在指定的目錄中生成相應的reports
七
七、架構優勢
1. 記錄測試的過程,所見即是所得,selenium 的所有内部程式都是用javascipt 編寫的,比較靈活;
2. 可以通過selenium ide 錄制腳本,腳本可以回放,可以作為junit 編碼的雛形;
3. 支援多種作業系統;
4. 支援多種編碼語言。java,.net, perl, python, ruby
八、架構劣勢
1. selenium 的錄制工具隻能安裝在firefox 浏覽器上, 如果系統界面不被firefox 支援,那就要花費一定的時間去手寫case 。 不過最近聽說有一個工具 叫 360webtester , 可以支援ie 的錄制,而且是國産的評價還不錯,有時間我要研究一下。