欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

聊聊 Python 的單元測(cè)試框架(二):nose 和它的繼任者 nose2

系統(tǒng) 1857 0

聊聊 Python 的單元測(cè)試框架(二):nose 和它的繼任者 nose2

聊聊 Python 的單元測(cè)試框架(二):nose 和它的繼任者 nose2_第1張圖片


作者:HelloGitHub- Prodesire

HelloGitHub 的《講解開(kāi)源項(xiàng)目》系列,項(xiàng)目地址:https://github.com/HelloGitHub-Team/Article

一、nose

nose 是一個(gè)第三方單元測(cè)試框架,它 完全兼容 unittest ,并且號(hào)稱(chēng)是一個(gè)更好用的測(cè)試框架。

那么 nose 除了具備 unittest 的所有功能外,還具有哪些優(yōu)勢(shì)呢?

1.1 用例編寫(xiě)

用例的編寫(xiě)方式除了編寫(xiě)繼承于 unittest.TestCase 的測(cè)試類(lèi)外,還可以編寫(xiě)成 沒(méi)有繼承的測(cè)試類(lèi) 。比如,寫(xiě)成如下形式也會(huì)被 nose 視作一個(gè)測(cè)試類(lèi):

              
                from nose.tools import raises

class TestStringMethods:

    def test_upper(self):
        assert 'foo'.upper() == 'FOO'

    def test_isupper(self):
        assert 'FOO'.isupper()
        assert not 'Foo'.isupper()

    @raises(TypeError)
    def test_split(self):
        s = 'hello world'
        assert s.split() == ['hello', 'world']
        # check that s.split fails when the separator is not a string
        s.split(2)
              
            

當(dāng)然,測(cè)試類(lèi)并沒(méi)有繼承 unittest.TestCase ,將不能使用其內(nèi)置的各類(lèi) assertXXX 方法,進(jìn)而導(dǎo)致用例出錯(cuò)時(shí)無(wú)法獲得更加詳細(xì)的上下文信息。

此外, nose 也支持 定義函數(shù) 來(lái)作為測(cè)試,這給許多簡(jiǎn)單的測(cè)試場(chǎng)景帶來(lái)很大的便利:

              
                def test_upper():
    assert 'foo'.upper() == 'FOO'
              
            

1.2 用例發(fā)現(xiàn)和執(zhí)行

unittest 所支持的用例發(fā)現(xiàn)和執(zhí)行能力, nose 均支持。
nose 支持用例自動(dòng)(遞歸)發(fā)現(xiàn):

  • 默認(rèn)發(fā)現(xiàn)當(dāng)前目錄下所有包含 test 的測(cè)試用例,但不包括以 _ 開(kāi)頭的用例
    • 使用 nosetests 命令
  • 通過(guò) -w 參數(shù)指定要自動(dòng)發(fā)現(xiàn)的目錄, -m 參數(shù)指定用例文件、目錄、函數(shù)、類(lèi)的名稱(chēng)模式(正則匹配)
    • nosetests -w project_directory "test_.+"

nose 也支持執(zhí)行指定用例:

  • 指定測(cè)試模塊
    • nosetests test.module
  • 指定測(cè)試類(lèi)
    • nosetests a.test:TestCase
  • 指定測(cè)試方法
    • nosetests another.test:TestCase.test_method
  • 指定測(cè)試文件路徑
    • nosetests /path/to/test/file.py
  • 指定測(cè)試文件路徑+測(cè)試類(lèi)或測(cè)試函數(shù)(這是 unittest 所不支持的)
    • nosetests /path/to/test/file.py:TestCase
    • nosetests /path/to/test/file.py:TestCase.test_method
    • nosetests /path/to/test/file.py:test_function

1.3 測(cè)試夾具(Fixtures)

nose 除了支持 unittest 所支持的定義測(cè)試前置和清理方式,還支持一種更為簡(jiǎn)單的定義方式:

              
                def setup_func():
    "set up test fixtures"

def teardown_func():
    "tear down test fixtures"

@with_setup(setup_func, teardown_func)
def test():
    "test ..."
              
            

