Python unittest'te setUp () ve setUpClass () arasındaki fark nedir?


104

Python çerçevesindeki setUp()ve setUpClass()arasındaki fark nedir unittest? Kurulum neden bir yöntemde diğerine göre yapılsın?

Ben kurulum parçası yapılır anlamak istiyoruz setUp()ve setUpClass()birlikte yanı sıra, fonksiyonlar tearDown()ve tearDownClass().

Yanıtlar:


154

Sınıfınızda birden fazla test yönteminiz olduğunda fark kendini gösterir. setUpClassve tearDownClasstüm sınıf için bir kez çalıştırılır; setUpve tearDownher test yönteminden önce ve sonra çalıştırılır.

Örneğin:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

Bu testi çalıştırdığınızda, şunu yazdırır:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(Noktalar ( .) olan unittestbir test geçtiğinde öntanımlı çıkarılır.) Gözlemleyin setUpve tearDownönce ve sonra görünür test1 ve test2 buna, setUpClassve tearDownClasssadece bir kez görünür tüm test durumda başında ve sonunda,.


Siparişin bu olması gerekmez mi? : setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
Jai Sharma

Dikkat edin "." tearDown ve "" nin yokluğunun önünde. tearDownClass önünde
Jai Sharma

Ah, üzgünüm, bunu fark etmedim. Hayır, herhangi bir olay olmadan tamamlanana unittestkadar bir testi geçtiğini tearDowndüşünmez.
Benjamin Hodgson

Yani test1 ve test2 yöntemlerinin her biri kendi setUp & tearDown kümesine sahip olmalı, değil mi? Cevabınızda, test1'in herhangi bir tearDown yöntemi yoktur ve bu nedenle varsayılan çıktıyı (. İle) yazdırmış olmalıdır. Yanlışsam düzelt.
Jai Sharma

1
Cevaptaki çıktı doğru. Doğrudan unittest çıktısından yapıştırdım. setUpve tearDownher her bir kez çalıştırılır test(bu örnekte toplam böylece iki kez) yöntemiyle ancak setUpClassve tearDownClasssadece birer kez çalıştırılır.
Benjamin Hodgson

16

Python çerçevesindeki setUp()ve setUpClass()arasındaki fark nedir unittest?

Temel fark (Benjamin Hodgson'un yanıtında belirtildiği gibi), setUpClassyalnızca bir kez çağrılması ve bunun tüm testlerden önce, setUpher testten hemen önce çağrılmasıdır. (Not: Aynısı, yalnızca Python'un değil, diğer xUnit test çerçevelerindeki eşdeğer yöntemler için de geçerlidir unittest.)

Gönderen unittest belgeler :

setUpClass()

Tek bir sınıftaki testler çalıştırılmadan önce çağrılan bir sınıf yöntemi. setUpClass, sınıf tek bağımsız değişken olarak çağrılır ve bir sınıf yöntemi () olarak dekore edilmelidir:

@classmethod
def setUpClass(cls):
    ...

ve:

setUp()

Test fikstürünü hazırlamak için yöntem çağrıldı. Bu, test yöntemi çağrılmadan hemen önce çağrılır; AssertionError veya SkipTest dışında, bu yöntemle ortaya çıkan herhangi bir istisna, bir test başarısızlığından ziyade bir hata olarak değerlendirilecektir. Varsayılan uygulama hiçbir şey yapmaz.

Kurulum neden bir yöntemde diğerine göre yapılsın?

Sorunun bu kısmı henüz cevaplanmadı. Gearon tarafından verilen cevaba cevabımdaki yorumuma göre, setUpyöntem, tüm testlerde ortak olan fikstür unsurları içindir (bu kodu her testte tekrarlamaktan kaçınmak için). Yinelemenin kaldırılması (genellikle) okunabilirliği artırdığı ve bakım yükünü azalttığı için bunun genellikle yararlı olduğunu düşünüyorum.

setUpClassYöntem yerine yalnızca böyle, dosya sistemi üzerinde geçici bir dosya açılırken, bir veritabanı bağlantısı açma test için ortak kitaplığının yüklenmesi vb her test yavaşlayacağını önce böyle şeyler yapmak gibi bir kez yapmak zorunda kalacağını pahalı elemanlar içindir test paketi çok fazla, bu yüzden tüm testlerden önce sadece bir kez yapıyoruz. Bu, testlerin bağımsızlığındaki hafif bir bozulmadır, ancak bazı durumlarda gerekli bir optimizasyondur. Muhtemelen, birim testlerinde böyle şeyler yapılmamalıdır, çünkü genellikle gerçek şeyi kullanmadan veritabanı / dosya sistemi / kitaplık / her neyse alay etmek mümkündür. Bu nedenle, setUpClassbunun nadiren gerekli olduğunu görüyorum . Bununla birlikte, yukarıdaki örnekleri (veya benzerlerini) test etmek gerekli olduğunda yararlıdır.

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.