天天看點

自動化測試架構的搭建

說起自動化測試,我想大家都會有個疑問,要不要做自動化測試? 自動化測試給我們帶來的收益是否會超出在建設時所投入的成本,這個嘛别說是我,即便是高手也很難回答,自動化測試的初衷是美好的,而測試工程師往往在實作過程中花費了很多成本、精力,而最終以失敗告終。 失敗的原因會很多,我總結幾項:

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 的錄制,而且是國産的評價還不錯,有時間我要研究一下。

繼續閱讀