只需定義兩個(gè)函數(shù)用來(lái)表示前置和清理方法,通過(guò) nose.tools.with_setup 裝飾器裝飾測(cè)試函數(shù), nose 便會(huì)在執(zhí)行測(cè)試用例前后分別執(zhí)行所定義的前置和清理函數(shù)。

1.4 子測(cè)試/測(cè)試生成器

nose 除了支持 unittest 中的 TestCase.subTest ,還支持一種更為強(qiáng)大的子測(cè)試編寫(xiě)方式,也就是 測(cè)試生成器(Test generators) ,通過(guò) yield 實(shí)現(xiàn)。

在下面的示例中,定義一個(gè) test_evens 測(cè)試函數(shù),里面生成了 5 個(gè)子測(cè)試 check_even

              
                def test_evens():
    for i in range(0, 5):
        yield check_even, i, i*3

def check_even(n, nn):
    assert n % 2 == 0 or nn % 2 == 0
              
            

此外,相較于 unittest.TestCase.subTest 多個(gè)子測(cè)試只能執(zhí)行一次測(cè)試前置和清理, nose 測(cè)試生成器 可以支持每個(gè)子測(cè)試執(zhí)行一次測(cè)試前置和清理,如:

              
                def test_generator():
    # ...
    yield func, arg, arg # ...

@with_setup(setup_func, teardown_func)
def func(arg):
    assert something_about(arg)
              
            

1.5 插件體系

nose 相較于 unittest 一個(gè)最大的優(yōu)勢(shì)就是插件體系,自帶了很多有用的插件,也有豐富的第三方插件。這樣就能做更多的事情。

其中,自帶插件如下:

  • AllModules:在所有模塊中收集用例
  • Attrib:給用例打標(biāo)簽,并可運(yùn)行含指定標(biāo)簽的用例
  • Capture:捕獲用例的標(biāo)準(zhǔn)輸出
  • Collect:快速收集用例
  • Cover:統(tǒng)計(jì)代碼覆蓋率
  • Debug:用例失敗時(shí)進(jìn)入 pdb 調(diào)試
  • Deprecated:標(biāo)記用例為棄用
  • Doctests:運(yùn)行文檔用例
  • Failure Detail:斷言失敗時(shí)提供上下文信息
  • Isolate:保護(hù)用例避免受一些副作用的影響
  • Logcapture:捕捉 logging 輸出
  • Multiprocess:并行執(zhí)行用例
  • Prof:使用熱點(diǎn)分析器進(jìn)行分析
  • Skip:標(biāo)記用例為跳過(guò)
  • Testid:為輸出的每個(gè)用例名稱(chēng)添加測(cè)試 ID
  • Xunit:以 xunit 格式輸出測(cè)試結(jié)果

而第三方庫(kù)則多種多樣,如用來(lái)生成 HTML 格式測(cè)試報(bào)告的 nose-htmloutput 等,這里不再一一列出。

得益于 nose 豐富的插件生態(tài),當(dāng) nose 本身不能夠完全滿(mǎn)足我們的測(cè)試需求時(shí),可以通過(guò)安裝插件,并在 nosetests 命令行指定該插件所提供的特定參數(shù)即可非常容易的使用插件。
相較于 unittest ,就能省去很多自己開(kāi)發(fā)額外測(cè)試邏輯的精力。

二、nose2

nose2 是 nose 的繼任者。
它們的理念都是讓編寫(xiě)和運(yùn)行測(cè)試用例變得更容易。

它們有很多相同點(diǎn),比如都兼容 unittest ,支持使用函數(shù)作為測(cè)試用例,支持子測(cè)試,擁有插件體系。但也有很多不同點(diǎn),下面列出一些主要的不同點(diǎn):

  • 發(fā)現(xiàn)和載入測(cè)試
    • nose 自行實(shí)現(xiàn)了模塊加載功能,使用惰性方式加載測(cè)試模塊,加載一個(gè)執(zhí)行一個(gè)。
    • nose2 則借助內(nèi)建的 import () 導(dǎo)入模塊,并且是先全部載入,再執(zhí)行用例
    • nose2 并不支持 nose 所支持的所有測(cè)試用例項(xiàng)目結(jié)構(gòu),比如如下用例文件的結(jié)構(gòu)在 nose2 中就不受支持:
              
                .
