天天看點

别再輕易說會自動化了,99%測試人還不會用nose進行自動化測試

每天進步一點點,關注我們哦,每天分享測試技術文章

碼同學公衆号:自動化軟體測試

碼同學抖音号:小碼哥聊軟體測試

1 為什麼使用nose?

  • 編寫測試更容易。nose可以自動識别繼承于unittest.TestCase的測試單元,并執行測試,而且,nose也可以測試非繼承于unittest.TestCase的測試單元。nose提供了豐富的API便于編寫測試代碼。
  • 執行測試更容易。 隻要遵循一些簡單的規則去組織你的類庫和測試代碼,nose是可以自動識别單元測試的。執行測試是非常耗資源的,但是,一段第一個測試子產品被加載後,nose就開始執行測試。
  • 建立測試環境更容易。
  • 做你想做的事情更容易。 nose擁有很多内置的插件幫助進行暑輸出抓取、錯誤查找、代碼覆寫、文檔測試(doctest)等等。同樣,如果你不喜歡這些内置插件提供的功能或者這些插件不能滿足你的項目結構,你可以自定義開發插件來完成你想要做的事情。

2 基本使用

安裝:pip install nose

腳本指令:

nosetests [options] [(optional) test files or directories]

除了使用指令行這種方式之外,還可以在根目錄下放置配置檔案,配置檔案的類型為.noserc或nose.cfg檔案。配置檔案都是标準的ini内容格式。例如:

[nosetests]
verbosity=3
with-doctest=1           

3 擴充使用

nose自動收集單元測試,收集它目前工作目錄下的源代碼檔案、目錄以及包。任何的源代碼檔案、目錄或者包隻要比對正規表達式,他們就會被自動收集。包的測試收集按照樹的層級級别一級一級進行,是以package.tests、package.sub.tests、package.sub.sub2.tests将會被收集。

比對成功的包、任何python的源檔案都會當做測試用例。

3.1 選擇測試用例

将需要測試的名稱傳遞給nose的指令行。格式如下:

nosetests only_test_this.py

測試的名稱可以是腳本檔案的名稱或者子產品的名稱,也可以使用colon表達式表達的測試名稱。路徑可以是相對的路徑也可以是絕對的路徑。如下所示:

nosetests test.module
nosetests another.test:TestCase.test_method
nosetests a.test:TestCase
nosetests /path/to/test/file.py:test_function           

同樣可以使用-w開關來切換目前的工作路徑,進而改變nose查找測試用例的根路徑。用法如下:

nosetests -w /path/to/tests

更多關于自定義測試用例的收集與加載方式,可以使用插件的方式做到。

3.2 配置

除了3.1通過腳本指令傳遞參數的方式外,你還可以在根目錄下通過設定setup.cfg或者.noserc或者nose.cfg等配置檔案達到同樣的目的。例如:

[nosetests]
verbosity=3
with-doctest=1           

所有查找到的配置檔案将會被加載,而且配置項的值會合并。如果想覆寫标準的配置檔案,使用-c選項。

3.3 使用插件

使用pip安裝所需要的插件,然後通過nosetests指令行配置插件。執行如下指令驗證所安裝的插件,

nosetests –plugins

在指令行中添加           

-v或者-vv選項可以顯示每一個插件的更多資訊。 如果通過nose.main()或者nose.run()執行測試,可以将要使用的插件關鍵字參數的清單傳遞進去。

3.4 配置選項

-V,—version

輸出nose的版本

-p,—plugins

輸出可擷取的插件清單。

-v=DEFUALT,—verbose=DEFAULT

使用更多的verbose

--verbosity=VERBOSITY

設定verbosity;--verbosity=2與-v設定一緻

-q,—quiet=DEFAULT

使用更少的verbose

-c=FILES,—config=FILES

設定配置檔案。可以設定很多次,然後将所有的配置檔案合并。

-w=WHERE,--where=WHERE

設定查找的根目錄。

-py3where=WHERE

顧名思義,針對python3.x以上設定查找路徑。

