Birkaç test için Unittest setUp / tearDown


119

Bir test senaryosunun başında / sonunda çalıştırılan bir işlev var mı? SetUp ve tearDown işlevleri her testten önce / sonra çalıştırılır.

Genelde şuna sahip olmak isterim:

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

Şimdilik, bu setUp ve tearDown birim testleri ve tüm senaryolarımda (birçok test içeren) yayıldı, biri ilk test, diğeri son test.


6
Hangi versiyon? Unittest modülü Python 2.7'de module_setup ve module_teardown'u içerecek şekilde genişletilmiştir.
S.Lott

3
2.7 ayrıca setUpClass () ve tearDownClass () classmethods'larını tanıttı, bu da aynı dosyada kendi paket başına kurulumları ve sökümleriyle birkaç sınıfa sahip olmanıza izin veriyordu.
Per Fagrell

Yanıtlar:


132

(Başına 2.7 olarak dokümantasyon ) almak setUpClassve tearDownClasssırasıyla çalıştırılmadan önce ve belirli bir sınıfta testlerden sonra çalıştırılma. Alternatif olarak, bir dosyada bir grubunuz varsa, setUpModuleve tearDownModule( dokümantasyon ) kullanabilirsiniz.

Aksi takdirde, en iyi bahsiniz muhtemelen kendi türetilmiş TestSuite'inizi oluşturmak ve geçersiz kılmak olacaktır run(). Diğer tüm çağrılar ebeveyn tarafından ele alınacak ve çalıştırma, kurulum ve sökme kodunuzu ebeveynin runyöntemine kadar bir çağrı etrafında çağıracaktır .


72

Aynı senaryoya sahibim, benim için setUpClass ve tearDownClass yöntemleri mükemmel çalışıyor

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()

6
Bu, doğru bir örnek gösterdiğinden kabul edilen cevap olarak güncellenmelidir ve bu işlevler, kabul edilen cevapta bahsedilmeyen, çalışmak için sınıf yöntemleri OLMALIDIR.
NuclearPeon

1

Python 2.5 için ve pydev ile çalışırken biraz zor. Görünüşe göre pydev test paketini kullanmıyor, ancak tüm test senaryolarını bulup hepsini ayrı ayrı çalıştırıyor.

Bunun için benim çözümüm şuna benzer bir sınıf değişkeni kullanmaktı:

class TestCase(unittest.TestCase):
    runCount = 0

    def setUpClass(self):
        pass # overridden in actual testcases

    def run(self, result=None):
        if type(self).runCount == 0:
            self.setUpClass()

        super(TestCase, self).run(result)
        type(self).runCount += 1

Bu numara ile, bundan miras aldığınızda TestCase(orijinal yerine unittest.TestCase), runCount0 değerini de miras alırsınız . Daha sonra, çalıştırma yönteminde, runCountalt test senaryosu kontrol edilir ve artırılır. Bu runCount, bu sınıfın değişkenini 0'da bırakır .

Bu, setUpClasssınıf başına yalnızca bir kez çalıştırılacağı ve örnek başına bir kez çalıştırılmayacağı anlamına gelir .

tearDownClassHenüz bir yöntemim yok, ancak bu sayacı kullanarak bir şeyler yapılabileceğini tahmin ediyorum.


0

İşte bir örnek: 3 test yöntemi, test başına değil, bir kez oluşturulan paylaşılan bir kaynağa erişir.

import unittest
import random

class TestSimulateLogistics(unittest.TestCase):

    shared_resource = None

    @classmethod
    def setUpClass(cls):
        cls.shared_resource = random.randint(1, 100)

    @classmethod
    def tearDownClass(cls):
        cls.shared_resource = None

    def test_1(self):
        print('test 1:', self.shared_resource)

    def test_2(self):
        print('test 2:', self.shared_resource)

    def test_3(self):
        print('test 3:', self.shared_resource)
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.