`-- tests
    |-- more_tests
    |   `-- test.py
    `-- test.py
              
            
  • 測(cè)試前置和清理函數(shù)級(jí)別
    • nose 支持方法、類(lèi)、模塊和包級(jí)別的測(cè)試前置和清理函數(shù)
    • nose2 則不支持包級(jí)別的測(cè)試前置和清理函數(shù)
  • 子測(cè)試
    • nose2 除了支持使用測(cè)試生成器來(lái)實(shí)現(xiàn)子測(cè)試外,還支持使用參數(shù)化測(cè)試(Parameterized tests)來(lái)實(shí)現(xiàn)子測(cè)試
    • nose2 除了像 nose 一樣支持在測(cè)試函數(shù)和測(cè)試類(lèi)(不繼承于 unittest.TestCase )中支持參數(shù)化測(cè)試和測(cè)試生成器外,還支持在繼承于 unittest.TestCase 的測(cè)試類(lèi)中使用
  • 配置化
    • nose 期望所有插件的配置通過(guò)命令行參數(shù)進(jìn)行配置
    • nose2 則通過(guò)配置文件進(jìn)行控制,以最小化命令行參數(shù)讓人讀得更舒服

更多對(duì)比詳見(jiàn) 官方文檔。

三、小結(jié)

nose nose2 在做到兼容 unittest 上就足以看出它們的目標(biāo),那便是要吸引原來(lái)那些使用 unittest 的用戶(hù)來(lái)使用它們。它們確實(shí)做到了!

nose nose2 在用例編寫(xiě)、測(cè)試夾具、子測(cè)試上做出改進(jìn),已經(jīng)能讓日常用例編寫(xiě)工作變得更加容易和靈活。同時(shí)又引入插件體系,進(jìn)一步將單元測(cè)試框架的能力提升了一個(gè)大大的臺(tái)階,這讓很多在基礎(chǔ)測(cè)試功能之上的高階功能的實(shí)現(xiàn)和共享成為了可能。也難怪有眾多開(kāi)發(fā)者對(duì)它們情有獨(dú)鐘。


『講解開(kāi)源項(xiàng)目系列』 ——讓對(duì)開(kāi)源項(xiàng)目感興趣的人不再畏懼、讓開(kāi)源項(xiàng)目的發(fā)起者不再孤單。跟著我們的文章,你會(huì)發(fā)現(xiàn)編程的樂(lè)趣、使用和發(fā)現(xiàn)參與開(kāi)源項(xiàng)目如此簡(jiǎn)單。歡迎留言聯(lián)系我們、加入我們,讓更多人愛(ài)上開(kāi)源、貢獻(xiàn)開(kāi)源~


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产极品久久 | 一级做a爰片欧美一区 | 成人在线视频网站 | 亚洲精品一区二区三区蜜桃久 | 日韩欧美一区二区视频 | 浮力影院最新地址 | 一区二区三区四区电影 | 亚洲视频在线观看网站 | 99av.com| 欧美一区二区三区在线观看视频 | 国产精品18hdxxxⅹ在线 | 老色鬼a∨在线视频在线观看 | 色婷婷99综合久久久精品 | 日本jizzz | 色aaa| 男女啪啦猛视频免费 | 久久亚洲国产成人影院 | 一个色综合网 | 天天干天天操天天爽 | 国产一区在线免费观看 | 日韩久操 | 嫩草影院在线入口 | 国产一区二区三区久久 | 综合一区二区三区 | 国产免费av在线 | 性视频一区二区 | 日日摸夜夜添夜夜添精品视频 | 欧美高清成人 | 一级毛片视频免费 | 狠狠的撸2015最新版狠狠的撸2015最新版 | 午夜精品视频在线观看 | 免费一级毛片在线播放视频 | 91av一区 | 波多野结在线 | 久久色伦理资源站 | 日本一本久草 | 精品视频日本 | 亚洲国产欧美在线人网站 | 免费观看一区二区 | 91精品国产闺蜜国产在线 | 日操夜操天天操 |