shUnit2--shell腳本單元測試框架

本文主要翻譯自shUnit2的README文檔休弃。

摘要

shUnit2是一個為bash shell腳本設(shè)計的xUnit類型的單元測試框架建椰,使用方式和JUnit撒穷、PyUnit......類似。如果你曾經(jīng)使用過類似的單元測試框架芳肌,上手將會容易很多碾局。

介紹

據(jù)說在log4sh(一種類似log4j基于shell的日志框架)做自動化測試時荆残,發(fā)現(xiàn)了各種兼容性問題,開發(fā)者最后決定開發(fā)出一款shell單元測試框架净当,于是有了shUnit2内斯。
之前的代碼倉庫在code.google.com/p/shunit2,google code關(guān)閉以后開發(fā)者將其鏡像到github像啼,最新的2.1版本最后一次修改提交是2017年1月俘闯。

支持的操作系統(tǒng)

  • Cygwin
  • FreeBSD (user supported)
  • Linux (Gentoo, Ubuntu)
  • Mac OS X
  • Solaris 8, 9, 10 (inc. OpenSolaris)

支持的shell

  • Bourne Shell (sh)
  • BASH - GNU Bourne Again SHell (bash)
  • DASH (dash)
  • Korn Shell (ksh)
  • pdksh - Public Domain Korn Shell (pdksh)
  • zsh - Zsh (zsh) (since 2.1.2) please see the Zsh shell errata for more information

詳見代碼倉庫的 (doc/RELEASE_NOTES-X.X.X.txt)

新手入門

代碼倉庫的example包含了幾個參考范例,我們可以試著執(zhí)行一下忽冻,我是在CentOS 7環(huán)境下運(yùn)行的真朗。

#! /bin/sh
# file: examples/equality_test.sh
testEquality()
{
  assertEquals 1 1
}
# load shunit2
. ../src/shunit2

執(zhí)行測試腳本,你將看到如下結(jié)果:

testEquality
 
Ran 1 test.
 
OK 

以上范例沒有實際的被測試腳本僧诚,但是依然輸出的測試結(jié)果遮婶,所有內(nèi)容都是shUnit2生成的。shUnit2具體的測試步驟如下:

  1. source shunit2以后湖笨,單元測試將會開始執(zhí)行旗扑,一開始會掃描代碼中所有test開頭的函數(shù),并將其加入單元測試列表慈省。
  2. 一個測試集合開始測試前會執(zhí)行oneTimeSetUp函數(shù)臀防,oneTimeSetUp函數(shù)內(nèi)部可以編寫一些全局的初始條件,該函數(shù)在本次測試過程中僅執(zhí)行一次。對應(yīng)的是所有測試用例結(jié)束后袱衷,將會執(zhí)行oneTimeTearDown函數(shù)捎废,在這里可以執(zhí)行一些狀態(tài)恢復(fù)的操作。
  3. 每個test用例函數(shù)被執(zhí)行前致燥,都會執(zhí)行setUp函數(shù)登疗,測試結(jié)束會執(zhí)行tearDown函數(shù),完整的單元測試用例執(zhí)行過程即:setUp() > test() > tearDown()篡悟。
  4. 測試完成后谜叹,shUnit2將會輸出測試報告匾寝。

現(xiàn)在我們來看一個失敗的測試:

#! /bin/sh
# file: examples/party_test.sh
 
testEquality()
{
  assertEquals 1 1
}
 
testPartyLikeItIs1999()
{
  year=`date '+%Y'`
  assertEquals "It's not 1999 :-(" \
      '1999' "${year}"
}
 
# load shunit2
. ../src/shunit2

這個測試的結(jié)果一定是失敗的搬葬,因為年份錯了。

testEquality
testPartyLikeItIs1999
ASSERT:It's not 1999 :-( expected:<1999> but was:<2017>
Ran 2 tests.
FAILED (failures=1)

但是你會發(fā)現(xiàn)我們可以在測試框架提供的assertEquals函數(shù)中插入一些文本信息艳悔,另外無論是字符串還是數(shù)字的比較急凰,assertEquals函數(shù)都能很好的兼容。

函數(shù)說明

通常字符串我們需要使用單引號'或者雙引號"來引用猜年。

Asserts[斷言]

所有函數(shù)如下抡锈,從字面意思都很好理解:

assertEquals [message] expected actual
assertNotEquals [message] expected actual
assertSame [message] expected actual                   等價于assertEquals
assertNotSame [message] unexpected actual          等價于assertNotEquals
assertNull [message] value
assertNotNull [message] value
assertTrue [message] condition
   assertTrue "[ 34 -gt 23 ]"
   assertTrue 'test failed' "[ -r /some/non-existant/file ]"
   assertTrue 'test failed' '[ 1 -eq 1 -a 2 -eq 2 ]'
assertFalse [message] condition

Failures[失敗]

和斷言不同,F(xiàn)ailures函數(shù)不會對期望值和實際值進(jìn)行比較乔外,純粹就是報告測試失敗床三。通常用于復(fù)雜的邏輯測試,Assert的函數(shù)無法滿足測試需求杨幼,我們想用自己的代碼自行測試撇簿,而對該單元測試做一個簡單的標(biāo)記。

