2012-06-06 41 views
5

Gömülü sistemler için python modellerini test etmek için pytest kullanıyorum. Test edilecek özellikler, platforma göre değişir. (Bu bağlamda, bir işletim sistemi türü değil, gömülü sistem tipi anlamına gelmek için 'platform' kullanıyorum).Pytest "varsayılan" işaretleyicileri destekliyor mu?

platformu türüne göre dizinlere onları ayırmaya olurdu benim testleri düzenlemenin en basit yolu. Bu hızla gibi birçok özellikleri desteklemek için zor oldu

/platform1 
/platform2 
/etc. 

pytest/PLATFORM1 platformlarda örtüşmektedir. Daha sonra testlerimi tek bir dizine taşıdım, her bir fonksiyonel alan için testler tek bir dosya adına (test_functionalityA.py) atandı. Daha sonra, bir dosyadaki hangi sınamaların belirli bir platforma uygulanacağını göstermek için pytest işaretçileri kullanıyorum. I would aşk otomatik platform türü algılayabilir ve sadece uygun testler 'conftest' olsun ederken

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

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

, komut satırından çalıştırmak için test belirterek kendimi bırakmıştım ettik.

pytest -m "(PLATFORM1 veya all_platforms)"

Soru: (! Nihayet)

şeyler basitleştirmek ve geçirilen varsayılan olarak tüm işaretlenmemiş testleri ve ayrıca tüm testler pytest için bir yolu var mı komut satırındaki '-m' ile mi? Örneğin

: Tüm testler @ pytest.mark ile pytest.mark.all_platforms hatta tüm testlerde @ işaretli olarak testler ediyorum pytest -m "PLATFORM1"

yanı @ pytest.mark.platform1 işaretlenmiş hiç?

Paylaşılan işlevlerin büyük miktarda verildiğinde, @ pytest.mark.all_platforms satırını bırakabilmek büyük bir yardımcı olacaktır.

cevap

8

Sorunun tamamını ele alalım. Ben testler ile birlikte bir conftest.py dosyası koyabilirsiniz düşünüyorum ve tüm eşleşen olmayan testleri (işaretli olmayan testler her zaman eşleşecek ve böylece asla atlanacak) atlamak için özen gösterecektir. Burada sys.platform kullanıyorum ama eminim platform değerinizi hesaplamak için farklı bir yol var.Bununla

# 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)) 

bu ::

# 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 

sevdiği testleri işaretleyebilir ve daha sonra birlikte :: ardından

$ py.test -rs 

çalıştırırsanız bunu çalıştırabilir ve en az iki göreceksiniz Test atlandı ve her zaman en az bir test yürütüldü:

Daha sonra iki test atlama göreceksiniz ed ve beklendiği gibi iki infaz testler :: Bu :: gibi işaretleyici-komut satırı seçeneği üzerinden bir platform belirtirseniz

$ 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 ================== 

sonra işaretlenmemiş-testleri çalıştırmak olmayacak

$ 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 ==================== 

Not . Bu nedenle koşuyu belirli testlere sınırlamak için bir yoldur.

+0

Bir çekicilik gibi çalıştım. Teşekkürler Holger. –

+0

sadece diğerlerinin bildiği gibi, bu cevabın kaynağı https://pytest.org/latest/example/markers.html#marking-platform-specific-tests-with-pytest adresinden daha fazla örnek bulabilir. –