2012-06-06 98 views
5

我正在使用pytest來測試嵌入式系統的python模型。要測試的功能因平臺而異。 (我在此上下文中使用「平臺」來表示嵌入式系統類型,而不是操作系統類型)。pytest是否支持「默認」標記?

組織我的測試最直接的方法是將它們分配到基於平臺類型的目錄。

/platform1 
/platform2 
/etc. 

pytest/PLATFORM1

這迅速成爲難以支持儘可能多的功能,跨平臺重疊。之後我將測試移到了一個目錄中,每個功能區域的測試分配給一個文件名(例如test_functionalityA.py)。 然後,我使用pytest標記來指示文件中的哪些測試適用於給定的平臺。

@pytest.mark.all_platforms 
def test_some_functionalityA1(): 
    ... 

@pytest.mark.platform1 
@pytest.mark.platform2 
def test_some_functionlityA2(): 
    ... 

雖然我得到「conftest」自動檢測平臺類型,僅運行相應的測試,我已經辭職自己指定它測試在命令行上運行。

pytest -m「(PLATFORM1或all_platforms)」

的問題:(!終於)

有沒有辦法把事情簡單化,並有pytest運行在默認情況下通過了所有無人盯防的測試,此外,所有測試通過'-m'在命令行?

例如: pytest -m 「PLATFORM1」

將運行測試標誌着@ pytest.mark.platform1以及所有測試標誌着@ pytest.mark.all_platforms甚至所有的測試,沒有@ pytest.mark在所有?

由於有大量的共享功能,能夠降@ pytest.mark.all_platforms線將是一個很大的幫助。

回答

8

讓我們來解決完整的問題。我認爲你可以把一個conftest.py文件和你的測試一起使用,它會小心地跳過所有不匹配的測試(未標記的測試總是匹配,因此永遠不會跳過)。我在這裏使用sys.platform,但我相信你有不同的方式來計算你的平臺價值。

# content of conftest.py 
# 
import sys 
import pytest 

ALL = set("osx linux2 win32".split()) 

def pytest_runtest_setup(item): 
    if isinstance(item, item.Function): 
     plat = sys.platform 
     if not hasattr(item.obj, plat): 
      if ALL.intersection(set(item.obj.__dict__)): 
       pytest.skip("cannot run on platform %s" %(plat)) 

有了這個,你可以標記你的測試這樣的:

# content of test_plat.py 

import pytest 

@pytest.mark.osx 
def test_if_apple_is_evil(): 
    pass 

@pytest.mark.linux2 
def test_if_linux_works(): 
    pass 

@pytest.mark.win32 
def test_if_win32_crashes(): 
    pass 

def test_runs_everywhere_yay(): 
    pass 

,如果你用::

$ py.test -rs 

然後運行就可以運行它,會看到至少兩個測試跳過並始終 至少執行一次測試::

然後您會看到兩個測試skipp ED和認爲的兩個執行的測試::

$ py.test -rs # this option reports skip reasons 
=========================== test session starts ============================ 
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 
collecting ... collected 4 items 

test_plat.py s.s. 
========================= short test summary info ========================== 
SKIP [2] /home/hpk/tmp/doc-exec-222/conftest.py:12: cannot run on platform linux2 

=================== 2 passed, 2 skipped in 0.01 seconds ==================== 

請注意,如果您通過這樣的:標記的命令行選項來指定一個平臺

$ py.test -m linux2 
=========================== test session starts ============================ 
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1 
collecting ... collected 4 items 

test_plat.py . 

=================== 3 tests deselected by "-m 'linux2'" ==================== 
================== 1 passed, 3 deselected in 0.01 seconds ================== 

則無人盯防的測試將不會運行。因此這是一種限制運行到特定測試的方法。

+0

工作就像一個魅力。謝謝Holger。 –

+0

只是讓其他人知道,這個答案的來源是從https://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytest你可以找到更多的例子。 –