您的位置:軟件測試 > 開源軟件測試 > 開源測試管理工具 >
使用Sahi測試Dojo應(yīng)用
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2012/12/6 10:56:45 ] 推薦標簽:

   下面以DojoWidget和Textbox兩個類為例講解Widget的封裝。

  function DojoWidget($self) {

  this.getLabel = function () {

  var $widId = getAttribute($self, "widgetid")

  _set($labelText, getLabelTextByFor($widId))

  return $labelText

  }

  this.hasError = function () {

  var $class = getAttribute($self, "class")

  return $class.indexOf("dijitError") == -1 ? false : true

  }

  }

  var $DojoTextbox = function Textbox($elem) {

  var $self = findEnclosingWidget($elem, "dijitValidationTextBox")

  DojoWidget.call(this, $self)

  var $textbox = _textbox("dijitReset dijitInputInner", _in($self))

  this.setValue = function ($value) {

  _setValue($textbox, $value)

  var $current = this.getValue()

  _assertEqual($value, $current)

  }

  this.getValue = function () {

  return _getValue($textbox)

  }

  this.blur = function () {

  _blur($textbox)

  }

  }

  core.sah中定義了所有的Dojo widget類。所有的Dojo widget類都繼承DojoWidget。DojoWidget定義了一些widget通用的函數(shù),例如getLabel和hasError。$self變量通過函數(shù)findEnclosingWidget獲得,這個變量代表了Dojo widget外層的元素。此函數(shù)通過檢查父節(jié)點中是否有widgetid屬性,并且檢查class屬性的值是否包含指定的標示widget類型的字符串(例如,DojoTextbox的類型字符串是dijitValidationTextBox)來識別widget的外層元素。Widget的繼承通過call函數(shù)實現(xiàn),它將$self傳給DojoWidget類的構(gòu)造器。$textbox的識別使用了_in函數(shù),這種方法保證了元素識別的準確性。事實上,無論一個widget本身有多復(fù)雜,通過_in函數(shù)可以將內(nèi)部元素查找與外界隔離。大家或許注意到this.setValue函數(shù)中有個比較奇怪的地方,this.getValue()的返回值是先賦值給$current變量然后進行斷言判斷的。為什么不寫成“_assertEqual($value,this.getValue())”呢?這是因為目前Sahi不支持這樣的語句,或許將來會支持。

  findByLabel的實現(xiàn)

  function findByLabel($labelText, $className) {

  var $label = _label($labelText)

  var $wid = getAttribute($label, "for")

  _set($id, findIdByWID($wid))

  var $div = _byId($id)

  return new $className($div)

  }

  

  function findIdByWID($wid) {

  var $widget = dojo.query("[widgetid='" + $wid + "']")[0]

  return $widget.getAttribute("id")

  }

  

  通過元素label標識元素的原則通過findByLabel函數(shù)實現(xiàn)。它有兩個參數(shù),第一個是label的文本內(nèi)容,第二個是目標widget的實現(xiàn)類。實現(xiàn)原理很簡單。label元素的for屬性值是widget的widgetid的值。因此,我們通過widgetid可以找到widget元素。但事實上,從下面大家看出來我們是先利用的dojo.query找到了元素對應(yīng)的id,然后通過_byId獲得widget元素。為什么用這種迂回的方法呢?根據(jù)Sahi的文檔,理論上我們是可以通過修改concat.js文件增加widgetid查找屬性(具體參見http://sahi.co.in/w/tweaking-sahi-apis)可以實現(xiàn)利用_div,_table或者_span等函數(shù)直接獲得widget元素。不幸的是,當(dāng)前版本中存在的一個bug導(dǎo)致自定義屬性不能被識別。所以,目前只能先通過widgetid找id的方法迂回解決。另外,值得一提的是因為findIdByWID函數(shù)用到了dojo的庫函數(shù),因此它被定義在browser tag中。

  數(shù)據(jù)驅(qū)動

  Sahi自帶對CSV,Excel以及數(shù)據(jù)庫訪問的函數(shù)。示例代碼示范了如何使用CSV進行數(shù)據(jù)驅(qū)動測試。讓我們一起來看看JobAppFormTests.sah中的testSimple函數(shù)。被注釋掉的部分是一般的定義測試數(shù)據(jù)的方法。_readCSVFile函數(shù)加載testdata.csv到$data變量,它事實上一個兩維數(shù)組。_dataDrive函數(shù)能夠自動遍歷數(shù)組數(shù)據(jù)調(diào)用fillForm函數(shù)。

  function testSimple() {

  /*

  var $eduValue="masters"

  var $nameValue="my name"

  var $addressValue="Shanghai"

  var $stateValue="California"

  fillForm($nameValue,$eduValue,$addressValue,$stateValue)

  */

  var $data = _readCSVFile("./testdata.csv")

  _dataDrive(fillForm, $data)

  }

  testdata.csv內(nèi)容:

  Tom, high school, Address1, Alaska

  Mike, masters, Address2, Florida

  John, PhD, Address3, Hawaii

  其他

  另外,Sahi提供了類似于JUnit的測試框架。所有以test開頭的函數(shù)都被認為是測試用例,如果有setUp和tearDown函數(shù),它們會分別在每個測試用例運行前后執(zhí)行。并且所有測試文件還是可以組織到一個.suite文件中作為一套測試用例運行。更詳細的介紹,請大家參考Sahi的官方文檔。Sahi也能支持拖放,大家可以參考示例代碼中Slider widget的實現(xiàn)。文件上傳是很多Web自動化測試的局限,不過,Sahi得益于它Proxy的架構(gòu)也實現(xiàn)了文件上傳功能。

  三.結(jié)束語

  總的來說,Sahi是一款不錯的Web自動化測試工具,尤其是它對元素關(guān)聯(lián)查找的支持以及頁面隱式等待的機制對Web2.0應(yīng)用的測試是很有幫助的。希望讀者閱讀完本文能有所收獲。如果,想了解更多關(guān)于Sahi的信息,請訪問Sahi的官方網(wǎng)站(http://sahi.co.in/w/) 并且可以通過訪問http://www.slideshare.net/narayanraman觀看Sahi的推廣演示文檔。如果對Sahi與Selenium的比較感興趣,可以訪問http://blog.sahi.co.in/2010/04/sahi-vs-selenium.html 。

上一頁123下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd