自動(dòng)化測(cè)試框架分類與思考

自動(dòng)化測(cè)試一直是敏捷開發(fā)和敏捷測(cè)試的重要基石,也是DevOps和CI/CD必不可少的組成部分。由于不同項(xiàng)目的測(cè)試需求不同,以及各種不同的限制票从,導(dǎo)致需要的自動(dòng)化測(cè)試框架和工具也不同。比如很多金融和能源類的企業(yè)就傾向于選擇收費(fèi)的企業(yè)級(jí)自動(dòng)化測(cè)試框架或者工具滨嘱,而新型互聯(lián)網(wǎng)企業(yè)則傾向于開源免費(fèi)的自動(dòng)化測(cè)試框架或者工具峰鄙,或者基于它們進(jìn)行二次定制開發(fā),或者重新開發(fā)適合自己的自動(dòng)化測(cè)試框架太雨、工具或者平臺(tái)吟榴。

我之前寫過一篇文章——《自動(dòng)化測(cè)試框架Cucumber和RobotFramework的實(shí)戰(zhàn)對(duì)比》僅僅針對(duì)兩種自動(dòng)化測(cè)試框架進(jìn)行了討論,卻引發(fā)了大量的討論囊扳,由此可見業(yè)界對(duì)于自動(dòng)化測(cè)試框架存在很多不同的理解和爭(zhēng)議吩翻。在我看來,沒有任何一個(gè)自動(dòng)化測(cè)試框架是銀彈锥咸,并且適合所有類型的測(cè)試狭瞎,所以“如何選擇一款適合自己的測(cè)試框架”變成為了一個(gè)首要問題。我將自動(dòng)化測(cè)試進(jìn)行了簡單的分層她君,見下圖。

image.png

自動(dòng)化測(cè)試架構(gòu)分層圖

其中測(cè)試庫和被測(cè)系統(tǒng)緊密相關(guān)葫哗,所以可以選擇的范圍不是很大缔刹,也很難進(jìn)行統(tǒng)一分類。而測(cè)試框架與被測(cè)系統(tǒng)關(guān)系并不緊密劣针,而是和技術(shù)棧校镐,開發(fā)流程與組織管理等關(guān)系緊密相關(guān),并且種類繁多捺典,可選擇范圍很多鸟廓,所以選擇也相對(duì)比較困難。

因此對(duì)測(cè)試框架進(jìn)行統(tǒng)一分類可以更好的幫助團(tuán)隊(duì)選擇適合自己的測(cè)試框架,從而更好進(jìn)行自動(dòng)化測(cè)試開發(fā)引谜。

本文根據(jù)自動(dòng)化測(cè)試用例的呈現(xiàn)方式和管理方式將其分為四種類型:函數(shù)型牍陌,單領(lǐng)域語言型,多領(lǐng)域語言型以及富文檔型员咽。

四個(gè)類型:

函數(shù)型

函數(shù)型自動(dòng)化測(cè)試框架是第一代自動(dòng)化測(cè)試框架毒涧,也是最輕量的測(cè)試框架。它只是通過函數(shù)的方式來定義測(cè)試用例贝室,并且通過管理這些函數(shù)的調(diào)用來管理測(cè)試用例契讲,從而快速的實(shí)現(xiàn)自動(dòng)化測(cè)試,比如xUnit等滑频。

例子JUnit:

public class DemoTest {
  @Test
  public void testAddWithTwoNumbers() {
    //測(cè)試實(shí)現(xiàn)代碼
  }
}

函數(shù)型自動(dòng)化測(cè)試框架由來已久捡偏,開發(fā)快速,運(yùn)行穩(wěn)定峡迷。雖然它相對(duì)簡單與輕量银伟,但是也存在缺點(diǎn):很難通過函數(shù)名來描述測(cè)試用例的內(nèi)容和細(xì)節(jié),并且不方便對(duì)測(cè)試用例進(jìn)行單獨(dú)管理凉当,因?yàn)闇y(cè)試用例的描述函數(shù)名和測(cè)試實(shí)現(xiàn)通常都在一起枣申。

單領(lǐng)域語言型

由于函數(shù)型的自動(dòng)化測(cè)試框架很難通過函數(shù)名去描述一個(gè)測(cè)試用例的內(nèi)容。為了更清晰和容易的描述測(cè)試用例看杭,就出現(xiàn)了單DSL型的自動(dòng)化測(cè)試框架忠藤,比如RSpec,Jasmine楼雹,Mocha等模孩。

例子Jasmine:

describe("The add function of the calculator can add two numbers", function() {
  it("should get the sum after add two numbers", function() {
    //測(cè)試實(shí)現(xiàn)代碼
  });
});

單領(lǐng)域語言型可以通過自然語言或者關(guān)鍵字形式的領(lǐng)域語言來描述測(cè)試用例,從而以一種更加易讀和理解的方式來描述測(cè)試用例贮缅。但是每個(gè)測(cè)試用例只用一句DSL語言榨咐,并不能很好的描述測(cè)試用例和被測(cè)場(chǎng)景,不易形成一套好的活文檔谴供。由于它的測(cè)試用例與測(cè)試實(shí)現(xiàn)通常也是在一起的块茁,所以也不方便對(duì)測(cè)試用例進(jìn)行單獨(dú)管理。

image.png

多領(lǐng)域語言型

由于單DSL型框架中對(duì)于每個(gè)測(cè)試用例只能使用一句DSL來描述桂肌,并不能很好的體現(xiàn)測(cè)試用例場(chǎng)景数焊,比如測(cè)試的前提,行為和結(jié)果等崎场。為了能在測(cè)試用例層更為清晰的描述測(cè)試用例的行為和測(cè)試數(shù)據(jù)等型信息佩耳,出現(xiàn)了多領(lǐng)域語言型的自動(dòng)化測(cè)試框架,比如Cucumber谭跨,JBehave干厚,SpecFlow李滴,RF等。

例子Cucumber:

測(cè)試用例代碼

Feature: The add function of the calculator can add two numbers
  Scenario: add two numbers
    Given there are two numbers <Number 1> and <Number 2>
    When add these two numbers 
    Then should get <Sum> of two numbers
  Examples:
    | Number 1 | Number 2 | Sum |
    | 1        | 2        | 3   |
    | -1       | 2        | 1   |

測(cè)試實(shí)現(xiàn)代碼

Given(/^there are two numbers$/) do
  //測(cè)試實(shí)現(xiàn)代碼
end
When(/^add two numbers together$/) do
  //測(cè)試實(shí)現(xiàn)代碼
end
Then(/^should get sum of two numbers$/) do
  //測(cè)試實(shí)現(xiàn)代碼
end

多領(lǐng)域語言型的框架可以通過多句或者多個(gè)關(guān)鍵字的領(lǐng)域語言來描述一個(gè)特定的場(chǎng)景蛮瞄,使得測(cè)試用例更容易閱讀和理解所坯,并且比較容易做成一套活文檔系統(tǒng)。由于測(cè)試用例和測(cè)試實(shí)現(xiàn)是分離的裕坊,還可以對(duì)測(cè)試用例進(jìn)行獨(dú)立管理包竹。

但是缺點(diǎn)也是比較明顯的,開發(fā)籍凝、管理和維護(hù)成本較高周瞎,并且如果沒有業(yè)務(wù)分析或者產(chǎn)品人員等非技術(shù)人員參與協(xié)作開發(fā),那么它的投入產(chǎn)出比就很低饵蒂,大家往往會(huì)認(rèn)為它是事倍功半声诸。

富文檔型

對(duì)于一些場(chǎng)景十分復(fù)雜,需要通過富文檔的方式來描述軟件測(cè)試場(chǎng)景退盯,甚至需要一些業(yè)務(wù)流程圖或者系統(tǒng)用戶界面等彼乌,比如Concordion,F(xiàn)itnesse渊迁,Guage等慰照。

例子 Condordion:

測(cè)試用例代碼,其中包含部分測(cè)試代碼琉朽,比如斷言等毒租,其中concordion.css使用的是官方樣例代碼

<html xmlns:concordion="http://www.concordion.org/2007/concordion">
<link href="concordion.css" rel="stylesheet" type="text/css" />
  <body>
    <h1>Test Demo</h1>
    <p> Test the add function of  the calculator can add two numbers </p>
    <p> The Caculator:</p>
    <div> <img src="./Calculator.png"/> </div>
    <div concordion:example="add">
      <h3>Examples</h3>
      <table>
        <tr>
          <th>Number 1</th>
          <th>Number 2</th>
          <th>Sum</th>
        </tr>
        <tr concordion:execute="#sum = addWithTwoNumbers(#number1,number2)">
          <td concordion:set="#number1">1</td>
          <td concordion:set="#number2">2</td>
          <td concordion:assert-equals="#sum">3</td>
        </tr>
        <tr concordion:execute="#sum = addWithTwoNumbers(#number1,number2)">
          <td concordion:set="#number1">-1</td>
          <td concordion:set="#number2">2</td>
          <td concordion:assert-equals="#sum">1</td>
        </tr>
      </table>
    </div>
  </body>
</html>

測(cè)試用例呈現(xiàn)文檔:

image.png

測(cè)試用例中的函數(shù)實(shí)現(xiàn)代碼:

@RunWith(ConcordionRunner.class)
public class CaculatorFixture {
  public String addWithTwoNumbers(String number1, String number2) {
    //測(cè)試實(shí)現(xiàn)代碼
  }
}

(注:雖然說最新版的Concordion已經(jīng)支持MarkDown了,從而降低了一些開發(fā)成本箱叁,但是其對(duì)MarkDown的特性支持有待增加墅垮。所以如果需要更為豐富的文檔形式,仍然需要使用HTML來開發(fā)測(cè)試用例耕漱。)

富文檔型的框架比多領(lǐng)域語言型擁有更為豐富的文檔算色,更容易閱讀和理解,從而能做成說明書式的活文檔螟够,使得所有角色的人都能審閱灾梦。并且其測(cè)試用例和測(cè)試實(shí)現(xiàn)也是分離的。但是當(dāng)前業(yè)界存在的富文檔型測(cè)試框架的易用性和協(xié)作性都還不是很好妓笙,導(dǎo)致其開發(fā)若河,管理和維護(hù)成本相比前三種是最高的。并且當(dāng)沒有其它各個(gè)角色來協(xié)同開發(fā)给郊,管理和維護(hù)時(shí)牡肉,其投入產(chǎn)出比也是最低的捧灰,所以它在行業(yè)中的使用率也是很低的淆九。這類測(cè)試框架在易用性和協(xié)作性方面還有很大的發(fā)展空間统锤,并且也是自動(dòng)化測(cè)試框架和活文檔系統(tǒng)的一個(gè)重要的發(fā)展方向。

思考與選擇

