Pytest kullanarak bir testi nasıl devre dışı bırakırım?


88

Diyelim ki bir sürü testim var:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

pytestSadece o testi çalıştırmasını önlemek için işlevlere ekleyebileceğim bir dekoratör veya benzeri bir şey var mı ? Sonuç şuna benzeyebilir ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Yanıtlar:


137

Pytest atlama vardır ve modül unittest Python benzer dekoratörler, (kullanımlara skipif skipve skipIfbelgelerde bulunabilir), burada .

Bağlantıdan örnekler burada bulunabilir:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

İlk örnek her zaman testi atlar, ikinci örnek testleri koşullu olarak atlamanıza izin verir (testler platforma, yürütülebilir sürüme veya isteğe bağlı kitaplıklara bağlı olduğunda harika.

Örneğin, birinin bir test için kütüphane pandalarının yüklü olup olmadığını kontrol etmek istersem.

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...

.skipMocha'nın (Node.js) sahip olduğu zarifliğe benzer bir şey var mı? it('tests something'...)-> it.skip('tests something'...)bu belirli testi devre dışı bırakır. Aynı zamanda kullanışlı bir zıttı da var: .onlysadece bu testi çalıştıracak, başka hiçbir şey yapmayacak.
Juha Untinen

Ben, için demek only: kesiminde, size deneme koşucu başlatıcısı için kullandığım komut satırından veya üzeri olduğunu yapabilir stackoverflow.com/a/36539692/4131059 gelince itve it.skipben burada işlevselliği tam o kapsar inanıyoruz.
Alexander Huszagh

21

skipDekoratör iş yapacağını:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(reason bağımsız değişken isteğe bağlıdır, ancak bir testin neden atlandığını belirtmek her zaman iyi bir fikirdir).

Ayrıca, skipif()belirli bir koşulun karşılanması durumunda bir testi devre dışı bırakmaya izin veren de vardır.


Bu dekoratörler yöntemlere, işlevlere veya sınıflara uygulanabilir.

To bir modülde tüm testleri atlamak , küresel tanımlamak pytestmarkdeğişkeni:

# test_module.py
pytestmark = pytest.mark.skipif(...)

10

Kullanımdan kaldırıldığından emin değilim, ancak pytest.skipişlevi bir testin içinde de kullanabilirsiniz :

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3

2
pytest yardımı için geldi, referans için kaldı
Uzebeckatrente

neye gönderme yapıyor. Bilmem gerek
XChikuX


Korkarım bu benim zamanımdan çok önceydi. Ama şimdi bildiğime sevindim.
XChikuX

6

Ayrıca, testin başarısız olacağından şüpheleniyor olsanız bile testi çalıştırmak isteyebilirsiniz. Böyle bir senaryo için https://docs.pytest.org/en/latest/skipping.html , dekoratör @ pytest.mark.xfail kullanılmasını önerir.

@pytest.mark.xfail
def test_function():
    ...

Bu durumda, Pytest yine de testinizi çalıştıracak ve geçip geçmediğini size bildirecek, ancak şikayet edip yapıyı bozmayacaktır.


2

Testi atlamak, ancak bir işaretçiyi sabit kodlamak istemiyorsanız, ondan kaçmak için anahtar kelime ifadesini daha iyi kullanın.

pytest test/test_script.py -k 'not test_func_one'

2

İçinde bir testi atlamak istediğinizde skipve skipifdekoratörlerle bir testi işaretleyebilirsiniz.pytest .

Bir testi atlamak

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

Bir testi atlamanın en basit yolu, skipisteğe bağlı olarak geçilebilecek dekoratörle işaretlemektir.reason .

pytest.skip(reason)Fonksiyonu çağırarak test yürütme veya kurulum sırasında zorunlu olarak atlamak da mümkündür . Bu, içe aktarma sırasında atlama koşulunu değerlendirmek mümkün olmadığında kullanışlıdır.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Bir koşula göre testi atlama

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Bir şarta göre atlamak istiyorsanız, o zaman kullanabilirsiniz skipif bunun yerine . Önceki örnekte, test işlevi Python3.6'dan önceki bir yorumlayıcıda çalıştırıldığında atlanır.

Son olarak, başarısız olduğundan emin olduğunuz için bir testi atlamak istiyorsanız, bir testin başarısız xfailolmasını beklediğinizi belirtmek için işaretleyiciyi kullanmayı da düşünebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.