fail [message]
failNotEquals [message] unexpected actual
failSame [message] expected actual
failNotSame [message] expected actual

Setup/Teardown

oneTimeSetUp
oneTimeTearDown
setUp
tearDown

這4個函數(shù)在上面介紹過了差购。

Skipping

startSkipping 強(qiáng)制跳過剩余測試
endSkipping 
isSkipping

Suites

標(biāo)準(zhǔn)的測試集合中四瘫,測試用例需要以test開頭,如果想測試一些非標(biāo)準(zhǔn)命名的函數(shù)欲逃,就需要用到以下函數(shù)找蜜。記住,通常我們不希望這樣使用稳析。

suite
suite_addTest name

高級用法

一些常用的宏

預(yù)定義

Constant Value
SHUNIT_VERSION The version of shUnit2 you are running.
SHUNIT_TRUE Standard shell true value (the integer value 0).
SHUNIT_FALSE Standard shell false value (the integer value 1).
SHUNIT_ERROR The integer value 2.
SHUNIT_TMPDIR Path to temporary directory that will be automatically cleaned up upon exit of shUnit2.

用戶自定義

Constant Value
SHUNIT_PARENT The filename of the shell script containing the tests. This is needed specifically for Zsh support.

特殊

${ASSERT_EQUALS}: 包含行數(shù)信息的宏洗做,可替換assert函數(shù)。

#! /bin/sh
# file: examples/lineno_test.sh
 
testLineNo()
{
  # this assert will have line numbers included (e.g. "ASSERT:[123] ...") if
  # they are supported.
  echo "_ASSERT_EQUALS_ macro value: ${_ASSERT_EQUALS_}"
  ${_ASSERT_EQUALS_} '"not equal"' 1 2
 
  # this assert will not have line numbers included (e.g. "ASSERT: ...")
  assertEquals 'not equal' 1 2
}
 
# load shunit2
. ../src/shunit2

輸出

testLineNo
_ASSERT_EQUALS_ macro value: eval assertEquals --lineno "${LINENO:-}"
ASSERT:[9] not equal expected:<1> but was:<2>
ASSERT:not equal expected:<1> but was:<2>
Ran 1 test.
FAILED (failures=2)

測試Skipping

腳本

# available as examples/math.inc
 
add_generic()
{
    num_a=$1
    num_b=$2
 
    expr $1 + $2
}
 
add_bash()
{
    num_a=$1
    num_b=$2
 
    echo $(($1 + $2))
}

單元測試用例

#! /bin/sh
# available as examples/math_test.sh
testAdding()
{
    result=`add_generic 1 2`
    assertEquals \
        "the result of '${result}' was wrong" \
        3 "${result}"
 
    # disable non-generic tests
    [ -z "${BASH_VERSION:-}" ] && startSkipping
     
    result=`add_bash 1 2`
    assertEquals \
        "the result of '${result}' was wrong" \
        3 "${result}"
}
 
oneTimeSetUp()
{
    # load include to test
    . ./math.inc
}
 
# load and run shUnit2
. ../src/shell/shunit2 

在Bash shell的執(zhí)行結(jié)果:

testAdding
 
Ran 1 test.
 
OK

在Unix shell執(zhí)行結(jié)果卻是:

testAdding
 
Ran 1 test.
 
OK (skipped=1)

Skipping可以使用startSkipping()彰居、endSkipping()和isSkipping()這三個函數(shù)進(jìn)行控制诚纸。

我是咕咕雞,一個還在不停學(xué)習(xí)的全棧工程師裕菠。
熱愛生活咬清,喜歡跑步,家庭是我不斷向前進(jìn)步的動力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旧烧,一起剝皮案震驚了整個濱河市影钉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掘剪,老刑警劉巖平委,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夺谁,居然都是意外死亡廉赔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門匾鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜡塌,“玉大人,你說我怎么就攤上這事勿负×蟀” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵奴愉,是天一觀的道長琅摩。 經(jīng)常有香客問我,道長锭硼,這世上最難降的妖魔是什么房资? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮檀头,結(jié)果婚禮上轰异,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖擒,他們只是感情好溉浙,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒋荚,像睡著了一般戳稽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上期升,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天惊奇,我揣著相機(jī)與錄音,去河邊找鬼播赁。 笑死颂郎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的容为。 我是一名探鬼主播乓序,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼寺酪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了替劈?” 一聲冷哼從身側(cè)響起寄雀,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陨献,沒想到半個月后盒犹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡眨业,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年急膀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄捡。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卓嫂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墅茉,到底是詐尸還是另有隱情命黔,我是刑警寧澤呜呐,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布就斤,位于F島的核電站,受9級特大地震影響蘑辑,放射性物質(zhì)發(fā)生泄漏洋机。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一洋魂、第九天 我趴在偏房一處隱蔽的房頂上張望绷旗。 院中可真熱鬧,春花似錦副砍、人聲如沸衔肢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽角骤。三九已至,卻和暖如春心剥,著一層夾襖步出監(jiān)牢的瞬間邦尊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工优烧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蝉揍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓畦娄,卻偏偏與公主長得像又沾,于是被迫代替她去往敵國和親弊仪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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