Ayrı Python birim testlerini geçici olarak devre dışı bırakın


128

unittestModülü Python'da kullanırken bireysel birim testleri nasıl geçici olarak devre dışı bırakılabilir ?

Yanıtlar:


230

Ayrı test yöntemleri veya sınıfları, unittest.skipdekoratör kullanılarak devre dışı bırakılabilir .

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Diğer seçenekler için, Testleri atlama ve beklenen hatalar için dokümanlara bakın .


9
Python 3'te, Akif'in aşağıdaki cevabı @unittest.SkipTestişe yarıyor ama işe @unittest.skip
yaramıyor

7
Python 3.6.1 kullanıyorum ve @unittest.skipaynı zamanda iyi çalışıyor.
Pete

2
Python 3.4.0'da @Pete @unittest.skipçalışmıyor.
lifebalance

Çocuk derslerinin atlanması nasıl engellenir?
reubenjohn

Ek açıklama yalnızca tek bir test yöntemine uygulanacaktır. Test yöntemlerine sahip bir ana sınıfınız olmasını mı planlıyorsunuz ve yalnızca bazı alt sınıflar yöntemi devre dışı mı bıraktı? Ebeveyn / çocuk sınıflarını uygun şekilde tasarlamanız gerekse de bunun mümkün olduğunu hayal ediyorum. Çözmeye çalıştığınız senaryoyu oyuncak bir örnekle açıklayabilir misiniz?
yoni

26

Dekoratörleri, işlevi sarmalayabilen ve googletest veya python birim testinin test senaryosunu çalıştırmasını engelleyen testi devre dışı bırakmak için kullanabilirsiniz.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Çıktı:

testFoo has been disabled

11

En son sürüm (2.7 - yayınlanmamış) bu şekilde testi atlama / devre dışı bırakmayı destekler . Bu modülü alıp mevcut Python kurulumunuzda kullanabilirsiniz. Muhtemelen işe yarayacak.

Bundan önce, istediğim için atlanır testleri adlandırmak için kullanılır xtest_testnamedan test_testname.


İşte bunu yapmak için hızlı bir elisp betiği. Benim elisp'im biraz paslanmış, bu yüzden sahip olduğu herhangi bir sorun için şimdiden özür dilerim. Test edilmemiş.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1, ancak çalıştığım tüm projede herkes python v2.6.2 kullanıyor ve bunun değişeceğini sanmıyorum: /, ama bu bir çözüm, teşekkürler
coelhudo

Bir test
senaryosunu

Ben de bir Emacs kullanıcısıyım, makro yaptınız mı?
coelhudo

Hayır! Sadece başarısız olmalarına izin verdim ama o kadar da zor değil. Cevabı hızlı bir şekilde güncelledim.
Noufal Ibrahim

Kabul edilen bu cevap bir cevap değil, sadece bir bağlantıdır. Gerçek, güncel cevap da en çok oylanan cevap değil. Kabul edildi, 4 yaşında. Sebepsiz elisp yalnızca gizler.
jwd630

10

@unittest.SkipTestDekoratörü testin üzerine yerleştirmek yeterlidir.


Kimin yaptığını bilmiyorum. Ancak belgeleri okuyordum ve SkipTest'in bir istisna olduğunu söylüyor. Her neyse, unitetest.skip'ten farklıdır, çünkü atlama testi hiçbir zaman yürütmez (devre dışı bırakılır), oysa SkipTest amacı, test yürütülürken beklenmeyen bir şey olursa ortaya çıkar. Haklı mıyım İlginç sert.
coelhudo

unittest.skip(sebepsiz) Python 2'de bana hata veriyor fakat Python 3'te
Akif

5

Sadece bir alt çizgi ile bir test durumu yöntemini yeniden adlandırıyorum: test_myfunc, _test_myfunc olur.


3

Docs 2.1 için bir görmezden veya atlama yöntemini belirtmez.

Genelde, gerektiğinde yorumu engellerim.


1

Sorunun "geçici olarak devre dışı bırakılan" kısmına odaklanıldığında, en iyi yanıt bir şekilde kullanım durumuna bağlıdır. Beni buraya getiren kullanım durumu, bir fonksiyon üzerinde test odaklı geliştirme yapıyorum. Bu süreçte, art arda testler yazıyorum ve hata ayıklama için işlevde sık sık kesme noktaları kullanıyorum. Test çalıştırıcısını her çalıştırdığımda tüm testleri çalıştırırsam, zaten çalışan testler için kırılma noktalarında dururum. Test adını veya benzeri bir şeyi "atla" veya munging eklemek istediğim şey değil çünkü işlevi yazmayı bitirdiğimde tüm testlerin çalışmasını istiyorum. "Atla" seçeneğini kullanırsam, geri dönüp "atlamayı geri almam" gerekir.

Benim kullanım durumum için çözüm, test kodunda değil test çalıştırıcısında yatıyor. Kullandığım pytest . Pytest ile komut satırından tek bir test belirlemek kolaydır:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(büyük harfleri değerlerinizle değiştirin).

Bu sorunun python-unitest için olduğunu anlıyorum. Bunu uzun zamandır kullanmadım. Pytest'e benzer bir şey olsa şaşırmam. Değilse, kolayca pytest'e geçebilirsiniz. Kodunuzu değiştirmenize gerek yoktur. Sadece kurun ve test çalıştırıcı komutunuzu değiştirin.

Ayrıca PyCharm Pro kullanıyorum. Test kodumu gösteren sayfada, her test için def'in yanında küçük bir simge var. Bu simgeye tıklayıp o testi tek tek çalıştırabilirim.

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.