-m=REGEX,--match=REGEX,—testmatch=REGEX

設定用于自動化收集用例的正規表達式。

--tests=NAMES

執行這些測試。

--debug-log=FILE

設定調試的日志檔案路徑。

--logging-config=FILE,—log-config=FILE

設定日志檔案的配置檔案。

-I=REGEX,—ignore-files=REGEX

設定自動收集測試用例時忽略的正規表達式。

-e=REGEX,—exclude=REGEX

排除要執行的測試用例的正規表達式

-i=REGEX,—include=REGEX

包含要執行的測試用例的正規表達式

-x,—stop

執行測試發生錯誤後,停止執行測試。

--noexe

不查找可以執行檔案。

-a=ATTR,--attr=ATTR

隻執行包含ATTR屬性的測試用例。

-A=EXPR,—eval-attr=EXPR

隻執行屬性與EXPR比對的測試用例。

-s,—nocapture

不抓取标準輸出(stdout)

--nologcapture

禁止使用日志插件

--logging-format=FORMAT

列印語句的自定義格式

--logging-datefmt=FORMAT

日志的日期時間格式

--logging-filter=FILTER

日志語句的過濾器。

--logging-clear-handlers

清除日志的其他handlers

--logging-level=DEFUALT

設定日志的等級

--with-coverage

開啟coverage插件

--cover-package=PACKAGE

限定coverage所在包

--cover-erase

在執行之前 清除上次coverage統計結果

--cover-testes

在coverage報告中包含測試子產品

--cover-html

産生html的coverage報告

--cover-html-dir=DIR

設定存儲html的目錄

--cover-xml

産生xml的coverage報告

--cover-xml-file=FILE

設定存儲coverage報告的xml檔案

--cover-config-file=DEFUALT

免費領取 碼同學軟體測試 課程筆記+超多學習資料+完整視訊+最新面試題,可以轉發文章 + 私信「碼同學666」擷取資料哦

設定coverage的配置檔案

-pdb

當測試失敗或産生錯誤是進入調試模式

--pdb-failures

當測試失敗時進入調試模式

--pdb-errors

當測試産生錯誤時進入調試模式

--with-doctest

開啟doctest插件

--doctest-tests

在測試子產品中查詢doctests

--with-profile

開啟profile插件

--profile-sort=SORT

設定profiler 輸出排序

--profile-stats-file=FILE

設定統計所在的檔案位址

--with-id

開啟TestId插件

--processes=NUM

開始測試處理器的個數

--processes-timeout=SECONDS

設定逾時時間。

--with-xuint

開始Xunit插件

--xuint-file=FILE

設定XUnit報告所在的xml檔案

--all-modules

開啟AllModules插件

--collect-only

開啟隻收集測試功能。隻收集測試用例及輸出測試名字,而不執行測試

4 編寫測試用例

4.1 項目組織結構

由于nose是自動收集測試用例的,隻有nose執行的測試目錄下的源代碼檔案、包名、子目錄名跟正規表達式比對成功後,才能被收集。而且代碼是樹級層次顯示的話,nose會逐級向下查找子目錄下的比對的測試用例。