自動(dòng)化測(cè)試的代碼實(shí)現(xiàn)層一般是與編程語言強(qiáng)相關(guān)的炭庙,而主流的編程語言比較少饲窿,所以選擇比較容易:一般建議選擇團(tuán)隊(duì)大部分成員都熟悉的編程語言(這樣可以促使整個(gè)團(tuán)隊(duì)來對(duì)自動(dòng)化測(cè)試進(jìn)行開發(fā)和維護(hù))或者是有特定測(cè)試庫的編程語言(比如需要使用Scapy時(shí)就只能選擇基于Python的自動(dòng)化測(cè)試框架)。當(dāng)確認(rèn)自動(dòng)化測(cè)試開發(fā)語言后焕蹄,真正的問題是如何在如此眾多的自動(dòng)化測(cè)試框架里面選擇合適自己的自動(dòng)化測(cè)試框架逾雄。選擇方法可以根據(jù)以上四種類型來進(jìn)行選擇,從而縮小選擇范圍腻脏。

  • 如果團(tuán)隊(duì)只是需要快速實(shí)現(xiàn)自動(dòng)化測(cè)試鸦泳,沒有知識(shí)的傳遞問題,也不需要與業(yè)務(wù)分析和產(chǎn)品經(jīng)歷等非技術(shù)人員進(jìn)行協(xié)作開發(fā)時(shí)永品,可以選擇函數(shù)型自動(dòng)化測(cè)試框架做鹰。
  • 如果為了解決知識(shí)傳遞問題,讓測(cè)試用例更可讀和易懂鼎姐,并且沒有非技術(shù)人員參與協(xié)作開發(fā)钾麸,這時(shí)可以選擇單領(lǐng)域語言型。
  • 如果為了進(jìn)一步解決和非技術(shù)人員協(xié)作開發(fā)的問題炕桨,并且想有一套簡版的活文檔饭尝,可以選擇多領(lǐng)域語言型自動(dòng)化測(cè)試框架。
  • 如果為了讓測(cè)試用例擁有更為豐富的表現(xiàn)力献宫,比如包含一個(gè)流程圖來說明被測(cè)場(chǎng)景的流程钥平,或者使用不同的格式或者表格來描述用例的細(xì)節(jié),以及擁有一套豐富的活文檔遵蚜,這時(shí)就可以使用富文檔型帖池。不過由于當(dāng)前的富文檔型測(cè)試框架在編寫用例時(shí)需要一定的技能,所以非技術(shù)人員很難直接參與協(xié)作編寫吭净。并且其編寫以及維護(hù)成本更高睡汹,可能使得自動(dòng)化測(cè)試開發(fā)人員使用的意愿也不是很高。參考自動(dòng)化測(cè)試工具選項(xiàng)金字塔:
image.png

當(dāng)確認(rèn)了測(cè)試框架類型之后寂殉,比如只有一個(gè)可選項(xiàng)(Java->函數(shù)型->JUnit)囚巴,那么就直接使用了,但是如果存在多選項(xiàng)(JavaScript-> 單領(lǐng)域語言型->Jasmine vs Mocha)友扰,就還需要對(duì)其進(jìn)行深入比較彤叉,從而最終選擇自己適合的自動(dòng)化測(cè)試框架。

擴(kuò)展閱讀:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末村怪,一起剝皮案震驚了整個(gè)濱河市秽浇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甚负,老刑警劉巖柬焕,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审残,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡斑举,警方通過查閱死者的電腦和手機(jī)搅轿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富玷,“玉大人璧坟,你說我怎么就攤上這事∈昱常” “怎么了雀鹃?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長励两。 經(jīng)常有香客問我褐澎,道長,這世上最難降的妖魔是什么伐蒋? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任工三,我火速辦了婚禮,結(jié)果婚禮上先鱼,老公的妹妹穿的比我還像新娘俭正。我一直安慰自己,他們只是感情好焙畔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布掸读。 她就那樣靜靜地躺著,像睡著了一般宏多。 火紅的嫁衣襯著肌膚如雪儿惫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天伸但,我揣著相機(jī)與錄音肾请,去河邊找鬼。 笑死更胖,一個(gè)胖子當(dāng)著我的面吹牛铛铁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播却妨,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饵逐,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了彪标?” 一聲冷哼從身側(cè)響起倍权,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捞烟,沒想到半個(gè)月后薄声,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萌业,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年奸柬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴程。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡廓奕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档叔,到底是詐尸還是另有隱情桌粉,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布衙四,位于F島的核電站铃肯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏传蹈。R本人自食惡果不足惜押逼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惦界。 院中可真熱鬧挑格,春花似錦、人聲如沸沾歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灾搏。三九已至挫望,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狂窑,已是汗流浹背媳板。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泉哈,地道東北人拷肌。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像旨巷,于是被迫代替她去往敵國和親巨缘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容