比對的正規表達式預設值為:((?:^|[\\b_\\.-])[Tt]est.是以最好是以Test開頭,或者test開頭。當然也可以修改預設的比對的正規表達式。

是以,推薦的項目結構為:

别再輕易說會自動化了,99%測試人還不會用nose進行自動化測試

為項目單獨建一個test包,裡面按項目子產品分子包,最後以及為 “test_”開頭的測試用例源檔案。

4.2 測試結果

别再輕易說會自動化了,99%測試人還不會用nose進行自動化測試

4.3測試代碼

test_mymath.py中的代碼如下:

# -*- coding: utf-8 -*-__author__= 'Administrator'from nose.tools import assert_equalfrom nose.tools import with_setupimport  unittestimport mymath.math as mmathdef setUp():    print("============test math module setup==============")def teardown():    print("============test math module teardown==============")def test_math_add():
    result=mmath.add(4, 5)    print("================test_math_add============")
    assert_equal(10, result)class test_math3():    def setUp(self):        print("============test math class setup==============")    def teardown(self):        print("============test math class teardown==============")    def test_math_square(self):        print("=============== test_math_square================ ")
        assert_equal(9, mmath.square(3))    def test_math_sub(self):        print("=============== test_math_sub================ ")
        assert_equal(1, mmath.sub(3, 2))class test_math2(unittest.TestCase):    def test_math_multipy(self):        print("=============== test_math_multipy================ ")
        assert_equal(8, mmath.multiply(2, 4))           

test_logicOper.py 中的代碼如下:

# -*- coding: utf-8 -*-__author__ = 'Administrator'from nose.tools import assert_equalfrom  logicOperator.localOperator import  *def test_logicOper_isGreaterThan():    print("=================test_logicOper_isGreaterThan============")
    result=isGreaterThan(4,3)
    assert_equal(True,result)           

4.4 測試分析

(1)測試用例的收集

由于nose是按照正規表達式自動收集比對的測試用例。我們這裡收集了5個測試用例。分别了

  • test_mymath.py子產品裡的test_math_add函數。
  • test_mymath.py子產品裡的test_math3類下面的test_math_square、test_math_sub兩個函數。
  • test_mymath.py子產品裡的test_math2類下面的test_math_multipy函數。
  • test_logicOper.py子產品裡的test_logicOper_isGreaterThan函數。

(2)測試的運作順序。

從下圖列印輸出的結果可以看出。收集的測試用例的執行順序test_logicOper_isGreaterThan—>test_mymath(子產品).setup—>test_math2(類).test_math_multipy—>test_math3(類).setup—>test_math3(類).test_math_square—>

test_math3(類).teardown—>test_math3(類).setup—>test_math3(類).test_math_sub—>test_math3(類).teardown—>test_mymath(子產品).test_math_add—>test_mymath(子產品).teardown.

别再輕易說會自動化了,99%測試人還不會用nose進行自動化測試
大體可以得出如下結論:           
測試的順序總體上按照包—>子產品—>類的順序進行;然後按照測試用例名稱的升序排序進行,比如test_math_multipy比test_math_square先執行;當測試子產品中既包含測試函數,又包含測試類時,都一定是先執行setup(如果定義了),子產品測試執行完畢後執行teardown(如果定義了)。而且子產品的setup、setdown隻執行一次。測試類中的每個測試方法執行前先執行setup(如果定義了),執行完畢後執行teardown(如果定義了)。而且每個測試方法的執行過程都是如此,新的方法重新按setup—>執行方法—>teardown的順序執行。           

(3)關于setup 、teardown

package、module、class都可以設定setup、teardown。

  • package的setup 、teardown的設定

放在__init__.py檔案中,在整個測試的運作期間隻運作一次。

setup函數的取名可以是 setup, setup_package, setUp, setUpPackage中的一個。

teardown 函數取名可以是teardown, teardown_package, tearDown or tearDownPackage中的一個。

  • module的setup 、teardown的設定

在整個測試的運作期間隻運作一次。

setup函數的取名可以是 setup, setup_module, setUp or setUpModule中的一個。

teardown 函數取名可以是teardown_module, or tearDownModule中的一個。

  • class的setup 、teardown的設定

每個測試方法執行時都會調用。

setup函數的取名可以是setup_class, setupClass, setUpClass, setupAll ,setUpAll中的一個。

teardown 函數取名可以是teardown_class, teardownClass, tearDownClass, teardownAll ,tearDownAll中的一個。

測試類可以繼承unittest.TestCase ,也可以不繼承,nose都能識别。

  • 測試方法的setup、teardown

可以通過with_setup裝飾器進行設定,比如

别再輕易說會自動化了,99%測試人還不會用nose進行自動化測試

總之,nose的口号是:nose extends unittest to make testing easier(測試更簡單).

免費領取碼同學軟體測試課程筆記+超多學習資料+學習完整視訊,可以關注我們公衆号哦:自動化軟體測試

繼續閱讀